spring security 安全框架都是通过xml配置文件在容器启动时把资源和角色之间的许可信息加载到内存中,可往往我们需要通过在数据库中配置资源和角色的许可管理来实现动态授权,下面介绍一些通过修改springsecurity源代码的方法来实现动态授权。
首先下载spring security的源代码找到org.springframework.security.intercept.web.FilterSecurityInterceptor类,找到obtainObjectDefinitionSource方法,我们就是要通过修改该方法实现动态授权
private static FilterInvocationDefinitionSource s = null;
private ScRoleResDAO scRoleResDAO;
private ScResourceDAO scResourceDAO;
public ObjectDefinitionSource obtainObjectDefinitionSource() {
if (s == null){
UrlMatcher urlMatcher = new AntUrlPathMatcher(true);
LinkedHashMap requestMap = new LinkedHashMap();
// ApplicationContext context = new ClassPathXmlApplicationContext(
// "spring/dataAccess.xml"
// );
// ScRoleResDAO scRoleResDAO = (ScRoleResDAO)context.getBean("ScRoleResDAO");
// ScResourceDAO scResourceDAO = (ScResourceDAO)context.getBean("ScResourceDAO");
/* 一下这段代码可以忽视,因为每个人的实现方式都不同,
* 这段代码主要是从数据库中取得资源和角色信息的,
* 大家取出来的信息格式可能多种多样,关键是要把这些信息整理成统一的格式
* 参照下面第二段标注为关键代码的部分*/
Map<ScResource, List<ScRoleRes>> map = new TreeMap<ScResource, List<ScRoleRes>>();
ScResourceExample e = new ScResourceExample();
e.setOrderByClause("ORDER_NUM");
List<ScResource> resList = scResourceDAO.selectByExample(e);
ScRoleResExample example = null;
String url = "";
List<ScRoleRes> list = null;
for (ScResource resource : resList) {
url = resource.getUrl();
example = new ScRoleResExample();
example.createCriteria().andUrlEqualTo(url);
list = scRoleResDAO.selectByExample(example);
if (list != null){
map.put(resource, list);
}
}
/**************** 以下是关键代码 *********************/
/*
* 这段代码的重点是生成 requestMap
* requestMap 的 key 的类型为 RequestKey ,需要包含资源的url
* requestMap 的 value 的类型为 ConfigAttributeDefinition ,它需要包含该资源可访问的角色列表信息
* 最后生成 DefaultFilterInvocationDefinitionSource 返回就可以了,
* 当然需要把这个结果保存在内存中,要不然画面上每次刷新都要从数据库中取得信息,资源消耗太大了
* 提供一个刷内存的方法,当数据库中的权限信息改变时要刷新内存中的旧的信息*/
Iterator iterator = map.entrySet().iterator();
ScResource key = null;
List<ScRoleRes> list1 = null;
List<ConfigAttribute> roles = null;
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
key = (ScResource)entry.getKey();
RequestKey reqKey = new RequestKey(key.getUrl());
list1 = (List<ScRoleRes>)entry.getValue();
roles = new ArrayList<ConfigAttribute>();
for (ScRoleRes res : list1) {
roles.add(new SecurityConfig(res.getRole()));
}
requestMap.put(reqKey, new ConfigAttributeDefinition(roles));
}
s = new DefaultFilterInvocationDefinitionSource(urlMatcher,requestMap);
/**************** 以上是关键代码 *********************/
}
return s;
}
/**
* 提供一个刷新内存的静态方法
*/
public static void refresh() {
s = null;
修改启动加载的xml文件,如果此文件是通过命名空间配置的,需要加入
<beans:bean id="_filterSecurityInterceptor"
class="org.springframework.security.intercept.web.FilterSecurityInterceptor"
p:authenticationManager-ref="_authenticationManager"
p:accessDecisionManager-ref="accessDecisionManager">
<beans:property name="objectDefinitionSource">
<beans:value><![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=ROLE_SUPERVISOR
]]></beans:value>
</beans:property>
<beans:property name="scRoleResDAO" ref="ScRoleResDAO"/>
<beans:property name="scResourceDAO" ref="ScResourceDAO"/>
</beans:bean>
其中objectDefinitionSource并没有实际意义,因为我们已经修改了源代码,如果不想注入这个,把FilterSecurityInterceptor类中的objectDefinitionSource变量去掉应该就可以了,不过没有试过
另外两个DAO是我根据我的代码注入的,大家换成自己的DAO就可以了。
可能说的不清楚,不明白的给我邮件cyoubunketu@126.com
分享到:
相关推荐
通过修改spring security源代码实现动态权限管理。用户信息、角色信息和资源信息保存在数据库中,可动态配置权限,不用重新启动服务。改完即时生效,付例子
SpringSecurity教程配套源码 专栏地址:http://blog.csdn.net/column/details/springsecurity.html
SpringSecurity学习总结源代码
该资源是基本Spring Security实战七篇文档中组织的源码,详情如下: ssecurity项目是Spring Security实战(一和二)的源码; ssecurity-db项目是Spring Security实战(三)的源码; ssceurity-page项目是Spring ...
SpringSecurity源码 jar包 简单的入门Demo
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
进行spring security开发引用的spring-security-acl-3.0.2.RELEASE.jar、spring-security-config-3.0.2.RELEASE.jar、spring-security-core-3.0.2.RELEASE.jar、spring-security-taglibs-3.0.2.RELEASE.jar、spring-...
spring security源码分析.pdf
Spring security认证与授权(一)源代码
从官网下载的oauth2实例sparklr2与tonr2
springSecurity 实现登陆验证、传参,包括源代码和MYSQL的建库脚本。 传参的功能可以实现记录登陆之前打开的页面,登陆之后自动跳转到之前打开的页面。
要在Spring Boot中实现用户认证和授权管理,你可以使用Spring Security框架。Spring Security提供了一套强大的功能来处理用户身份验证和授权,以下是一些常见的步骤: 1.添加Spring Security依赖: 在项目的 pom.xml...
spring security oauth2的源码,方便研究,备份一下。
spring-security源码 spring-security源码
SpringBoot_SpringSecurity-源码.rar
首先,SSM环境中我们通过xml配置的方式,从源码渗入开始,完成Spring Security基本的“认证”和“授权”功能讲解,其中还会融合“记住我”,CSRF拦截等技术。 然后,我们会在SpringBoot环境中,继续展开Spring ...
springsecurity源码(鉴权有缺陷)
关于spring security 源码的研究及详细资料的讨论,等一些设计理念。最好的文档是源码
spring security 项目配置源码,项目是在eclipse启动的jdk1.8 tomcat1.8能正常运行,有助于学习.zip
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...