zoukankan      html  css  js  c++  java
  • Shiro笔记(五)Shiro授权

    Shiro授权

      也叫访问控制,即在应用中控制谁能访问那些资源(如访问页面、编辑数据、页面操作等)。在授权中需要了解几个关键对象:主体(subject)、资源(resource)、权限(Permission)、角色(Role)。

    Shiro授权需要了解的几个对象:

      主体:访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才能允许访问响应的资源。

      资源:在应用中用户可以访问的URL,比如JSP页面,查看/编辑某些数据,访问某个业务方法,打印文本等都是资源,只有经过用户授权后才可以访问。

      权限:安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面的查看/新增/修改/删除用户数据(即很多时候都是CRUD式权限控制)等。权限代表用户有没有操作某个资源的权利,即反应某个资源上的操作是否被允许。

      角色:权限的集合,一般情况下会赋予用户 角色而不是权限,这样用户可以拥有一组权限,赋予权限的时候比较方便,典型的如:项目经理、技术总监、CTO、开发工程师都是角色,不同的角色有一组不同的权限。

      Shiro支持操作用户模块的所有权限或操作某个用户的权限。

    授权流程

      1.在Spring-shiro.xml中的页面配置上,给想要授权的页面添加访问许可,如给user.jsp和admin.jsp添加权限,user.jsp只能拥有user角色才能访问,而admin.jsp只能拥有admin角色才能访问,则过滤器配置如下:

        /user.jsp = roles[user]  
        /admin.jsp = roles[admin]
    

      或在Controller中给某个方法添加注解的方式,如上述给user.jsp页面添加权限,则在get请求上放添加@RequiresPermissions(value={"roles[user]"})注解即可。

      这样当我们登录成功后再想访问上述页面发现已经没有权限了!

      2.在配置好过滤器后,授权需要实现AuthorizingRealm类中的doGetAuthorizationInfo方法,因为AuthorizingRealm继承AuthenticatingRealm,但并没有实现AuthorizingRealm类中的doGetAuthorizationInfo方法,所以 ,我们在做认证和授权的时候只需要继承AuthorizingRealm就可以了,同时实现两个抽象方法:认证(doGetAuthenticationInfo)、授权(doGetAuthorizationInfo)即可。

      在进行多Realm认证的时候,调用的是ModularRealmAuthorizer,实际上还是走的AuthorizingRealm中的doGetAuthorizationInfo方法。

      3.之前在做认证的时候,我们继承的是认证Realm(AuthenticatingRealm),现在让它继承(AuthorizingRealm),并同时实现两个抽象类。

    授权调用

      4.在doGetAuthorizationInfo方法中实现授权的过程

        1.从principalCollection中获取登录用户的信息(principal对象)。

    	     Principal principal = (Principal) getAvailablePrincipal(principals);	
      	     String loginName = principal.getName();
    

        2.利用登录的用户信息来获取当前用户的角色或权限(缓存中查询或者数据库中)。

    		// 把角色信息查出来
    		List<Role> roles = UserUtils.getRolesByIds(user.getRoleIds(),  user.getId());
    

        3.创建SimpleAuthorizationInfo对象,并设置roles属性,将info对象返回。

          SysUser user = UserUtils.getByLoginName(loginName);
    		if (user != null) {
    			
    			SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    			// 把角色信息查出来
    			List<Role> roles = UserUtils.getRolesByIds(user.getRoleIds(),  user.getId());
    			// 遍历他所拥有的角色
    			for (int i = 0; i < roles.size(); i++) {
    				
    				Role ro = roles.get(i);
    				
    				info.addRole(ro.getRole());
    				// 通过ResourceIds获取对应的权限信息
    				List<Resource> sresources = UserUtils.getPermissionByIds(ro.getResourceIds(), user.getId());
    			
    				for (int j = 0; j < sresources.size(); j++) {
    					
    					Resource re = sresources.get(j);
    					//给info对象设置角色
    					info.addStringPermission(re.getPermission());
    				}
    			}
    			
    			return info;
    			
    		}
  • 相关阅读:
    sqlplus时报Linux-x86_64 Error: 13: Permission denied
    thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 合并石子
  • 原文地址:https://www.cnblogs.com/esileme/p/7476129.html
Copyright © 2011-2022 走看看