Shiro之授权

客官°小女子只卖身不卖艺 2022-05-21 10:29 350阅读 0赞

Shiro中授权功能通过继承AuthorizingRealm实现类或实现Realm接口,实现doGetAuthorizationInfo抽象方法来实现授权功能。

AuthorizingRealmAuthenticatingRealm间关系如图:

70

从上图可知,AuthorizingRealmAuthenticatingRealm的子类,且他们都为CachingRealm的子类。而CachingRealm实现了Realm接口。

从图中得出结论,授权实际是扩展了认证。

授权实现示例代码:

  1. //实现`doGetAuthorizationInfo`抽象方法
  2. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  3. /** * the primary principal used to uniquely identify the owning account/Subject */
  4. Object primaryPrincipal = principals.getPrimaryPrincipal();
  5. //权限集合
  6. Set<String> roles = new HashSet<>();
  7. //判断当前登录用户名
  8. if("admin".equals(primaryPrincipal)) {
  9. //如果当前用户登录的是"admin",则拥有访问user的权限
  10. roles.add("user");
  11. }
  12. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(roles);
  13. return simpleAuthorizationInfo;
  14. }

doGetAuthorizationInfo返回的AuthorizationInfo会被shiro通过调用ModularRealmAuthorizerAuthorizingRealmhasRole方法进行权限校验。

通常: 权限并非是定死的,而是从数据库中查询获取到的。所以可以通过工厂类的工厂方法,通过修改ShiroFilterFactoryBeanfilterChainDefinitionMap属性来从数据库中查询出权限。

配置文件:

  1. <!-- shiro权限过滤:id要和web.xml中的ShiroFilter的filter-name一致[默认情况下, 如果不一致,spring会在filer的init-param中的targetBeanName配置参数中获取到对应的bean名称, 如果没有在容器中配置该bean,则会抛出NoSuchBeanDefinitionException异常] -->
  2. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  3. <property name="securityManager" ref="securityManager" />
  4. <!-- 登录页面 -->
  5. <property name="loginUrl" value="/login.jsp" />
  6. <!-- 登录成功页面 -->
  7. <property name="successUrl" value="/success.jsp" />
  8. <!-- 无权限页面 -->
  9. <property name="unauthorizedUrl" value="/unauthorized.jsp" />
  10. <!-- Shiro会通过Web.xml中的ShiroFilter过滤器调用该 id为shiroFilter的Bean,然后通过该Bean的property name为filterChainDefinitions中设置的value来 判断页面是否需要验证授权才能访问。 默认情况下,没有配置到value中的路径shiro不会拦截,而路径被标识为anon的则为 可以通过匿名访问[也就是可以直接访问],标识为authc则为需要授权才能访问的页面。 -->
  11. <!-- <property name="filterChainDefinitions"> <value> anon:表示可以匿名访问 = anon /user.jsp = roles[user] /shiroRequest/login = anon /shiro/logout = logout authc:表示需要授权才可以访问 /** = authc </value> </property> -->
  12. <property name="filterChainDefinitionMap" ref="filterChainDefinition"></property>
  13. </bean>
  14. <bean id="filterChainDefinition" factory-bean="filterChainDefinitionBuilder" factory-method="FilterChainFactoryBeanBuilder"></bean>
  15. <bean id="filterChainDefinitionBuilder" class="com.heiketu.shiro.factorybean.FilterChainDefinitionFactory"></bean>

示例工厂类filterChainDefinitionBuilder

  1. /** * Shiro过滤链工厂类 * @author zhengjie * */
  2. public class FilterChainDefinitionFactory {
  3. /** * FilterChainFactoryBeanBuilder */
  4. public LinkedHashMap<String, String> FilterChainFactoryBeanBuilder(){
  5. LinkedHashMap<String,String> perm = new LinkedHashMap<String,String>();
  6. perm.put("/login.jsp","anon");
  7. perm.put("/user.jsp","roles[user]");
  8. perm.put("/shiroRequest/login","anon");
  9. perm.put("/**", "authc");
  10. return perm;
  11. }
  12. }

注: 查询出来的权限由LinkedHashMap类型返回,且注意先后顺序。

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Shiro授权

    授权 • 授权,也叫**访问控制,即在应用中控制谁访问哪些资源**(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象:主体(Subject)、资源...

    相关 shiro授权

    意:在realm的情况下,其权限认证策略也是只要有一个realm的权限ok就好了,所以如果有多个realm的话,只要写其中一个就可以了。 来到我们写的realm: 将...

    相关 Shiro--授权

    首发网址:[Shiro--授权\_IT利刃出鞘的博客-CSDN博客][Shiro--_IT_-CSDN] 其他网址 [shiro简单配置\_运维\_都是浮云-CSDN博

    相关 shiro实现授权

    1,授权概述 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Reso

    相关 Shiro---授权

    什么是授权? shiro是一款安全框架,开发中经常使用Shiro来进行认证和授权,所谓授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的

    相关 shiro(六)授权

    1.权限粒度:分为粗粒度和细粒度。粗粒度:对user的crud。也就是通常说的对表的操作。 细粒度:是对记录的操作。如:只允许查询id为1 的user的工资。shiro一般

    相关 Shiro--授权

    授权 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource