• shiro基础学习(三)—shiro授权


    一、入门程序

    1.授权流程

         image

    2.授权的三种方式

    (1)编程式: 通过写if/else 授权代码块完成。

    Subject subject = SecurityUtils.getSubject();

    if(subject.hasRole("admin")) {

         //有权限

    } else {

         //无权限

    }

    (2)注解式: 通过在执行的Java方法上放置相应的注解完成。

    @RequiresRoles("admin")

    public void hello() {

         //有权限

    }

    (3)JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成。

    <shiro:hasRole name="admin">

         <!— 有权限—>

    </shiro:hasRole>

    3.ini文件

    shiro-permission.ini

    image

         在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

         权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

    例子:

    用户创建权限: user:create,或user:create:*

    用户修改实例001的权限: user:update:001

    用户实例001的所有权限: user:*:001

    4.测试代码

    /*
     * 授权的测试
     */
    public class AuthorzationTest{
    
    	//角色授权、资源授权测试
    	
    	@Test
    	public void testAuthorzation(){
    		//创建SecurityManager工厂
    		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");
    		
    		//创建SecurityManager
    		SecurityManager securityManager = factory.getInstance();
    		
    		//将SecurityManager设置到系统环境
    		SecurityUtils.setSecurityManager(securityManager);
    		
    		//创建Subject
    		Subject subject = SecurityUtils.getSubject();
    
    		//创建token令牌
    		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
    		
    		//执行认证
    		try{
    			subject.login(token);
    		}catch(AuthenticationException e){
    			e.printStackTrace();
    		}
    		
    		System.out.println("是否认认证通过: " + subject.isAuthenticated());
    		
    		
    		//基于角色的授权(角色标识)
    		boolean hasRole = subject.hasRole("role3");
    		System.out.println("基于角色的授权: " + hasRole);
    		
    		//基于资源的授权(权限标识符)
    		boolean permitted = subject.isPermitted("user:create");
    		System.out.println("基于资源的授权: " + permitted);
    	}
    	
    }

    结果:

           是否认认证通过: true
           基于角色的授权: false
           基于资源的授权: true

    二、自定义Realm

    1.shiro-realm.ini

         在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。

         image

    2.实现代码

    /*
     * 自定义Realm
     */
    public class CustomRealm extends AuthorizingRealm{
    
    	
    	//设置Realm名称
    	@Override
    	public void setName(String name){
    		super.setName("customRealm");
    	}
    
    	//用于认证
    	@Override
    	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{
    		
    		//1.从token取出用户身份信息
    		String userCode = (String)token.getPrincipal();
    		
    		//2.根据用户userCode查询数据库
    		//模拟从数据库查询到的密码
    		String password = "123";
    		
    		//3.查询到返回认证信息
    		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userCode,password,this.getName());
    		
    		return info;
    	}
    
    	//用于授权
    	@Override
    	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
    		
    		//获取主身份信息
    		 String userCode = (String)principals.getPrimaryPrincipal();
    		 
    		 //根据身份信息获取权限信息
    		 //模拟从数据库获取到数据
    		 List<String> permissions = new ArrayList<String>();
    		 permissions.add("user:create"); //用户的创建权限
    		 permissions.add("items:add"); //商品的添加权限
    		 
    		 //将查询到授权信息填充到对象中
    		 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    		 info.addStringPermissions(permissions);
    		 
    		return info;
    	}
    }

    3.测试代码

    	@Test
    	public void testCusRealm(){
    		//创建SecurityManager工厂
    		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
    		
    		//创建SecurityManager
    		SecurityManager securityManager = factory.getInstance();
    		
    		//将SecurityManager设置到系统环境
    		SecurityUtils.setSecurityManager(securityManager);
    		
    		//创建Subject
    		Subject subject = SecurityUtils.getSubject();
    		
    		//创建token令牌
    		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123");
    		
    		//执行认证
    		try{
    			subject.login(token);
    		}catch(AuthenticationException e){
    			e.printStackTrace();
    		}
    		
    		System.out.println("是否认认证通过: " + subject.isAuthenticated());
    		
    		
    		//基于资源的授权(权限标识符)
    		boolean permitted = subject.isPermitted("user:create");
    		System.out.println("基于资源的授权: " + permitted);
    	}
  • 相关阅读:
    mac OSX 上 brew install hive
    mac osx 系统 brew install hadoop 安装指南
    python在windows平台的pip安装package时的编译问题
    安装scapy遇到的问题
    node中使用domain处理异步异常问题
    web开发中的 emmet 效率提升工具
    未来10年房地产存量与人口需求量分析
    Apple individual program 加入之后的玩法 官方资源
    nginx 反向代理 与 Apache backend的配置联合配置
    ubuntu 休眠之后网络间接失败 can not connect to network after suspend (wake up)
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5714768.html
Copyright © 2020-2023  润新知