Shiro - 自定义filterChainDefinitions和Realm
在Spring Context中定义shiroFilter(org.apache.shiro.spring.web.ShiroFilterFactoryBean)时需要为其filterChainDefinitions property赋值,这个属性是个chainName-to-chainDefinition map of chain definitions,用于为URL定义过滤策略。
比如:
/404.htm = anon
/main!main.html = anon
/**.html = perms[myPerm_1]
rest:比如/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。
port:比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。
perms:比如/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,比如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
roles:比如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
anon:比如/admins/**=anon 没有参数,表示可以匿名使用。
authc:比如/admins/user/**=authc表示需要认证才能使用,没有参数
authcBasic:比如/admins/user/**=authcBasic没有参数表示httpBasic认证
ssl:比如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
user:比如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查
一般情况下,我们可以将模块作为一个粒度,例如:
/blog!**.html = user
偶尔也会有将每一个URL作为一个授权单位进行控制,例如:
/blog!doAddNewArticle.html = authc,perms[addArticle]
但是URL的数量让人头疼,也许可以每开发一个功能的时候打开XML文件写入URL然后同步到SVN,或者我们也可以找一个人专门做这些事情,无论是添加、删除功能还是修改方法名都通知这个人去做...换位思考一下,我不希望我是这个人...
所以我要把这些URL放在数据库进行管理。我要把他们统统Query出来放到filterChainDefinitions里。
我需要装配一个Bean,实际上他是一个org.springframework.beans.factory.FactoryBean<Section>的实现。
<bean id="chainFilterBuff" class="king.common.ChainFilterBuff">
<property name="filterChainDefinitions">
/404.htm = anon
/main!main.html = anon
</property>
</bean>
然后将其注入:
<bean id="shiroFilter1" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/main!main.html" />
<property name="successUrl" value="/main!main.html" />
<property name="unauthorizedUrl" value="/unAuthorized.htm" />
<property name="filterChainDefinitionMap" ref="chainFilterBuff" />
</bean>
Java代码中implements FactoryBean<Ini.Section>并实现需要Override的method,关键是getObject这个method:
private String filterChainDefinitions;
@Override
public Section getObject() throws Exception {
Ini ini = new Ini();
ini.load(filterChainDefinitions); //先载入XML中定义好的chain
Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
/*
* 省略读取步骤
* 继续加入数据库中的chain
* section.put("/**", "authc, roles[admin]");
*/
return section;
}
等等,这些仅仅是定义了权限。
我们需要在用户访问这些URL的时候去验证一下用户是否具备当前URL权限。
所以我定义了(事实上我们必须定义一个Realm,ShiroFilterFactoryBean需要SecurityManager,而我们使用的SecurityManager的实现类DefaultWebSecurityManager则需要一个Realm!):
<bean id="shiroDataBaseRealm" class="king.security.KingMainRealm">
并且Override了接口定义的method:
public class KingMainRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo( //授权
PrincipalCollection principals) {
UserBean _user = (UserBean) principals.fromRealm(getName()).iterator().next();
SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo();
/*
* 省略
*/
return authInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo( //认证
AuthenticationToken token) throws AuthenticationException {
UserBean user = new UserBean();
UsernamePasswordToken userToken = (UsernamePasswordToken)token;
user.setUserName(userToken.getUsername());
user.setPassword(userToken.getPassword()); return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
}
}
若已定义了需要请求的URL,用户登录时doGetAuthorizationInfo会被调用,剩下的就是为每一个用户管理这些权限了。
也许我们可以创建角色关联多个权限,用户关联多个角色,类似这样的设置不同的层次。
按自己喜欢的方式去做吧 :)
Shiro - 自定义filterChainDefinitions和Realm的更多相关文章
- SpringMVC Shiro与filterChainDefinitions
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...
- Shiro 自定义登陆、授权、拦截器
Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...
- 解决shiro自定义filter后,ajax登录无法登录,并且无法显示静态资源的问题
这个问题困扰了我一天,看了下面两个文章,豁然开朗: https://www.cnblogs.com/gj1990/p/8057348.html https://412887952-qq-com.ite ...
- Shiro自定义Realm时用注解的方式注入父类的credentialsMatcher
用Shiro做登录权限控制时,密码加密是自定义的. 数据库的密码通过散列获取,如下,算法为:md5,盐为一个随机数字,散列迭代次数为3次,最终将salt与散列后的密码保存到数据库内,第二次登录时将登录 ...
- 权限框架 - shiro 自定义realm
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
- shiro自定义realm支持MD5算法认证(六)
1.1 散列算法 通常需要对密码 进行散列,常用的有md5.sha, 对md5密码,如果知道散列后的值可以通过穷举算法,得到md5密码对应的明文. 建议对md5进行散列时加salt(盐),进行 ...
- shiro自定义realm认证(五)
上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入 ...
- (3)shiro自定义realm
上面一章说到shiro的认证和授权最底层就是调用realm的getAuthorizationInfo(获取用户的角色和资源)和getAuthenticationInfo(校验账号密码是否正确)两个方法 ...
随机推荐
- Java中获取运行代码的类名、方法名
以下是案例,已运行通过 package com.hdys; /* * 1.获取当前运行代码的类名,方法名,主要是通过java.lang.StackTraceElement类 * * 2. * [1]获 ...
- Oracle ocp 12c-071最新考试题库及答案-1
choose the best answer: View the Exhibit and examine the structure of the CUSTOMERS table. CUSTOMER_ ...
- 一,Smarty模板技术/引擎——简介
Smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使PHP程序员与美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改 ...
- VMware虚拟机中如何配置静态IP
我们首先说一下VMware的几个虚拟设备 VMnet0:用于虚拟桥接网络下的虚拟交换机 VMnet1:用于虚拟Host-Only网络下的虚拟交换机 VMnet8:用于虚拟NAT网络下的虚拟交换机 VM ...
- XML标签属性
0. 内容索引 1. XML序列化与反序列化 2. 相关的常用Attribute 3. 相关的全部Attribute 4. XML序列化答疑 5. 高级议题 1. XML序列化与反序列化 // OBJ ...
- PHP初步:在Mac OS X Yosemite下搭建Apache+PHP+Mysql
Mac OS X是基于unix的操作系统,很多软件都集成在系统中.所以,对于配置PHP的开发环境相对于windows和Linux更简单. 1. 启动Apache服务器 打开终端(terminal),查 ...
- 解决mysql最大允许传输包不足的问题
一.报错提示内容和原因 在执行“数据传输”或者“运行SQL文件”时报错误:Got a packet bigger than 'max_allowed_packet' bytes With,表明当前所传 ...
- CSS3 文本溢出问题
一.单行: 效果: 实现这各效果必须要加上: text-overflow: ellipsis; /*文本溢出*/ overflow: hidden; /*配合使用:溢出隐藏*/ white-space ...
- 错误及异常处理-[PathTooLongException]指定的路径或文件名太长
错误信息 System.IO.PathTooLongException:"指定的路径或文件名太长,或者两者都太长.完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符. ...
- npm run build报错 ,resolve is not defined
今天在build项目的时候报: ReferenceError: resolve is not defined npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ...