`
lion222
  • 浏览: 122189 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

java Spring Security 总结二 6

阅读更多

    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基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip ...

    SpringSecurity项目

    springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。 spring security 的核心功能主要包括: 认证 (你是...

    SpringSecurity.zip

    ​ Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...

    java学习之SpringSecurity配置了登录链接无权限

    我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...

    springsecurity学习笔记

    三更springsecurity学习笔记

    SpringSecurity课程文档下载 pdf 教学

    SpringSecurity课程文档下载 pdf 教学

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

    spring security 4.0.0所需jar包

    使用springsecurity做权限管理时,必须要有的jar,当然有些可以不用,你可以按需加入你的项目 @最美最好的你 vx: dengqun2011

    spring security3.0所需要的最精简的jar包

    早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包

    Spring Security权限管理开发手册

    Spring Security 3 Spring Security权限管理开发手册 详细介绍了web app中如何一步步加入 spring security 框架支持,配置灵活,功能强大 中文教程及例子-Spring Security 3 Spring Security rights management ...

    spring_security_3.1

    和spring集成使用的完美权限框架,学习java一定要学会spring_security

    spring-security-oauth2-2.3.5.RELEASE-API文档-中文版.zip

    标签:spring、security、springframework、oauth2、oauth、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代

    Spring Security 把授权信息写入数据库

    Spring Security 把授权信息写入数据库

    spring-security-crypto-5.5.2-API文档-中文版.zip

    标签:springframework、security、spring、crypto、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...

    基于springBoot+springSecurity+jwt实现前后端分离用户权限认证

    springSecurity也有很多种权限认证方式,本项目主要实现基于接口授权,也就是说通过注解给controller赋予权限,用户只有拥有某个接口的权限才能成功访问这个接口,从而实现不同用户拥有不同访问权限;

    spring-security-core-5.5.2-API文档-中文版.zip

    标签:springframework、security、spring、core、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    Spring Security3 安全 个人总结

    Spring Security3 拦截 过滤器 安全,框架原理入门

    安全框架Spring Security深入浅出视频教程

    视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 首先,SSM环境中我们通过xml配置的...Springsecurity在两种不同的开发模式中使用,有经典的独立web后台管理系统,也有时下最流行的前后端分离场景。

    Spring Security

    Spring Security是什么? 历史 发布版本号 Getting Spring Security Spring Security 4.1新特性 Java 配置提升 Web应用程序安全性提升 授权改进 密码模块的改进 测试的改进 一般的改进 样品和指南 (Start Here) Java ...

    springboot整合springSecurity

    springboot整合springSecurity

Global site tag (gtag.js) - Google Analytics