发表于: 2020-09-25 23:06:10
1 1407
今天完成的事:
了解权限模型。
shiro入门。
权限模型分为两种:
基于角色访问控制
RBAC(role based access control),基于角色的访问控制。
//如果该user是部门经理则可以访问if中的代码
if(user.hasRole('部门经理')){
//系统资源内容
//用户报表查看
}
角色针对人划分的,人作为用户在系统中属于活动内容,如果该 角色可以访问的资源出现变更,需要修改你的代码了,
if(user.hasRole('部门经理') || user.hasRole('总经理') )
//系统资源内容
//用户报表查看
}
}
基于角色的访问控制是不利于系统维护(可扩展性不强)。
基于资源的访问控制
RBAC(Resource based access control),基于资源的访问控制。
资源在系统中是不变的,比如资源有:类中的方法,页面中的按钮。
对资源的访问需要具有permission权限,代码可以写为:
//对资源的访问需要具有permission权限,代码可以写为:
if(user.hasPermission('用户报表查看(权限标识符)'))
{
//系统资源内容
//用户报表查看
}
建议使用基于资源的访问控制实现权限管理。
为什么使用Shiro
我们在使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护。
而我们的Shiro实现系统的权限管理,有效提高开发效率,从而降低开发成本。
shiro的核心
从这个意义上说, Realm 本质上是一个特定于安全的领域。Dao它封装数据源的连接细节,并根据需要将相关数据提供给Shiro。配置Shiro时,必须指定至少一个用于身份验证和/或授权的域。这个SecurityManager可以配置多个领域,但至少需要一个。
Shiro提供开箱即用的Realm连接到许多安全数据源(也称为目录),如LDAP、关系数据库(JDBC)、INI和属性文件等文本配置源,等等。如果默认的Realm不能满足您的需要,您可以插入自己的领域实现来表示自定义数据源。
和其他内部部件一样,ShiroSecurityManager管理如何使用Realms获取安全和身份数据,以便表示为Subject实例。
Shiro总的架构:
subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。
securityManager:安全管理器,主体进行认证和授权都 是通过securityManager进行。
authenticator:认证器,主体进行认证最终通过authenticator进行的。
authorizer:授权器,主体进行授权最终通过authorizer进行的。
sessionManager:web应用中一般是用web容器对session进行管理,shiro也提供一套session管理的方式。
SessionDao: 通过SessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao。
cache Manager:缓存管理器,主要对session和授权数据进行缓存,比如将授权数据通过cacheManager进行缓存管理,和ehcache整合对缓存数据进行管理。
realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据。
cryptography:密码管理,提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。
code:
自定义UserRealm:
public class UserRealm extends AuthorizingRealm {
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了----》授权");
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了---->认证");
return null;
}
}
配置类配置好SecurityManager
@Configuration
public class ShiroConfig {
//创建shiroFilterBean.3
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro的内置过滤器:
/*
1.anon:无需认证即可访问。
2.authc:必须需要认证才能访问。
3.user:必须拥有记住我才能访问。
4.perms:拥有对某个资源的权限才能访问。
5.role:拥有某个权限才能访问。
*/
Map<String,String> filterMap=new LinkedHashMap<>();
filterMap.put("/add","authc");
filterMap.put("/update","authc");
bean.setLoginUrl("/login");
bean.setFilterChainDefinitionMap(filterMap);
return bean;
}
//创建DefaultWebSecurityManager对象,2
@Bean(name="securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
//关联UserRealm
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
//创建Realm对象,需要自定义类1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
}
测试:
点击update
拦截成功。
明天的计划:
shiro整合mybatis。
遇到的问题:null
收获:
shiro的简单使用。
评论