怎么利用shiro权限动态控制每个url资源呢?主要包括jsp(html)页面、action的url访问,而静态资源和登录资源则可直接访问。

所谓动态控制url就是url的权限控制不是手动写死在配置文件中,而是根据数据库的变化而变化。

表结构:

user2:用户表

t_role:角色表

t_user_role:用户角色表

t_privilege:权限资源表

t_role_privilege:角色权限资源表

shiro动态控制url资源:

applicationContext-shiro.xml配置chainDefinitionSectionMetaSource:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
  8.  
  9. <description>apache shiro配置</description>
  10.  
  11. <bean id="chainDefinitionSectionMetaSource" class="com.test.www.web.filter.ChainDefinitionSectionMetaSource">
  12. <property name="filterChainDefinitions">
  13. <value>
  14. <!-- 静态资源允许访问 -->
  15. <!-- /** = anon -->
  16. <!-- /app/** = anon
  17. /assets/** = anon -->
  18. <!-- 登录页允许访问 -->
  19. <!-- /user/login.htm = anon -->
  20. <!-- /login.jsp = anon -->
  21. <!-- /*.jsp = anon -->
  22. <!-- /js/**=anon -->
  23. <!-- 登录页面 -->
  24. /index2.jsp = anon
  25. /js/** = anon
  26. /css/** = anon
  27. /images/** = anon
  28. /assets/** = anon
  29. /test/loginAdmin.html=anon
  30. /logout=logout <!-- 这才是对退出的配置 -->
  31. <!-- /test/add.html = perms["user:add"] -->
  32. <!-- /test/add.html = perms["/test/add.html"] -->
  33. <!-- 其他资源需要认证 -->
  34. <!-- /** = authc -->
  35. <!-- /logout=logout --> <!-- 这才是对退出的配置,不能放在/** = authc的后面 -->
  36.  
  37. </value>
  38. </property>
  39. </bean>
  40.  
  41. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  42. <property name="filters">
  43. <map>
  44. <entry key="logout" value-ref="logoutFilter"/>
  45. </map>
  46. </property>
  47. <property name="securityManager" ref="securityManager"/>
  48. <!-- <property name="loginUrl" value="/index2.jsp"/>
  49. <property name="successUrl" value="/main/main.htm"/>
  50. <property name="unauthorizedUrl" value="/page/401.htm"/> -->
  51. <!-- shiro判断是否登录,没有登录则跳转到登录页面,loginUrl对应登录页面的路径 -->
  52. <property name="loginUrl" value="/index2.jsp"/>
  53. <property name="unauthorizedUrl" value="/page/401.htm"/><!-- /page/401.htm -->
  54.  
  55. <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
  56. </bean>
  57.  
  58. <!-- 缓存管理器 使用Ehcache实现 -->
  59. <!--
  60. <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager" p:cacheManagerConfigFile="/WEB-INF/conf/ehcache-shiro.xml">
  61. </bean>
  62. -->
  63. <!-- 会话DAO -->
  64. <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"/>
  65.  
  66. <!-- 会话管理器 -->
  67. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  68. <property name="sessionDAO" ref="sessionDAO"/>
  69. </bean>
  70.  
  71. <!-- 安全管理器 -->
  72. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  73. <property name="realms">
  74. <list>
  75. <ref bean="securityRealm"/>
  76. </list>
  77. </property>
  78. <!-- cacheManager,集合spring缓存工厂 -->
  79. <!-- <property name="cacheManager" ref="shiroEhcacheManager" />
  80. <property name="sessionManager" ref="sessionManager" /> -->
  81. </bean>
  82.  
  83. <!-- Shiro生命周期处理器 -->
  84. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  85.  
  86. </beans>

ChainDefinitionSectionMetaSource.java:

  1. package com.test.www.web.filter;
  2.  
  3. import java.text.MessageFormat;
  4. import java.util.List;
  5.  
  6. import javax.annotation.Resource;
  7.  
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.apache.shiro.config.Ini;
  10. import org.apache.shiro.config.Ini.Section;
  11. import org.springframework.beans.factory.FactoryBean;
  12.  
  13. import com.test.www.web.entity.user.TPrivilege;
  14. import com.test.www.web.service.user.TPrivilegeService;
  15.  
  16. public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{
  17.  
  18. public static final String PREMISSION_STRING="perms[\"{0}\"]";
  19.  
  20. private String filterChainDefinitions;
  21.  
  22. /*private PrivilegeDao privilegeDao;
  23.  
  24. public PrivilegeDao getPrivilegeDao() {
  25. return privilegeDao;
  26. }*/
  27.  
  28. @Resource
  29. private TPrivilegeService tPrivilegeService;
  30.  
  31. public String getFilterChainDefinitions() {
  32. return filterChainDefinitions;
  33. }
  34.  
  35. @Resource
  36. public void setFilterChainDefinitions(String filterChainDefinitions) {
  37. String fiter="";//改正后的url配置
  38. /*List<Privilege> list = privilegeDao.getAll();
  39. for (Iterator<Privilege> it = list.iterator(); it.hasNext();) {
  40. Privilege privilege = it.next();
  41. if(!StringUtils.isEmpty(privilege.getUrl())) {
  42. fiter+="/"+privilege.getUrl()+" = authc," +MessageFormat.format(PREMISSION_STRING,privilege.getPerms()) +"\n";
  43. }//追加beans.xml中已经有的过滤
  44. }*/
  45.  
  46. List<TPrivilege> tPrivilegeList = tPrivilegeService.selectAllPrivileges();
  47. if(tPrivilegeList!=null && tPrivilegeList.size()>0){
  48. for (TPrivilege tPrivilege : tPrivilegeList) {
  49. if(!StringUtils.isEmpty(tPrivilege.getUrl())) {
  50. fiter += tPrivilege.getUrl()+" = authc," +MessageFormat.format(PREMISSION_STRING,tPrivilege.getUrl()) +"\n";
  51. }//追加beans.xml中已经有的过滤
  52. }
  53. }
  54.  
  55. //对url拦截
  56. fiter += "/**"+" = authc" +"\n";
  57. //fiter+="/test/add.html"+" = authc," +MessageFormat.format(PREMISSION_STRING,"/test/add.html") +"\n";
  58. //fiter+="/js/**"+" = authc," +MessageFormat.format(PREMISSION_STRING,"/js/**") +"\n";
  59. //fiter+="/js/**"+" = " +MessageFormat.format(PREMISSION_STRING,"/js/**") +"\n";
  60. System.out.println(filterChainDefinitions+fiter);
  61. this.filterChainDefinitions = filterChainDefinitions+fiter;
  62. }
  63.  
  64. /*@Resource
  65. public void setPrivilegeDao(PrivilegeDao privilegeDao) {
  66. this.privilegeDao = privilegeDao;
  67. }*/
  68.  
  69. public Section getObject(){
  70. Ini ini = new Ini();//网上好多都是在这里配置URL的。但是发现是错误的。
  71. ini.load(filterChainDefinitions);
  72. Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
  73. return section;
  74. }
  75.  
  76. public Class<?> getObjectType() {
  77. return this.getClass();
  78. }
  79.  
  80. public boolean isSingleton() {
  81. return false;
  82. }
  83.  
  84. }

服务器启动的时候会执行ChainDefinitionSectionMetaSource类,加载系统权限资源表所有的url到filterChainDefinitions中(在filterChainDefinitions后追加),从而实现对所有url资源的权限控制的配置:

这个类就是用来在filterChainDefinitions中追加url资源权限控制的。

注意:

/** = authc应放在最后,否则会影响追加的权限资源的控制。

当访问资源的时候,例如/test/toAddUser.html,就会进入shiro授权方法中进行权限校验,如果没有权限则进入到401未授权,否则正常访问。

SecurityRealm.java:

  1. package com.test.www.web.security;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.apache.shiro.SecurityUtils;
  8. import org.apache.shiro.authc.AuthenticationException;
  9. import org.apache.shiro.authc.AuthenticationInfo;
  10. import org.apache.shiro.authc.AuthenticationToken;
  11. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  12. import org.apache.shiro.authc.UsernamePasswordToken;
  13. import org.apache.shiro.authz.AuthorizationInfo;
  14. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  15. import org.apache.shiro.realm.AuthorizingRealm;
  16. import org.apache.shiro.subject.PrincipalCollection;
  17. import org.apache.shiro.subject.Subject;
  18. import org.springframework.stereotype.Component;
  19.  
  20. import com.test.www.web.entity.user.TRolePrivilegeKey;
  21. import com.test.www.web.entity.user.TUserRoleKey;
  22. import com.test.www.web.entity.user.User;
  23. import com.test.www.web.service.user.TRolePrivilegeService;
  24. import com.test.www.web.service.user.TUserRoleService;
  25. import com.test.www.web.service.user.UserService;
  26.  
  27. /**
  28. * 用户身份验证,授权 Realm 组件
  29. *
  30. **/
  31. @Component(value = "securityRealm")
  32. public class SecurityRealm extends AuthorizingRealm {
  33. @Resource
  34. private UserService userService;
  35. @Resource
  36. private TUserRoleService tUserRoleService;
  37. @Resource
  38. private TRolePrivilegeService tRolePrivilegeService;
  39. /**
  40. * 权限检查
  41. */
  42. @Override
  43. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  44. /*SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  45. String username = String.valueOf(principals.getPrimaryPrincipal());
  46.  
  47. System.out.println("ssssssss");*/
  48. String username = principals.getPrimaryPrincipal().toString() ;
  49. System.out.println(username);
  50.  
  51. Subject subject = SecurityUtils.getSubject();
  52. User user = (User)subject.getPrincipal();
  53.  
  54. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo() ;
  55.  
  56. /*Set<String> roleName = t_userService.findRoles(username) ;
  57. Set<String> permissions = t_userService.findPermissions(username) ;*/
  58. //final List<Role> roleInfos = roleService.selectRolesByUserId(user.getUserId());
  59. /*for (Role role : roleInfos) {
  60. // 添加角色
  61. System.err.println(role);
  62. authorizationInfo.addRole(role.getRoleSign());
  63.  
  64. final List<Permission> permissions = permissionService.selectPermissionsByRoleId(role.getRoleId());
  65. for (Permission permission : permissions) {
  66. // 添加权限
  67. System.err.println(permission);
  68. authorizationInfo.addStringPermission(permission.getPermissionSign());
  69. }
  70. }*/
  71.  
  72. List<TUserRoleKey> tUserRoleKeyList = tUserRoleService.selectRolesByUserId(user.getId());
  73. if(tUserRoleKeyList != null && tUserRoleKeyList.size()>0){
  74. for(TUserRoleKey tUserRoleKey : tUserRoleKeyList){
  75. authorizationInfo.addRole(tUserRoleKey.getCode());
  76. List<TRolePrivilegeKey> tRolePrivilegeKeyList = tRolePrivilegeService.selectPrivilegesByRoleId(tUserRoleKey.getRoleId());
  77. for(TRolePrivilegeKey tRolePrivilegeKey : tRolePrivilegeKeyList){
  78. authorizationInfo.addStringPermission(tRolePrivilegeKey.getUrl());
  79. }
  80. }
  81. }
  82. //Set<String> roleName = new HashSet<String>();
  83. //Set<String> permissions = new HashSet<String>();
  84. //查询角色
  85. //roleName.add("admin");
  86. //根据角色查询权限
  87. //permissions.add("/test/add.html1"); //pub:coursecategory user:add
  88. //permissions.add("/js/**");
  89. //permissions.add("/jsp");
  90. //authorizationInfo.setRoles(roleName);
  91. //authorizationInfo.setStringPermissions(permissions);
  92. return authorizationInfo;
  93. }
  94.  
  95. /**
  96. * 登录验证
  97. */
  98. @Override
  99. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  100. /* String username = String.valueOf(token.getPrincipal());
  101. String password = new String((char[]) token.getCredentials());
  102. System.out.println("aaaaaaa");
  103. SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password, getName());*/
  104. //int i = 1/0;
  105.  
  106. //获取用户账号
  107. //验证账号密码
  108. UsernamePasswordToken userToken = (UsernamePasswordToken) token;
  109. System.out.println("1:"+userToken.getUsername());
  110. User user = userService.getUserByUserName(userToken.getUsername());
  111. System.out.println("2");
  112. if (user != null){
  113. //将查询到的用户账号和密码存放到 authenticationInfo用于后面的权限判断。第三个参数传入realmName。
  114. AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user,user.getPassword(),this.getClass().getSimpleName()) ;
  115. return authenticationInfo ;
  116. }else{
  117. return null ;
  118. }
  119. }
  120.  
  121. }

