四将资源放在数据库中
现在,你的用户提出了新的需求,它们需要自己可以给系统用户分配或者取消权限。其实这个并不是什么新鲜事,作为开发者,你也应该为用户提供这样的功能。那么我们就需要这些受保护的资源和用户权限等信息都是动态的,你可以选择把它们存放在数据库中或者LDAP服务器上,本文以数据库为例,介绍如何实现用户权限的动态控制。
通过前面的介绍,你可能也注意到了,不管是MethodSecurityInterceptor还是FilterSecurityInterceptor 都使用authenticationManager和accessDecisionManager属性用于验证用户,并且都是通过使用 objectDefinitionSource属性来定义受保护的资源。不同的是过滤器安全拦截器将URL资源与权限关联,而方法安全拦截器将业务方法与权限关联。
你猜对了,我们要做的就是自定义这个objectDefinitionSource的实现,首先让我们来认识一下系统为我们提供的 ObjectDefinitionSource接口,objectDefinitionSource属性正是指向此接口的实现类。该接口中定义了3个方法,ConfigAttributeDefinition getAttributes(Object object)方法用户获取保护资源对应的权限信息,该方法返回一个ConfigAttributeDefinition对象(位于 org.springframework.security包下),通过源代码我们可以知道,该对象中实际就只有一个List列表,我们可以通过使用 ConfigAttributeDefinition类的构造函数来创建这个List列表,这样,安全拦截器就通过调用 getAttributes(Object object)方法来获取ConfigAttributeDefinition对象,并将该对象和当前用户拥有的Authentication对象传递给 accessDecisionManager(访问决策管理器,请查看org.springframework.security.vote包下的 AffirmativeBased类,该类是访问决策管理器的一个实现类,它通过一组投票者来决定用户是否有访问当前请求资源的权限),访问决策管理器在将其传递给AffirmativeBased类维护的投票者,这些投票者从ConfigAttributeDefinition对象中获取这个存放了访问保护资源需要的权限信息的列表,然后遍历这个列表并与Authentication对象中GrantedAuthority[]数据中的用户权限信息进行匹配,如果匹配成功,投票者就会投赞成票,否则就投反对票,最后访问决策管理器来统计这些投票决定用户是否能访问该资源。是不是又觉得乱了,还是那句话,如果你结合源代码你现在一定更明白了。
说了这么些,那我们到底应该如何来实现这个ObjectDefinitionSource接口呢?
首先还是说说Acegi Seucrity 1.x版本,org.acegisecurity.intercept.web和org.acegisecurity.intercept.method 包下AbstractFilterInvocationDefinitionSource和 AbstractMethodDefinitionSource两个抽象类,这两个类分别实现了 FilterInvocationDefinitionSource和MethodDefinitionSource接口,而这两个接口都继承自 ObjectDefinitionSource接口并实现了其中的方法。两个抽象类都使用方法模板模式来实现,将具体的实现方法交给了子类。
提示:两个抽象类实现了各自接口的 getAttributes(Object object)方法并在此方法中调用lookupAttributes(Method method)方法,而实际该方法在抽象类中并没有具体的实现,而是留给了子类去实现。
在Acegi Seucrity 1.x版本中,系统为我们提供了默认的实现,MethodDefinitionMap类用于返回方法的权限信息,而 PathBasedFilterInvocationDefinitionMap类和 RegExpBasedFilterInvocationDefinitionMap类用于返回URL资源对应的权限信息,也就是 ConfigAttributeDefinition对象,现在也许明白一点儿了吧,我们只要按照这三个类的实现方式(也就是“模仿”,从后面的代码中你可以看到)从数据库中获取用户信息和权限信息然后封装成一个ConfigAttributeDefinition对象返回即可(其实就是一个List列表,前面已经介绍过了),相信通过Hibernate从数据库中获取一个列表应该是再容易不过的了。
回到Spring Security,系统为我们提供的默认实现有些变化,DefaultFilterInvocationDefinitionSource和 DelegatingMethodDefinitionSource两个类,从名字也可以看出来它们分别是干什么的了。这两个类分别实现了 FilterInvocationDefinitionSource和MethodDefinitionSource接口,而这两个接口都继承自 ObjectDefinitionSource接口并实现了其中的方法,这和1.x版本中一样。它们都是从配置文件中得到资源和相应权限的信息。
通过上面的介绍,你或许更名白了一些,那我们下面要做的就是实现系统的FilterInvocationDefinitionSource和MethodDefinitionSource接口,只是数据源不是从配置文件中读取配置信息是数据库而已。
我们这里对比着Acegi Seucrity 1.x版本中的实现,我个人认为它更好理解,还是请你好好看看源代码。
分享到:
相关推荐
基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip基于Java Spring Security的关注微信公众号即登录的设计与实现源码.zip ...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...
Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛用于Java应用程序的安全性管理。这个压缩包包含了Spring Security 4.0.0版本所需的jar包,这是一组核心组件,为构建安全的Web应用提供了...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话管理以及安全相关的功能,可以帮助开发者构建安全的Web应用。在本笔记中,我们将深入探讨Spring...
Spring Security之所以在Java社区中广泛流行,是因为它不仅提供了强大的安全特性,还具有高可定制性、良好的扩展性和兼容性,使得开发者可以根据具体需求选择合适的安全解决方案。而随着Web应用程序的安全要求越来越...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
### Spring Security 学习总结与应用实践 #### 引言 在深入了解Spring Security之前,我们需要认识到,传统的权限验证逻辑往往杂糅于业务逻辑之中,这种混合不仅使得代码难以维护,而且降低了系统的整体效率。每当...
而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证鉴权系统。 首先,让我们深入了解Spring Cloud Gateway。这是一个基于...
"springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在3.0版本中,Spring Security 已经相当成熟,提供...
我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...
Spring Security3 是一个基于 Java 的安全框架,提供了一个灵活的安全机制来保护基于 Spring 的应用程序。在这个总结中,我们将详细介绍 Spring Security3 的安全机制、原理和核心组件。 认证管理器 认证管理器是...
5. **CSRF保护(Cross-Site Request Forgery)**:默认情况下,Spring Security提供了对CSRF攻击的防护,通过生成和验证CSRF令牌来确保只有合法的请求才能执行。 6. **Web安全(Web Security)**:对于基于Servlet...
- Spring Security 支持多种 Java EE 环境,包括 Servlet 2.5、Java EE 5 和 Java EE 6。 **5.2 核心组件** - **SecurityContextHolder, SecurityContext 和 Authentication 对象**: - **获得当前用户的信息**:...
#### 二、Spring Security 命名空间配置 ##### 2.1 命名空间的设计 Spring Security 提供了一个简洁的命名空间,用于简化配置过程。这种设计使得开发者可以使用更少的 XML 配置来实现复杂的安全需求。 ##### 2.2 ...