shiro动态控制url资源
怎么利用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:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
- <description>apache shiro配置</description>
- <bean id="chainDefinitionSectionMetaSource" class="com.test.www.web.filter.ChainDefinitionSectionMetaSource">
- <property name="filterChainDefinitions">
- <value>
- <!-- 静态资源允许访问 -->
- <!-- /** = anon -->
- <!-- /app/** = anon
- /assets/** = anon -->
- <!-- 登录页允许访问 -->
- <!-- /user/login.htm = anon -->
- <!-- /login.jsp = anon -->
- <!-- /*.jsp = anon -->
- <!-- /js/**=anon -->
- <!-- 登录页面 -->
- /index2.jsp = anon
- /js/** = anon
- /css/** = anon
- /images/** = anon
- /assets/** = anon
- /test/loginAdmin.html=anon
- /logout=logout <!-- 这才是对退出的配置 -->
- <!-- /test/add.html = perms["user:add"] -->
- <!-- /test/add.html = perms["/test/add.html"] -->
- <!-- 其他资源需要认证 -->
- <!-- /** = authc -->
- <!-- /logout=logout --> <!-- 这才是对退出的配置,不能放在/** = authc的后面 -->
- </value>
- </property>
- </bean>
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="filters">
- <map>
- <entry key="logout" value-ref="logoutFilter"/>
- </map>
- </property>
- <property name="securityManager" ref="securityManager"/>
- <!-- <property name="loginUrl" value="/index2.jsp"/>
- <property name="successUrl" value="/main/main.htm"/>
- <property name="unauthorizedUrl" value="/page/401.htm"/> -->
- <!-- shiro判断是否登录,没有登录则跳转到登录页面,loginUrl对应登录页面的路径 -->
- <property name="loginUrl" value="/index2.jsp"/>
- <property name="unauthorizedUrl" value="/page/401.htm"/><!-- /page/401.htm -->
- <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
- </bean>
- <!-- 缓存管理器 使用Ehcache实现 -->
- <!--
- <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager" p:cacheManagerConfigFile="/WEB-INF/conf/ehcache-shiro.xml">
- </bean>
- -->
- <!-- 会话DAO -->
- <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"/>
- <!-- 会话管理器 -->
- <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
- <property name="sessionDAO" ref="sessionDAO"/>
- </bean>
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realms">
- <list>
- <ref bean="securityRealm"/>
- </list>
- </property>
- <!-- cacheManager,集合spring缓存工厂 -->
- <!-- <property name="cacheManager" ref="shiroEhcacheManager" />
- <property name="sessionManager" ref="sessionManager" /> -->
- </bean>
- <!-- Shiro生命周期处理器 -->
- <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
- </beans>
ChainDefinitionSectionMetaSource.java:
- package com.test.www.web.filter;
- import java.text.MessageFormat;
- import java.util.List;
- import javax.annotation.Resource;
- import org.apache.commons.lang3.StringUtils;
- import org.apache.shiro.config.Ini;
- import org.apache.shiro.config.Ini.Section;
- import org.springframework.beans.factory.FactoryBean;
- import com.test.www.web.entity.user.TPrivilege;
- import com.test.www.web.service.user.TPrivilegeService;
- public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{
- public static final String PREMISSION_STRING="perms[\"{0}\"]";
- private String filterChainDefinitions;
- /*private PrivilegeDao privilegeDao;
- public PrivilegeDao getPrivilegeDao() {
- return privilegeDao;
- }*/
- @Resource
- private TPrivilegeService tPrivilegeService;
- public String getFilterChainDefinitions() {
- return filterChainDefinitions;
- }
- @Resource
- public void setFilterChainDefinitions(String filterChainDefinitions) {
- String fiter="";//改正后的url配置
- /*List<Privilege> list = privilegeDao.getAll();
- for (Iterator<Privilege> it = list.iterator(); it.hasNext();) {
- Privilege privilege = it.next();
- if(!StringUtils.isEmpty(privilege.getUrl())) {
- fiter+="/"+privilege.getUrl()+" = authc," +MessageFormat.format(PREMISSION_STRING,privilege.getPerms()) +"\n";
- }//追加beans.xml中已经有的过滤
- }*/
- List<TPrivilege> tPrivilegeList = tPrivilegeService.selectAllPrivileges();
- if(tPrivilegeList!=null && tPrivilegeList.size()>0){
- for (TPrivilege tPrivilege : tPrivilegeList) {
- if(!StringUtils.isEmpty(tPrivilege.getUrl())) {
- fiter += tPrivilege.getUrl()+" = authc," +MessageFormat.format(PREMISSION_STRING,tPrivilege.getUrl()) +"\n";
- }//追加beans.xml中已经有的过滤
- }
- }
- //对url拦截
- fiter += "/**"+" = authc" +"\n";
- //fiter+="/test/add.html"+" = authc," +MessageFormat.format(PREMISSION_STRING,"/test/add.html") +"\n";
- //fiter+="/js/**"+" = authc," +MessageFormat.format(PREMISSION_STRING,"/js/**") +"\n";
- //fiter+="/js/**"+" = " +MessageFormat.format(PREMISSION_STRING,"/js/**") +"\n";
- System.out.println(filterChainDefinitions+fiter);
- this.filterChainDefinitions = filterChainDefinitions+fiter;
- }
- /*@Resource
- public void setPrivilegeDao(PrivilegeDao privilegeDao) {
- this.privilegeDao = privilegeDao;
- }*/
- public Section getObject(){
- Ini ini = new Ini();//网上好多都是在这里配置URL的。但是发现是错误的。
- ini.load(filterChainDefinitions);
- Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
- return section;
- }
- public Class<?> getObjectType() {
- return this.getClass();
- }
- public boolean isSingleton() {
- return false;
- }
- }
服务器启动的时候会执行ChainDefinitionSectionMetaSource类,加载系统权限资源表所有的url到filterChainDefinitions中(在filterChainDefinitions后追加),从而实现对所有url资源的权限控制的配置:
这个类就是用来在filterChainDefinitions中追加url资源权限控制的。
注意:
/** = authc应放在最后,否则会影响追加的权限资源的控制。
当访问资源的时候,例如/test/toAddUser.html,就会进入shiro授权方法中进行权限校验,如果没有权限则进入到401未授权,否则正常访问。
SecurityRealm.java:
- package com.test.www.web.security;
- import java.util.List;
- import javax.annotation.Resource;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.authc.AuthenticationException;
- import org.apache.shiro.authc.AuthenticationInfo;
- import org.apache.shiro.authc.AuthenticationToken;
- import org.apache.shiro.authc.SimpleAuthenticationInfo;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.authz.AuthorizationInfo;
- import org.apache.shiro.authz.SimpleAuthorizationInfo;
- import org.apache.shiro.realm.AuthorizingRealm;
- import org.apache.shiro.subject.PrincipalCollection;
- import org.apache.shiro.subject.Subject;
- import org.springframework.stereotype.Component;
- import com.test.www.web.entity.user.TRolePrivilegeKey;
- import com.test.www.web.entity.user.TUserRoleKey;
- import com.test.www.web.entity.user.User;
- import com.test.www.web.service.user.TRolePrivilegeService;
- import com.test.www.web.service.user.TUserRoleService;
- import com.test.www.web.service.user.UserService;
- /**
- * 用户身份验证,授权 Realm 组件
- *
- **/
- @Component(value = "securityRealm")
- public class SecurityRealm extends AuthorizingRealm {
- @Resource
- private UserService userService;
- @Resource
- private TUserRoleService tUserRoleService;
- @Resource
- private TRolePrivilegeService tRolePrivilegeService;
- /**
- * 权限检查
- */
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- /*SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
- String username = String.valueOf(principals.getPrimaryPrincipal());
- System.out.println("ssssssss");*/
- String username = principals.getPrimaryPrincipal().toString() ;
- System.out.println(username);
- Subject subject = SecurityUtils.getSubject();
- User user = (User)subject.getPrincipal();
- SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo() ;
- /*Set<String> roleName = t_userService.findRoles(username) ;
- Set<String> permissions = t_userService.findPermissions(username) ;*/
- //final List<Role> roleInfos = roleService.selectRolesByUserId(user.getUserId());
- /*for (Role role : roleInfos) {
- // 添加角色
- System.err.println(role);
- authorizationInfo.addRole(role.getRoleSign());
- final List<Permission> permissions = permissionService.selectPermissionsByRoleId(role.getRoleId());
- for (Permission permission : permissions) {
- // 添加权限
- System.err.println(permission);
- authorizationInfo.addStringPermission(permission.getPermissionSign());
- }
- }*/
- List<TUserRoleKey> tUserRoleKeyList = tUserRoleService.selectRolesByUserId(user.getId());
- if(tUserRoleKeyList != null && tUserRoleKeyList.size()>0){
- for(TUserRoleKey tUserRoleKey : tUserRoleKeyList){
- authorizationInfo.addRole(tUserRoleKey.getCode());
- List<TRolePrivilegeKey> tRolePrivilegeKeyList = tRolePrivilegeService.selectPrivilegesByRoleId(tUserRoleKey.getRoleId());
- for(TRolePrivilegeKey tRolePrivilegeKey : tRolePrivilegeKeyList){
- authorizationInfo.addStringPermission(tRolePrivilegeKey.getUrl());
- }
- }
- }
- //Set<String> roleName = new HashSet<String>();
- //Set<String> permissions = new HashSet<String>();
- //查询角色
- //roleName.add("admin");
- //根据角色查询权限
- //permissions.add("/test/add.html1"); //pub:coursecategory user:add
- //permissions.add("/js/**");
- //permissions.add("/jsp");
- //authorizationInfo.setRoles(roleName);
- //authorizationInfo.setStringPermissions(permissions);
- return authorizationInfo;
- }
- /**
- * 登录验证
- */
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
- /* String username = String.valueOf(token.getPrincipal());
- String password = new String((char[]) token.getCredentials());
- System.out.println("aaaaaaa");
- SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, password, getName());*/
- //int i = 1/0;
- //获取用户账号
- //验证账号密码
- UsernamePasswordToken userToken = (UsernamePasswordToken) token;
- System.out.println("1:"+userToken.getUsername());
- User user = userService.getUserByUserName(userToken.getUsername());
- System.out.println("2");
- if (user != null){
- //将查询到的用户账号和密码存放到 authenticationInfo用于后面的权限判断。第三个参数传入realmName。
- AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user,user.getPassword(),this.getClass().getSimpleName()) ;
- return authenticationInfo ;
- }else{
- return null ;
- }
- }
- }
至此,shiro动态控制url权限资源已完成。
说明:
url资源(action、静态html或动态页面jsp的url)保存在数据库中。
shiro动态控制url资源的更多相关文章
- shiro 静态页面资源不显示 解决方案(转)
最近做一个ssm+shiro的框架整和 不加shiro之前ssm中css和图片显示正常.加上以后无法显示. 解决方案: shiro有静态资源过滤. 配置资源匿名访问即可 <property na ...
- webpack处理url资源的配置
webpack处理url资源的配置 1.安装 npm i url-loader -D 2.修改webpack.config.js const path = require('path'); // 启用 ...
- URL资源跨域访问 跨域使用session信息
SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源. 下表列出了Silverlight 2.0 中 URL 访问规则: WebCl ...
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- [Shiro] - 基于URL配置动态权限
基于shiro进阶 更改了数据库表 之前的PageController是通过@RequiresPermissions和@RequiresRoles进行是否有权限/是否有角色的判定调用@RequestM ...
- 【android】 中文URL资源找不到的问题
在博客园安卓客户端时,遇到过中文资源找不到的问题 背景:在使用PICASSO的时候,遇到过中文路径加载失败.比如 https://images0.cnblogs.com/news_topic/携程.j ...
- 解决springboot 配置文件未映射静态资源文件 导致shiro拦截静态资源的问题
---------------------------------------------------------------------------------------------------- ...
- 不写一行代码,利用常用工具和软件批量下载URL资源
有时候会遇到这种情况:想从某个网站下载一批东西,目标URL是比较规整的,而且结构都一样(仅某些字段不同).但又懒得开IDE专门写个脚本去弄,今天就和大家分享一下,如何利用手边常用的软件和工具,不用写一 ...
- Shiro配置URL过滤
常用过滤器: anon 不需要认证 authc 需要认证 user 验证通过或RememberMe登录的都可以 URL说明: /admin?=authc 表示 ...
随机推荐
- 第七章 用户输入和while 循环
7.1 创建多行字符串的方式: 01 prompt="if you tell me who you are, we can personalize the message you see.& ...
- Redis学习笔记(七) 基本命令:Set操作
原文链接:http://doc.redisfans.com/set/index.html 虽然set和list很相似但还是有一些差别的,如set中的顺序没有先后之分,所以不像list一样可以在首尾增删 ...
- 洛谷P3746 [六省联考2017]组合数问题
题目描述 组合数 C_n^mCnm 表示的是从 n 个互不相同的物品中选出 m 个物品的方案数.举个例子,从 (1;2;3) 三个物品中选择两个物品可以有 (1;2);(1;3);(2;3) 这三种 ...
- Ubuntu 16.04安装Caffe的记录及FCN官方代码的配置
相关内容搜集自官方文档与网络,既无创新性,也不求甚解,我也不了解Caffe,仅仅搭上之后做个记录,方便以后重装 安装依赖项sudo apt-get install libprotobuf-dev li ...
- “双十二”年终盛典,Guitar Pro邀您一起倾情共舞
躲过了双十一,躲不过双十二,隐约昨天还是双十一,马上双十二又叕来了,弱弱的问一句“你们的手长粗了来了吗?”在这即将结束的年终盛典里,各商家又将如“双十一”般纷纷使出浑身解数,作为吉他最佳拍档的编曲软件 ...
- Eclipse配置SVN的几种方法及使用详情(此文章对Myeclipse同样适用)
一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...
- es6——Proxy和Reflect
Proxy代理,Reflect反射 Proxy对属性的读取 { //供应商,原始对象 let obj={ time:'2017-1-1', name:'net', _r:123 } //代理商,新生成 ...
- Jmeter--Timer设置等待时间
一.Jmeter定时器的概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后:是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下,它都在sampler之前得到执行 ...
- 【洛谷1131】 [ZJOI2007]时态同步
树形结构的入门题,一遍DFS即可解决,注意答案开long long #include<cstdio> #include<iostream> #include<algori ...
- Django -聚合分组,FQ操作, cookie, session
一. 聚合查询和分组 1. 聚合 aggregate(*args, **kwargs) 对一组数据进行统计分析, 通过对QuerySet进行计算, 返回一个聚合值得字典. arrgregate()中每 ...