至此,shiro动态控制url权限资源已完成。
说明:

url资源(action、静态html或动态页面jsp的url)保存在数据库中。

shiro动态控制url资源的更多相关文章

  1. shiro 静态页面资源不显示 解决方案(转)

    最近做一个ssm+shiro的框架整和 不加shiro之前ssm中css和图片显示正常.加上以后无法显示. 解决方案: shiro有静态资源过滤. 配置资源匿名访问即可 <property na ...

  2. webpack处理url资源的配置

    webpack处理url资源的配置 1.安装 npm i url-loader -D 2.修改webpack.config.js const path = require('path'); // 启用 ...

  3. URL资源跨域访问 跨域使用session信息

    SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源. 下表列出了Silverlight 2.0 中 URL 访问规则:   WebCl ...

  4. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  5. [Shiro] - 基于URL配置动态权限

    基于shiro进阶 更改了数据库表 之前的PageController是通过@RequiresPermissions和@RequiresRoles进行是否有权限/是否有角色的判定调用@RequestM ...

  6. 【android】 中文URL资源找不到的问题

    在博客园安卓客户端时,遇到过中文资源找不到的问题 背景:在使用PICASSO的时候,遇到过中文路径加载失败.比如 https://images0.cnblogs.com/news_topic/携程.j ...

  7. 解决springboot 配置文件未映射静态资源文件 导致shiro拦截静态资源的问题

    ---------------------------------------------------------------------------------------------------- ...

  8. 不写一行代码,利用常用工具和软件批量下载URL资源

    有时候会遇到这种情况:想从某个网站下载一批东西,目标URL是比较规整的,而且结构都一样(仅某些字段不同).但又懒得开IDE专门写个脚本去弄,今天就和大家分享一下,如何利用手边常用的软件和工具,不用写一 ...

  9. Shiro配置URL过滤

      常用过滤器: anon     不需要认证 authc     需要认证 user     验证通过或RememberMe登录的都可以   URL说明: /admin?=authc      表示 ...

