1 自定义FilterInvocationDefinitionSource
在2.0中,系统没有在系统抽象类,所以我们还是使用1.x中的实现方式,首先通过一个抽象类来实现ObjectDefinitionSource接口。代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> 1 public ConfigAttributeDefinition getAttributes(Object object)
2
3 throws IllegalArgumentException {
4
5 if (object == null || !(this.supports(object.getClass()))) {
6
7 thrownew IllegalArgumentException("Object must be a FilterInvocation");
8
9 }
10
11 String url = ((FilterInvocation)object).getRequestUrl();
12
13 returnthis.lookupAttributes(url);
14
15 }
16
17 publicabstract ConfigAttributeDefinition lookupAttributes(String url);
18
19 @SuppressWarnings("unchecked")
20
21 publicabstract Collection getConfigAttributeDefinitions();
22
23 @SuppressWarnings("unchecked")
24
25 publicboolean supports(Class clazz) {
26
27 return FilterInvocation.class.isAssignableFrom(clazz);
28
29 }
这段代码你也可以在1.0中找到,getAttributes方法的入口参数是一个Object对象,这是由系统传给我们的,因为是URL资源的请求,所有可以将这个Object对象强制转换为FilterInvocation对象,并通过调用它的getRequestUrl()方法来获取用户当前请求的 URL地址,然后调用子类需要实现的lookupAttributes方法并将该URL地址作为参数传给该方法,下面是具体的实现类 DataBaseFilterInvocationDefinitionSource类的代码,也就是我们需要实现抽象父类的 lookupAttributes方法:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> 1 @Override
2
3 public ConfigAttributeDefinition lookupAttributes(String url) {
4
5 // TODO Auto-generated method stub
6
7 //初始化数据,从数据库读取
8
9 cacheManager.initResourceInCache();
10
11 if (isUseAntPath()) {
12
13 int firstQuestionMarkIndex = url.lastIndexOf("?");
14
15 if (firstQuestionMarkIndex != -1) {
16
17 url = url.substring(0, firstQuestionMarkIndex);
18
19 }
20
21 }
22
23 //将URL在比较前都转换为小写
24
25 if (isConvertUrlToLowercaseBeforeComprison()) {
26
27 url = url.toLowerCase();
28
29 }
30
31 //获取所有的URL
32
33 List<String> urls = cacheManager.getUrlResources();
34
35 //倒叙排序--如果不进行排序,如果用户使用浏览器的导航工具访问页面可能出现问题
36
37 //例如:访问被拒绝后用户刷新页面
38
39 Collections.sort(urls);
40
41 Collections.reverse(urls);
42
43 GrantedAuthority[] authorities = new GrantedAuthority[0];
44
45 //将请求的URL与配置的URL资源进行匹配,并将正确匹配的URL资源对应的权限
46
47 //取出
48
49 for (String resourceName_url : urls) {
50
51 boolean matched = false;
52
53 //使用ant匹配URL
54
55 if (isUseAntPath()) {
56
57 matched = pathMatcher.match(resourceName_url, url);
58
59 } else {//perl5编译URL
60
61 Pattern compliedPattern = null;
62
63 Perl5Compiler compiler = new Perl5Compiler();
64
65 try {
66
67 compliedPattern = compiler.compile(resourceName_url, Perl5Compiler.READ_ONLY_MASK);
68
69 } catch (MalformedPatternException e) {
70
71 e.printStackTrace();
72
73 }
74
75 matched = matcher.matches(url, compliedPattern);
76
77 }
78
79 //匹配正确,获取响应权限
80
81 if (matched) {
82
83 //获取正确匹配URL资源对应的权限
84
85 ResourcDetail detail = cacheManager.getResourcDetailFromCache(resourceName_url);
86
87 authorities = detail.getAuthorities();
88
89 break;
90
91 }
92
93 }
94
95 //将权限封装成ConfigAttributeDefinition对象返回(使用ConfigAttributeEditor)
96
97 if (authorities.length > 0) {
98
99 String authTemp = "";
100
101 for (GrantedAuthority grantedAuthority : authorities) {
102
103 authTemp += grantedAuthority.getAuthority() + ",";
104
105 }
106
107 String authority = authTemp.substring(0, (authTemp.length() - 1));
108
109 System.out.println(authority);
110
111 ConfigAttributeEditor attributeEditor = new ConfigAttributeEditor();
112
113 attributeEditor.setAsText(authority.trim());
114
115 return (ConfigAttributeDefinition)attributeEditor.getValue();
116
117 }
118
119 returnnull;
120
121 }
我们这里同样使用了缓存,它参考自系统的UseCache接口的实现,这里不在介绍,你可以查看本例的源代码和系统的实现和本例的配置文件。这里将用户请求的URL地址与从数据库中获取的受保护的URL资源使用ant和perl5匹配(这取决与你的配置),如果匹配成功则从缓存中获取访问该资源需要的权限信息,并将其封装成ConfigAttributeDefinition对象返回,这里使用 org.springframework.security.ConfigAttributeEditor类,该类提供了一个 setAsText(String s),该方法收取一个字符串作为参数,在该方法中创建ConfigAttributeDefinition对象并将字符串参数传递给 ConfigAttributeDefinition类的构造函数来初始化该对象。详细的实现还是请你看源代码。现在我们在配置文件添加自己的实现,如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1 <bean id="objectDefinitionSource"
2 class="org.security.intercept.web.DataBaseFilterInvocationDefinitionSource"
3 p:convertUrlToLowercaseBeforeComprison="true"
4 p:useAntPath="true"
5 p:cacheManager-ref="securityCacheManager"/>
convertUrlToLowercaseBeforeComprison属性定义了在匹配之前将URL都转换为小写,useAntPath属性定义使用Ant方式匹配URL,cacheManager属性定义了指向另一个Bean的引用,我们使用它从缓存中获取相应的信息。
分享到:
相关推荐
基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip ...
springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。 spring security 的核心功能主要包括: 认证 (你是...
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...
三更springsecurity学习笔记
SpringSecurity课程文档下载 pdf 教学
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
使用springsecurity做权限管理时,必须要有的jar,当然有些可以不用,你可以按需加入你的项目 @最美最好的你 vx: dengqun2011
早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包
Spring Security 3 Spring Security权限管理开发手册 详细介绍了web app中如何一步步加入 spring security 框架支持,配置灵活,功能强大 中文教程及例子-Spring Security 3 Spring Security rights management ...
和spring集成使用的完美权限框架,学习java一定要学会spring_security
标签:spring、security、springframework、oauth2、oauth、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代
Spring Security 把授权信息写入数据库
标签:springframework、security、spring、crypto、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...
springSecurity也有很多种权限认证方式,本项目主要实现基于接口授权,也就是说通过注解给controller赋予权限,用户只有拥有某个接口的权限才能成功访问这个接口,从而实现不同用户拥有不同访问权限;
标签:springframework、security、spring、core、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...
Spring Security3 拦截 过滤器 安全,框架原理入门
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 首先,SSM环境中我们通过xml配置的...Springsecurity在两种不同的开发模式中使用,有经典的独立web后台管理系统,也有时下最流行的前后端分离场景。
Spring Security是什么? 历史 发布版本号 Getting Spring Security Spring Security 4.1新特性 Java 配置提升 Web应用程序安全性提升 授权改进 密码模块的改进 测试的改进 一般的改进 样品和指南 (Start Here) Java ...
springboot整合springSecurity