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

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开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...

    Spring Security in Action

    Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...

    spring security 4.0.0所需jar包

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛用于Java应用程序的安全性管理。这个压缩包包含了Spring Security 4.0.0版本所需的jar包,这是一组核心组件,为构建安全的Web应用提供了...

    Spring Security 资料合集

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...

    最详细Spring Security学习资料(源码)

    Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...

    Spring Security学习总结二

    Spring Security作为Java开发中用于构建安全应用程序的强大框架,提供了丰富的特性和灵活的定制能力。其中,`UserDetailsService`是核心组件之一,负责加载用户信息,是实现用户认证的基础。在上一篇文章中,我们...

    SpringSecurity.pdf

    Spring Security之所以在Java社区中广泛流行,是因为它不仅提供了强大的安全特性,还具有高可定制性、良好的扩展性和兼容性,使得开发者可以根据具体需求选择合适的安全解决方案。而随着Web应用程序的安全要求越来越...

    springsecurity学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    狂神Spring Security静态资源

    Spring Security 是一个强大的安全框架,主要用于Java Web应用的安全管理,包括认证、授权和访问控制等。在Spring Boot中,Spring Security 提供了简洁的API和自动化配置,使得开发者能够快速集成安全功能。在这个名...

    spring security 完整项目实例

    Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...

    SpringSecurity笔记,编程不良人笔记

    SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话管理以及安全相关的功能,可以帮助开发者构建安全的Web应用。在本笔记中,我们将深入探讨Spring...

    Spring Security学习总结一

    ### Spring Security 学习总结与应用实践 #### 引言 在深入了解Spring Security之前,我们需要认识到,传统的权限验证逻辑往往杂糅于业务逻辑之中,这种混合不仅使得代码难以维护,而且降低了系统的整体效率。每当...

    Spring Cloud Gateway 整合 Spring Security 统一登录认证鉴权

    而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证鉴权系统。 首先,让我们深入了解Spring Cloud Gateway。这是一个基于...

    SpringSecurity项目

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

    spring-security 官方文档 中文版

    - Spring Security 支持多种 Java EE 环境,包括 Servlet 2.5、Java EE 5 和 Java EE 6。 **5.2 核心组件** - **SecurityContextHolder, SecurityContext 和 Authentication 对象**: - **获得当前用户的信息**:...

    Spring Security 学习总结1_3

    "springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...

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

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在3.0版本中,Spring Security 已经相当成熟,提供...

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

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

    spring security 官方文档

    6. **Web安全(Web Security)**:对于基于Servlet的应用,Spring Security通过Servlet Filter进行安全控制;对于响应式(Reactive)应用,它提供了WebFlux安全支持,利用Reactor库处理非阻塞的HTTP请求。 7. **API...

Global site tag (gtag.js) - Google Analytics