随机推荐

  1. 第七章 用户输入和while 循环

    7.1 创建多行字符串的方式: 01 prompt="if you tell me who you are, we can personalize the message you see.& ...

  2. Redis学习笔记(七) 基本命令:Set操作

    原文链接:http://doc.redisfans.com/set/index.html 虽然set和list很相似但还是有一些差别的,如set中的顺序没有先后之分,所以不像list一样可以在首尾增删 ...

  3. 洛谷P3746 [六省联考2017]组合数问题

    题目描述 组合数 C_n^mCnm​ 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...

  4. Ubuntu 16.04安装Caffe的记录及FCN官方代码的配置

    相关内容搜集自官方文档与网络,既无创新性,也不求甚解,我也不了解Caffe,仅仅搭上之后做个记录,方便以后重装 安装依赖项sudo apt-get install libprotobuf-dev li ...

  5. “双十二”年终盛典,Guitar Pro邀您一起倾情共舞

    躲过了双十一,躲不过双十二,隐约昨天还是双十一,马上双十二又叕来了,弱弱的问一句“你们的手长粗了来了吗?”在这即将结束的年终盛典里,各商家又将如“双十一”般纷纷使出浑身解数,作为吉他最佳拍档的编曲软件 ...

  6. Eclipse配置SVN的几种方法及使用详情(此文章对Myeclipse同样适用)

    一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...

  7. es6——Proxy和Reflect

    Proxy代理,Reflect反射 Proxy对属性的读取 { //供应商,原始对象 let obj={ time:'2017-1-1', name:'net', _r:123 } //代理商,新生成 ...

  8. Jmeter--Timer设置等待时间

    一.Jmeter定时器的概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后:是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下,它都在sampler之前得到执行 ...

  9. 【洛谷1131】 [ZJOI2007]时态同步

    树形结构的入门题,一遍DFS即可解决,注意答案开long long #include<cstdio> #include<iostream> #include<algori ...

  10. Django -聚合分组,FQ操作, cookie, session

    一. 聚合查询和分组 1. 聚合 aggregate(*args, **kwargs) 对一组数据进行统计分析, 通过对QuerySet进行计算, 返回一个聚合值得字典. arrgregate()中每 ...