zoukankan      html  css  js  c++  java
  • Shiro-权限认证(授权)-编程式授权

    权限认证

    权限认证也就是访问控制,即在应用中控制谁能访问哪些资源

    权限认证核心要素

    • 权限 : 即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利
    • 角色 : 是权限的集合,一种角色可以包含多种权限
    • 用户 : 在 Shiro 中,代表访问系统的用户,即Subject

    授权方式

    • 编程式授权
      • 基于角色的访问控制
      • 基于权限的访问控制
    • 注解式授权
    • Jsp 标签授权

    编程式授权实现

    抽取公共代码生成 ShiroUtil

    package com.zhen.common;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    public class ShiroUtil {
    
        public static Subject login(String configFile,String userName,String password){
            //读取配置文件,初始化SecurityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
            //获取securityManager实例
            SecurityManager securityManager = factory.getInstance();
            //把securityManager绑定到SecurityUtils
            SecurityUtils.setSecurityManager(securityManager);
            //获取当前用户
            Subject currentUser = SecurityUtils.getSubject();
            //创建token令牌,用户名/密码
            UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
            try {
                //身份认证
                currentUser.login(token);
                System.out.println("身份认证成功!");
            } catch (AuthenticationException e) {
                e.printStackTrace();
                System.out.println("身份认证失败!");
            }
            
            return currentUser;
        }
        
    }
    

      

    基于角色的访问控制
    • 新建 shiro_role.ini文件,两个用户,两种角色
      [users]
      zhen=123,role1,role2
      jack=jack,role1
    • 新建测试类
      package com.zhen.shiro;
      
      import java.util.ArrayList;
      import java.util.List;
      import org.apache.shiro.subject.Subject;
      import org.junit.Test;
      import com.zhen.common.ShiroUtil;
      import junit.framework.TestCase;
      
      //基于角色的
      public class RoleTest extends TestCase {
          
          @Test
          public void testHasRole(){
              String configFile = "classpath:shiro_role.ini";
              String userName = "jack";
              String password = "jack";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              if (currentUser.hasRole("role2")) {
                  System.out.println(userName+"有 role2 权限");
              }else{
                  System.out.println(userName+"没有 role2 权限");
              }
              currentUser.logout();
          }
          
          @Test
          public void testHasRoles(){
              String configFile = "classpath:shiro_role.ini";
              String userName = "jack";
              String password = "jack";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              List<String> roles = new ArrayList<String>();
              roles.add("role1");
              roles.add("role2");
              
              //返回一个boolean数组
              boolean[] results = currentUser.hasRoles(roles);
              for (int i = 0; i < results.length; i++) {
                  if(results[i]){
                      System.out.println(userName+"有 "+roles.get(i)+" 权限");
                  }else{
                      System.out.println(userName+"没有 "+roles.get(i)+" 权限");
                  }
              }
              currentUser.logout();
          }
          
          @Test
          public void testHasAllRoles(){
              String configFile = "classpath:shiro_role.ini";
              String userName = "zhen";
              String password = "123";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              List<String> roles = new ArrayList<String>();
              roles.add("role1");
              roles.add("role2");
              
              //是否拥有所有权限
              boolean result = currentUser.hasAllRoles(roles);
              if(result){
                  System.out.println(userName+"有 所有权限");
              }else{
                  System.out.println(userName+"没有 所有权限");
              }
              currentUser.logout();
          }
          
          @Test
          public void testCheckRoles(){
              //check 没有返回值,没有该权限的话就会抛异常
              String configFile = "classpath:shiro_role.ini";
              String userName = "jack";
              String password = "jack";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              List<String> roles = new ArrayList<String>();
              roles.add("role1");
              roles.add("role2");
              currentUser.checkRole(roles.get(1));
              currentUser.logout();
          }
          
      }
    基于权限的访问控制
    • 新建 Shiro_permission.ini文件,内容如下:
      [users]
      zhen=123,role1,role2
      jack=jack,role1
      [roles]
      role1=user:select
      role2=user:add,user:update,user:delete

      role1 对应有 user:select 权限
      role2 对应有 user:add , user:update , user:delete 权限

    • 新建测试类,代码如下:
      package com.zhen.shiro;
      
      import org.apache.shiro.subject.Subject;
      import org.junit.Test;
      
      import com.zhen.common.ShiroUtil;
      
      import junit.framework.TestCase;
      
      //基于权限的
      public class PermissionTest extends TestCase {
          
          @Test
          public void testIsPermission(){
              String configFile = "classpath:shiro_permission.ini";
              String userName = "zhen";
              String password = "123";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              System.out.println(currentUser.isPermitted("user:add")?"有add权限":"没有add权限"); 
              System.out.println(currentUser.isPermitted("user:select")?"有select权限":"没有select权限");
              boolean[] results = currentUser.isPermitted("user:add","user:select");
              System.out.println(results[0]?"有add权限":"没有add权限");
              System.out.println(results[1]?"有select权限":"没有select权限");
              System.out.println(currentUser.isPermittedAll("user:add","user:select")?"有user:add&user:select权限":"user:add&user:select权限不全有");
              currentUser.logout();
          }
          
          @Test
          public void testCheckPermission(){
              String configFile = "classpath:shiro_permission.ini";
              String userName = "zhen";
              String password = "123";
              Subject currentUser = ShiroUtil.login(configFile, userName, password);
              currentUser.checkPermission("user:add"); 
              currentUser.checkPermission("user:select");
              currentUser.checkPermissions("user:add","user:select");
              currentUser.logout();
          }
          
      }
      

        

  • 相关阅读:
    Mybatis-generator 逆向工程 自定义PO,xml,mapper,example
    Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之DataStreamer(Packet发送) : 处理异常
    Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览
    Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之DataStreamer(Packet发送) : 流水线架设 : 创建块
    Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之ResponseProcessor(ACK接收)
    Hadoop3.1.1源码Client详解 : Packet入队后消息系统运作之DataStreamer(Packet发送) : 流水线架设 : 流水线恢复/append
    Hadoop3.1.1源码Client详解 : 入队前数据写入
    Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立
    Hadoop架构: 关于Recovery (Lease Recovery , Block Recovery, PipeLine Recovery)
    Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/6595159.html
Copyright © 2011-2022 走看看