权限控制,Apache Shiro

权限控制,Apache Shiro
主流两种方式: 粗粒度的基于URL级别的权限控制. 细粒度的基于方法级别权限控制

数据表:
   用户   m:n   角色   m:n   权限   m:n   菜单(用来实现不同登录用户展示的菜单不同)
   

用户表为什么不和权限表直接关联,而是出现了一个角色表?
   如果权限很多,每次给对应的用户进行权限分配是一个很浪费效率的工作,可以将权限提前绑定到角色表中,
每次分配权限的时候只需要将对应的角色分配给用户,大大的提高权限分配的工作效率。 


粗粒度基于url的权限控制
   基于Filter完成
细粒度基于方法的权限控制
   基于动态代理和自定义注解完成
   
apache shiro 的应用安全四要素,一个保护应用的API:
Authentication 认证
Authorization  授权
Cryptography   数据加密
Session Management 会话管理
   
shiro权限控制的方式
   1. 基于代码编写实现(硬编码) 不讲
   2. URL实现权限控制
   3. 基于方法权限控制
   4. 页面自定义标签权限控制
   
执行流程
   Application code ---> Subject ---> seucurityManage---> Realm

shiro 完成基于URL的权限控制步骤:
   1. 在web.xml中配置代理过滤器DelegationgFilterProxy,class-name为shiroFilter
   2. 在applicationContext.xml配置bean,id为shiroFilter,这个才是真正的过滤器,class为ShiroFilterFactoryBean
   3. 上面的bean中需要注入安全管理器securityManagement,未认证的跳转页面,登录成功跳转的页面,认证后,权限不足跳转页面
      shiro URL控制过滤器规则filterChainDefinitions:
      anon未登录可以访问 
      authc登陆后才能访问
      perms指定访问某一资源需要的权限
      roles指定访问某一资源需要的角色
   4. 创建一个安全管理器 : securityManagement的bean,class="DefaultWebSecurityManager"
      需要注入一个realm,在代码中创建并注册一个realm类。
   5. 创建生命周期,用来初始化一些参数
   
登录认证的步骤:
   1. 前台发送登录数据和请求
   2. 创建action接收,创建subject对象:
      Subject subject = securityUtils.getSubject();
      subject.login(new UsernamePasswordToken(modle.getUsername,model.getPassword));
   3. 创建Realm类继承AuthorizingRealm,实现其认证和授权两个方法,并加入注解@Server 并交由spring管理
      认证方法
         AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){
            UsernamePasswordToken tok = (UsernamePasswordToken)token;
            // 根据用户用去数据库查询用户对象
            User user = UserService.findByUsername(tok.getUsername());
            if(user == null){
               // 如果返回的用户为null,表示没有查询到用户,直接返回null即可
               return null;
            }else {
               // 如果查询到用户,返回对应的对象,将查询到的用户的password交给securityManager进行认证
               return  new SimpleAuthenticationInfo(user, user.getPassword, getName());
            }
            
         }
      授权方法
      
          AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc){
             // 创建一个返回的对象
               SimpleAuthorizationInfo  authorizationInfo = new SimpleAuthorizationInfo();
            //1. 得到当前的用户
               Subject subject = SecurityUtils.getSubject();
               User user = (User)subject.getPrincipal();
               
            //2. 根据当前用户查询对应的角色和权限
               from Role r inner join fetch r.users u where u.id = ?返回List
               
               from Permission p inner join fetch p.roles r inner join fetch r.users u where u.id = ? 返回List
               
            //3. 将对应的角色和权限交给shiro
               for(Role role:roles){
                  authorizationInfo.addRole(role)
               }
               for(Permission permission:Permissions){
                  authorizationInfo.addStringPermission(permission)
               }
            //4. 返回指定的对象
            return authorizationInfo;
            
         }  
      

   
shiro 完成基于方法的权限控制步骤:
   1. 在方法上添加注解:
      @RequiresPermissions(权限)
      @RequiresRoles(角色)
      
   2. 在applicationContext.xml中配置spring aop对spring管理bean对象开启shiro注解支持
   3. 需要设置使用CGLIB代理,
   
shiro 实现页面元素的显示控制:
   引入标签库 <%@taglib uri="" profix="" %>

代码侵入式的权限判断
   使用java代码做if-else的判断是否具有权限。

   
权限设置风格  :
例如:
courier
   courier:add courier:delete courier:update courier:list
courier 是其他四个权限的父权限,所有设置为courier权限之后,就会具有其他四个权限。

了解shiro权限控制的流程,不用shiro提供的注解,使用自定义注解完成







   
   
   
   
   
   

你可能感兴趣的:(权限控制,Apache Shiro)