`
kobe学java
  • 浏览: 258471 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

修改spring security源码实现动态授权

 
阅读更多

Java代码   收藏代码
  1. spring security 安全框架都是通过xml配置文件在容器启动时把资源和角色之间的许可信息加载到内存中,可往往我们需要通过在数据库中配置资源和角色的许可管理来实现动态授权,下面介绍一些通过修改springsecurity源代码的方法来实现动态授权。  
  2.   
  3.    
  4.   
  5. 首先下载spring security的源代码找到org.springframework.security.intercept.web.FilterSecurityInterceptor类,找到obtainObjectDefinitionSource方法,我们就是要通过修改该方法实现动态授权  
  6.   
  7.    
  8.   
  9.    
  10.   
  11.     private static FilterInvocationDefinitionSource s = null;  
  12.   
  13.     private ScRoleResDAO scRoleResDAO;  
  14.   
  15.     private ScResourceDAO scResourceDAO;  
  16.   
  17.    
  18.   
  19.     public ObjectDefinitionSource obtainObjectDefinitionSource() {  
  20.   
  21.    
  22.   
  23.     if (s == null){  
  24.   
  25.         UrlMatcher urlMatcher = new AntUrlPathMatcher(true);  
  26.   
  27.         LinkedHashMap requestMap = new LinkedHashMap();  
  28.   
  29.    
  30.   
  31. //          ApplicationContext context = new ClassPathXmlApplicationContext(  
  32.   
  33. //                 "spring/dataAccess.xml"  
  34.   
  35. //                 );  
  36.   
  37. //          ScRoleResDAO scRoleResDAO = (ScRoleResDAO)context.getBean("ScRoleResDAO");  
  38.   
  39. //           ScResourceDAO scResourceDAO = (ScResourceDAO)context.getBean("ScResourceDAO");  
  40.   
  41.    
  42.   
  43.         /* 一下这段代码可以忽视,因为每个人的实现方式都不同, 
  44.  
  45.          * 这段代码主要是从数据库中取得资源和角色信息的, 
  46.  
  47.          * 大家取出来的信息格式可能多种多样,关键是要把这些信息整理成统一的格式 
  48.  
  49.          * 参照下面第二段标注为关键代码的部分*/  
  50.   
  51.         Map<ScResource, List<ScRoleRes>> map = new TreeMap<ScResource, List<ScRoleRes>>();  
  52.   
  53.         ScResourceExample e = new ScResourceExample();  
  54.   
  55.         e.setOrderByClause("ORDER_NUM");  
  56.   
  57.         List<ScResource> resList = scResourceDAO.selectByExample(e);  
  58.   
  59.    
  60.   
  61.         ScRoleResExample example = null;  
  62.   
  63.         String url = "";  
  64.   
  65.         List<ScRoleRes> list = null;  
  66.   
  67.         for (ScResource resource : resList) {  
  68.   
  69.             url = resource.getUrl();  
  70.   
  71.             example = new ScRoleResExample();  
  72.   
  73.             example.createCriteria().andUrlEqualTo(url);  
  74.   
  75.             list = scRoleResDAO.selectByExample(example);  
  76.   
  77.             if (list != null){  
  78.   
  79.                map.put(resource, list);  
  80.   
  81.             }  
  82.   
  83.         }  
  84.   
  85.    
  86.   
  87.    
  88.   
  89.         /****************  以下是关键代码 *********************/  
  90.   
  91.    
  92.   
  93.         /* 
  94.  
  95.          * 这段代码的重点是生成 requestMap 
  96.  
  97.          * requestMap 的 key 的类型为 RequestKey ,需要包含资源的url 
  98.  
  99.          * requestMap 的 value 的类型为 ConfigAttributeDefinition ,它需要包含该资源可访问的角色列表信息 
  100.  
  101.          * 最后生成 DefaultFilterInvocationDefinitionSource 返回就可以了, 
  102.  
  103.          * 当然需要把这个结果保存在内存中,要不然画面上每次刷新都要从数据库中取得信息,资源消耗太大了 
  104.  
  105.          * 提供一个刷内存的方法,当数据库中的权限信息改变时要刷新内存中的旧的信息*/  
  106.   
  107.             Iterator iterator = map.entrySet().iterator();  
  108.   
  109.             ScResource key = null;  
  110.   
  111.             List<ScRoleRes> list1 = null;  
  112.   
  113.             List<ConfigAttribute> roles = null;  
  114.   
  115.             while (iterator.hasNext()) {  
  116.   
  117.                 Map.Entry entry = (Map.Entry) iterator.next();  
  118.   
  119.                 key = (ScResource)entry.getKey();  
  120.   
  121.                 RequestKey reqKey = new RequestKey(key.getUrl());  
  122.   
  123.                 list1 = (List<ScRoleRes>)entry.getValue();  
  124.   
  125.                 roles = new ArrayList<ConfigAttribute>();  
  126.   
  127.                 for (ScRoleRes res : list1) {  
  128.   
  129.                   roles.add(new SecurityConfig(res.getRole()));  
  130.   
  131.             }  
  132.   
  133.                 requestMap.put(reqKey, new ConfigAttributeDefinition(roles));  
  134.   
  135.             }  
  136.   
  137.             s = new DefaultFilterInvocationDefinitionSource(urlMatcher,requestMap);  
  138.   
  139.             /****************  以上是关键代码 *********************/  
  140.   
  141.     }  
  142.   
  143.         return s;  
  144.   
  145.     }  
  146.   
  147.    
  148.   
  149.     /** 
  150.  
  151.      * 提供一个刷新内存的静态方法 
  152.  
  153.      */  
  154.   
  155.     public static void refresh() {  
  156.   
  157.        s = null;  
  158.   
  159.    
  160.   
  161.    
  162.   
  163. 修改启动加载的xml文件,如果此文件是通过命名空间配置的,需要加入  
  164.   
  165.    
  166.   
  167.     <beans:bean id="_filterSecurityInterceptor"  
  168.   
  169.        class="org.springframework.security.intercept.web.FilterSecurityInterceptor"  
  170.   
  171.        p:authenticationManager-ref="_authenticationManager"  
  172.   
  173.         p:accessDecisionManager-ref="accessDecisionManager">  
  174.   
  175.         <beans:property name="objectDefinitionSource">  
  176.   
  177.            <beans:value><![CDATA[  
  178.   
  179.               CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
  180.   
  181.               PATTERN_TYPE_APACHE_ANT  
  182.   
  183.               /**=ROLE_SUPERVISOR  
  184.   
  185.            ]]></beans:value>  
  186.   
  187.         </beans:property>  
  188.   
  189.        <beans:property name="scRoleResDAO" ref="ScRoleResDAO"/>  
  190.   
  191.        <beans:property name="scResourceDAO" ref="ScResourceDAO"/>  
  192.   
  193.     </beans:bean>  
  194.   
  195.    
  196.   
  197. 其中objectDefinitionSource并没有实际意义,因为我们已经修改了源代码,如果不想注入这个,把FilterSecurityInterceptor类中的objectDefinitionSource变量去掉应该就可以了,不过没有试过  
  198.   
  199. 另外两个DAO是我根据我的代码注入的,大家换成自己的DAO就可以了。  

 

分享到:
评论

相关推荐

    spring security实现动态授权

    Spring Security 是一个强大的安全框架,用于为...通过对源代码的适当修改,我们可以构建一个完全可配置的权限管理系统,适应不断变化的业务需求。这个过程涉及多个组件的定制,但一旦设置好,就能带来显著的便利性。

    SpringSecurity源码

    在学习SpringSecurity源码时,建议从以下几个方面入手: 1. **源码结构分析**:了解主要组件的类结构和它们之间的关系,如`Authentication`、`Authorization`、`FilterChainProxy`等。 2. **关键类的实现**:深入...

    SpringSecurity学习总结源代码

    SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、...在学习过程中,分析提供的源代码和示例将有助于深入理解SpringSecurity的工作原理,并能帮助你在实际项目中有效地应用这些知识。

    Spring security oauth源码

    总之,Spring Security OAuth源码提供了一个深入了解OAuth 2.0协议及其在Spring生态系统中实现的绝佳机会。通过研究Sparklr2和Tonr2这两个示例应用,开发者可以更好地掌握OAuth的实践应用,并提升在构建安全Web服务...

    springboot+springSecurity+jwt实现登录认证后令牌授权

    在这个项目中,我们将探讨如何利用Spring Boot、Spring Security和JWT来实现登录认证后的令牌授权。 首先,让我们从Spring Boot开始。Spring Boot简化了Spring应用的初始搭建以及开发过程。通过提供默认配置,它极...

    Spring Security 资料合集

    - 在Spring Boot项目中,Spring Security 可以通过自动配置快速启动,开发者只需少量配置就能实现复杂的安全需求。 这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security...

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

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

    Spring Security实战源码

    该资源是基本Spring Security实战七篇文档中组织的源码,详情如下: ssecurity项目是Spring Security实战(一和二)的源码; ssecurity-db项目是Spring Security实战(三)的源码; ssceurity-page项目是Spring ...

    spring-security-oauth2源码

    - 源代码:实现OAuth2协议的各种类和接口。 - 示例:展示如何配置和使用Spring Security OAuth2的示例项目。 - 测试:单元测试和集成测试,用于验证框架的正确性。 - 文档:关于框架使用的文档和API参考。 理解...

    SpringSecurity源码 SpringSecurity jar包 简单的Demo

    在Demo中,你可能会看到如何通过Spring Security实现用户登录、基于角色的权限控制,以及如何自定义登录失败和成功处理器。这些基本操作为理解Spring Security的全貌打下了基础。 总的来说,Spring Security通过...

    Spring security认证与授权(一)源代码

    通过深入学习和理解Spring Security的这些核心概念,并结合提供的源代码,你可以构建出一个强大而安全的认证和授权系统。记住,良好的安全实践是任何应用的基础,Spring Security提供了丰富的工具和灵活性,帮助...

    spring security 项目配置源码

    Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个"Spring Security 项目配置源码"中,我们有机会深入理解这个框架如何在实际项目中配置和使用。下面将详细介绍Spring Security...

    Spring Security UserDetails实现原理详解

    Spring Security 是一个强大的安全框架,用于管理Web应用的认证和授权。在Spring Security中,`UserDetails` 是一个核心概念,它代表了系统的用户信息。本文将深入探讨`UserDetails`的实现原理,并通过示例代码进行...

    Spring-security源代码下载

    源代码是理解任何软件系统内在工作原理的最佳途径,尤其是对于开发者来说,通过阅读Spring Security的源码,可以深入学习其设计模式和实现细节。 Spring Security 2.0.5.RELEASE是该框架的一个较早版本,尽管现在...

    spring security 3.1 PDF 英文版,源代码.7z

    这为开发者提供了一个深入学习和理解Spring Security 3.1的机会,通过阅读文档了解其核心概念、配置方式以及API用法,同时可以查看源代码以理解其内部实现机制。 描述中提到,这个资源是英文版的,因此对于英语阅读...

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

    首先,SSM环境中我们通过xml配置的方式,从源码渗入开始,完成Spring Security基本的“认证”和“授权”功能讲解,其中还会融合“记住我”,CSRF拦截等技术。 然后,我们会在SpringBoot环境中,继续展开Spring ...

    spring-security源代码

    通过深入研究"spring-security-parent-2.0.4"项目源代码,开发者能够理解其内部工作机制,学习如何配置和扩展Spring Security以满足特定安全需求。同时,这也有助于提升对Spring框架的理解,因为Spring Security是...

    SpringBoot_SpringSecurity-源码.rar

    SpringBoot_SpringSecurity-源码.zip 这个压缩包文件主要包含了SpringBoot集成SpringSecurity的源码分析。SpringBoot是Java开发中一个流行的轻量级框架,它简化了配置和应用部署,使得开发者可以快速搭建应用程序。...

    spring security初步搭建

    在本项目中,我们完成了Spring Security的初步搭建,通过注释丰富的源代码,旨在为开发者提供清晰的理解和实践指导。 首先,让我们了解Spring Security的核心概念: 1. **配置**:Spring Security 的配置通常在`...

    spring security 3 源代码 不包含书,pets应用

    总之,Spring Security 3的源代码提供了深入理解框架工作原理的机会,包括它的核心组件、配置方式、认证与授权流程,以及如何为特定需求定制安全解决方案。通过学习和分析源代码,开发者可以更好地掌握Spring ...

Global site tag (gtag.js) - Google Analytics