Appendix B. 安全命名空间
这个附录提供了对安全命名空间中可用元素的参考信息,也介绍了它们创建的bean的信息(对单独类的知识和它们是如何在一起工作的 - 你可以在工程的Javadoc和这个文档的其他部分找到更多信息)。 如果你以前没有使用过命名空间,请阅读命名空间配置部分的介绍章节,这部分的信息是作为那些章节的一个补充资料的。 我们推荐你在编辑基于schema的配置时使用一个高质量的XML编辑器,这会为你提供上下文环境相关的信息,哪些元素和属性是可用的,注释会解释它们的用途。 命名空间是使用RELAX NG兼容格式编写的,随后转换为XSD Schema。 如果你对这种格式很熟悉,很可能希望直接查看schema 文件。
<http>
元素为你的应用程序的web层封装了安全性配置。 它创建了一个名为"springSecurityFilterChain"的FilterChainProxy
bean,这个bean维护了一系列的建立了web安全配置的安全过滤器。[14]。 一些核心的过滤器总是要被创建的,其他的将根据子元素的配置添加到过滤器队列中。 标准过滤器的位置都是固定的(参考命名空间配置中的过滤器顺序表格),这避免了之前版本中的一个常见问题,那时候用户必须自己在FilterChainProxy
bean中配置过滤器链。当然如果你需要对配置进行完全控制,依然可以这样做。
所有需要引用AuthenticationManager
的过滤器,都会自动注入命名空间配置创建的内部实例(查看介绍章节获得AuthenticationManager
的更多信息)。
<http>
命名空间块会创建一个HttpSessionContextIntegrationFilter
,一个ExceptionTranslationFilter
和一个FilterSecurityInterceptor
。 它们是固定的,不能使用其他可选方式替换。
<http>
元素的属性控制核心过滤器的一些属性。
支持一些版本的HttpServletRequest
提供的安全方法,必须isUserInRole()
和getPrincipal()
,通过向堆栈中添加一个SecurityContextHolderAwareRequestFilter
bean来实现。 默认是"true"。
正常情况下AuthenticationEntryPoint
将根据配置的认证机制进行设置。 这个属性让这个行为使用自定义的AuthenticationEntryPoint
bean进行覆盖,它会启动认证流程。
可选的属性,指定AccessDecisionManager
实现的ID,这应该被认证的HTTP请求使用。 默认情况下一个AffirmativeBased
实现会被RoleVoter
和AuthenticatedVoter
使用。
控制创建一个HTTP会话的紧急程度。 如果不设置,默认是"ifRequired"。 其他选项是"always"和"never"。 这个属性的设置影响HttpSessionContextIntegrationFilter
的allowSessionCreation
和forceEagerSessionCreation
属性。 除非把属性设置为"never"allowSessionCreation
会一直为"true"。 除非把属性设置为"always"forceEagerSessionCreation
会一直为"false"。 所以默认的配置允许会话的创建,但不会强制。 如果启用同步会话控制,当forceEagerSessionCreation
被设置为"true",不管这里设置的什么都会抛出异常。 使用"never"会在HttpSessionContextIntegrationFilter
初始化的过程中导致异常。
这个元素允许你为默认的AccessDeniedHandler
设置errorPage
属性, 它会被ExceptionTranslationFilter
用到, (使用error-page
属性,或通过ref
属性 提供你自己的实现。参考 ExceptionTranslateFilter
获得更多信息。)
这个元素用来定义URL模式集合,应用对什么感兴趣并配置它们应该如何处理。 它用来构建被FilterSecurityInterceptor
使用的FilterInvocationDefinitionSource
,也可以从过滤器链中排除特定的模式(通过使用filters="none"
属性)。 它也负责配置ChannelAuthenticationFilter
,如果特定的URL需要通过HTTPS访问,比如。 当匹配时指定的模式对应了进入的请求,匹配过程就会完成,按照声明的元素顺序。 所以最希望被匹配的模式应该放在上面,最常用的模式应该放在最后。
HTTP Method会被用来结合模式来匹配进入的请求。 如果忽略,所有的Method都会匹配。 如果一个相同的模式指定了,使用method和没有使用method两种方式, 指定了method的匹配将被优先使用。
列出会被存储在FilterInvocationDefinitionSource
中的访问属性,为定义的模式/Method结合的形式。 这应该是由分号分隔的安全配置属性队列(比如角色名称)。
可以是http
或https
, 这是根据一个特定的URL模式是否应该通过HTTP或HTTPS访问。 如果没有偏好还可以选择any
。 如果这个属性已经出现在任何一个<intercept-url>
上,一个ChannelAuthenticationFilter
会添加到过滤器堆栈里, 它的附加依赖也会添加到application context中。 查看信道安全获得使用传统bean的例子配置。
如果添加了一个<port-mappings>
配置,它会被SecureChannelProcessor
和InsecureChannelProcessor
使用来决定在重定向到HTTP/HTTPS的时候使用什么端口。
默认情况下,PortMapperImpl
的实例会添加到配置中,在重定向到安全和不安全的URL时使用到。 这个元素可以选择用来覆盖类定义的默认映射。 每个子<port-mapping>
元素都定义了一对HTTP:HTTPS端口。 默认的映射是80:443和8080:8443。 一个覆盖这些的例子可以在命名空间介绍中看到。
用来把一个UsernamePasswordAuthenticationFilter
添加到过滤器堆栈中,把一个LoginUrlAuthenticationEntryPoint
添加到application context中来提供需要的认证。 这将永远凌驾于其他命名空间创建的切入点。 如果没有提供属性,一个登录页面会自动创建在"/spring-security-login"这个URL下[15]。 这个行为可以使用下面的属性自定义。
这个URL应该用来生成登录页面。 对应LoginUrlAuthenticationEntryPoint
的loginFormUrl
属性。 默认是"/spring-security-login"。
对应UsernamePasswordAuthenticationFilter
的filterProcessesUrl
属性。 默认是"/j_spring_security_check"
对应UsernamePasswordAuthenticationFilter
的defaultTargetUrl
属性。 如果没有设置,默认值是"/"(应用的根路径)。 一个用户会在登录之后到达这个URL,在他们没有在登录之前尝试访问一个安全资源,否则他们就会被转向到原来请求的URL。
如果设置成"true",用户会一直转发到default-target-url
指定的位置,无论他们在登录页面之前访问的什么位置。 对应UsernamePasswordAuthenticationFilter
的alwaysUseDefaultTargetUrl
属性。
对应UsernamePasswordAuthenticationFilter
的authenticationFailureUrl
属性。 定义了在登录失败时浏览器会重定向的URL。 默认是"/spring_security_login?login_error",它会自动被登陆页面生成器处理,并使用一个错误信息重新渲染登录页面。
这可以用来替换default-target-url
和always-use-default-target
,你可以完全控制 成功认证之后的导航流向。这个值应该是application context中的 AuthenticationSuccessHandler
bean的名称。
向配置中添加一个BasicAuthenticationFilter
和BasicAuthenticationEntryPoint
。 后一个只有在基于表单登录没有启用的时候才会被用作配置入口。
向堆栈中添加RememberMeAuthenticationFilter
。 这会在配置了一个TokenBasedRememberMeServices
,或一个PersistentTokenBasedRememberMeServices
,或一个用户自定义的实现了RememberMeServices
的配置设置后启用。
如果设置了这个,PersistentTokenBasedRememberMeServices
会被使用到,并配置上一个JdbcTokenRepositoryImpl
实例。
配置一个PersistentTokenBasedRememberMeServices
但是允许使用一个自定义的PersistentTokenRepository
bean。
允许对将要用在过滤器里的RememberMeServices
的实现提供完全控制。 这个值将是application context里的一个实现了这个接口的bean的id。
配置一个PersistentTokenBasedRememberMeServices
但是允许使用一个自定义的PersistentTokenRepository
bean。
对应AbstractRememberMeServices
的"key"属性。 应该设置一个唯一的值来确定remember-me的cookies只对唯一的应用有效。[16]。
对应AbstractRememberMeServices
的tokenValiditySeconds
属性。 指定remember-me cookie生效的秒数周期。 默认它会在14日内生效。
会话管理相关的功能由额外的 过滤器栈中的SessionManagementFilter
实现。
添加对同步会话控制的支持,允许限制一个用户可以拥有的活动会话的数量。 会创建一个ConcurrentSessionFilter
, 连同一个ConcurrentSessionControllerStrategy
和SessionManagementFilter
的实例。 如果已经声明了form-login
元素,策略对象也会注入到创建的 验证过滤器中。一个SessionRegistry
的实例( SessionRegistryImpl
的实例,除非用户希望使用自定义bean) 会被创建,交给策略使用。
如果一个用户尝试使用一个已经过期"expired"的会话,同步会话控制器会重定性到的URL。因为用户超过了允许的会话数量,但是又在其他地方登录了系统。 除非设置exception-if-maximum-exceeded
,其他时候都应该设置这个属性。 如果没有设置值,一个过期信息会直接写到响应中。
如果设置成"true",一个SessionAuthenticationException
会被抛出, 当一个用户尝试超过最大会话允许数量。 默认行为是让原始会话过期。
添加一个AnonymousAuthenticationFilter
和AnonymousAuthenticationProvider
到堆栈里。 如果你使用IS_AUTHENTICATED_ANONYMOUSLY
属性,就是必要的。
添加X.509认证的支持。 一个X509AuthenticationFilter
会被添加到堆栈中,会创建一个PreAuthenticatedProcessingFilterEntryPoint
。 后一个只有的其他认证机制都没有使用的情况下才会用到(它唯一的功能是返回一个HTTP 403错误代号)。 一个PreAuthenticatedAuthenticationProvider
也会被创建,并代理用户权限读取到一个UserDetailsService
里。
与<form-login>
类似,拥有相同的属性。 login-processing-url
的默认值是"/j_spring_openid_security_check"。 一个OpenIDAuthenticationFilter
和OpenIDAuthenticationProvider
会被注册上。 后者需要一个UserDetailsService
的引用。 它也可以使用id指定,使用user-service-ref
属性,或者在application context中自动定位。
添加一个LogoutFilter
到过滤器堆栈中。 它和SecurityContextLogoutHandler
一起配置。
在Spring Security 3.0之前,一个AuthenticationManager
会自动注册, 现在你必须使用<authentication-manager>
元素注册一个bean。 这个bean是Spring Security的ProviderManager
类的一个实例,它需要配置一个或多个AuthenticationProvider
的实例。 这里可以使用命名空间支持的语法元素,也可以使用标准的bean定义,使用custom-authentication-provider
元素来添加列表。
每个Spring Security应用,只要使用了命名空间,就必须在什么地方包含对应的元素。 它负责注册AuthenticationManager
,为应用各提供验证服务。 它也允许你定义一个别名,为内部实例,在你的配置中来使用。 这些都写在命名空间介绍中。 所有元素,创建了AuthenticationProvider
实例, 应该是这个元素的子元素。
这个元素基本是配置DaoAuthenticationProvider
的简化形式。 DaoAuthenticationProvider
读取用户信息,从 UserDetailsService
中,比较用户名/密码,来进行用户登录。 UserDetailsService
实例可以被定义,无论是命名空间中的 (jdbc-user-service
或使用 user-service-ref
属性来引用一个bean,定义在application context中)。 你可以在命名空间介绍中找到。。
如果你已经创建了自己的AuthenticationProvider
实现,(或希望配置Spring Security提供的一个实现,因为什么原因使用传统配置方式, 你可以使用下面的语法,来把它添加到内部ProviderManager
列表中:)
<security:authentication-manager> <security:authentication-provider ref="myAuthenticationProvider" /> </security:authentication-manager> <bean id="myAuthenticationProvider" class="com.something.MyAuthenticationProvider"/>
这个元素是为Spring Security中的bean提供安全方法支持的最基本元素。 方法可以通过使用注解来保护(在接口或类级别进行定义)或者作为子元素的切点集合,使用AspectJ语法。
方法安全使用与web安全相同的AccessDecisionManager
配置,但是可以使用Section B.1.1.6, “access-decision-manager-ref
”中的解释进行覆盖,使用相同的属性。
把这些设置为"true"会分别启用对Spring Security自己的@Secured
注解和JSR-250注解的支持, 默认情况下它们两个都是禁用的。 JSR-250注解的应用还需要向AccessDecisionManager
添加一个Jsr250Voter
,这样你需要确定你需要做这个,如果你使用一个自定义的实现,然后想要使用这些注解。
除了在单独的方法或类的基础上使用@Secured
定义安全属性,你可以定义交叉安全实体,覆盖你服务层中所有的方法和接口,使用<protect-pointcut>
元素。 它有两个属性:
-
expression
- 切点表达式 -
access
- 提供的安全属性
你可以在命名空间介绍中找到一个例子。
LDAP已经在它自己的章节中讨论过一些细节了。 我们将在这里进行一些扩展,解释命名空间中的选项如何对应Spring的bean。 LDAP实现使用Spring LDAP扩展,所以最好熟悉一下工程的API。
这个元素使用其他LDAP bean来建立一个Spring LDAP ContextSource
,定义LDAP服务器的位置和其他信息(比如用户名和密码,如果它不允许匿名访问)来连接它。 它也可以用来创建一个测试用的嵌入式服务器。 所有选项的语法细节信息都在LDAP章节中。 实际上的ContextSource
实现是DefaultSpringSecurityContextSource
,它扩展了Spring LDAP的LdapContextSource
类。 manager-dn
和manager-password
属性分别对应后者的userDn
和password
属性。
如果你只在你的application context中定义了一个服务器,其他LDAP命名空间定义的bean会自动使用它。 否则,你可以为这个元素定义一个"id"属性,然后在其他命名空间bean中使用server-ref
属性引用它。 这其实是ContextSource
实例的bean的id,如你你想要在其他传统Spring bean中使用它。
这个元素是为了创建LdapAuthenticationProvider
实例的简写。 默认情况下它会和BindAuthenticator
实例和一个DefaultAuthoritiesPopulator
一起配置。
如果你的用户在目录中的一个固定的位置(比如,你可以不需要进行目录查询,就从用户名直接找到一个DN),你可以使用这个属性来直接映射DN。 它直接对应AbstractLdapAuthenticator
的userDnPatterns
属性。
如果你需要执行查询,来定义目录中的用户,然后你可以设置这些属性来控制查询。 BindAuthenticator
会被配置在FilterBasedLdapUserSearch
中,属性值直接对应bean构造方法的前两个参数。 如果这些属性没有设置,也没有提供可选的user-dn-pattern
,就会使用默认的查询值user-search-filter="(uid={0})"
和user-search-base=""
。
group-search-base
的值对应DefaultAuthoritiesPopulator
的构造方法参数groupSearchBase
,默认是"ou=groups"。 默认过滤器值是"(uniqueMember={0})",这假设入口是"groupOfUniqueNames"类型。 group-role-attribute
对应groupRoleAttribute
属性,默认是"cn"。 role-prefix
对应于rolePrefix
,默认为"ROLE_"。
相关推荐
综上所述,Spring Security的命名空间是配置安全策略的重要工具。通过熟练掌握`http`和`security`命名空间,开发者能够创建强大且灵活的安全机制,保护Spring应用免受未经授权的访问。同时,深入研究源码和利用相关...
通过SpringSecurityTest这个压缩包文件,你可以找到相关的示例代码和配置,以帮助你更好地理解这些概念。动手实践是学习Spring Security的最佳途径,你可以尝试修改配置,观察不同设置对应用程序安全行为的影响。 ...
- **使用命名空间配置方式**:从2.0版本开始,Spring Security引入了一种新的命名空间配置方式,这种方式可以极大地简化配置文件的编写工作。通过这种方式,开发者可以用较少的代码实现相同的功能。 #### 四、结论 ...
Spring Security 提供了一个简洁的命名空间,用于简化配置过程。这种设计使得开发者可以使用更少的 XML 配置来实现复杂的安全需求。 ##### 2.2 开始使用安全命名空间配置 - **配置 web.xml**:在 web.xml 文件中...
SpringSecurity的配置通常基于XML命名空间(namespace),这也是"springsecurity-namespace.rar"文件名的由来。XML命名空间提供了一种简洁的方式来设置各种安全配置,如定义访问控制规则、配置认证机制等。例如,你...
- **命名空间的设计**:Spring Security 提供了一个专用的 XML 命名空间来简化安全性配置。 - **开始使用安全命名空间配置**: - **配置 web.xml**:需要在 web.xml 中配置 Spring Security 的 Filter,以便处理 ...
Spring Security提供了基于XML的配置命名空间,这使得XML配置更为简洁和容易理解。可以从web.xml配置开始,然后逐步添加更多的安全特性,比如记住我登录功能、添加HTTP/HTTPS通道安全、会话管理等。 9. 高级Web...
- 描述如何将配置的过滤器和命名空间应用到实际项目中,构建一个完整的Spring Security安全体系。 - **1.4 运行示例** - 提供一个具体的示例,演示如何运行配置好的Spring Security项目。 **2. 使用数据库管理...
标题:springsecurity3.1.pdf 描述:springsecurity3.1.pdf 标签:spring security3.1 部分内容:SpringSecurity Reference Documentation by Ben Alex and Luke Taylor 3.1.4.RELEASE **一、Spring Security 3.1...
Spring security 命名空间的使用.docSpring security 命名空间的使用.doc
- **命名空间设计**: 解释了 Spring Security 命名空间的设计理念及其如何简化安全配置的过程。 - **开始使用安全命名空间配置**: - **web.xml 配置**: 描述了如何在 web.xml 文件中设置基本的 Spring Security ...
在 SpringSecurity电子书中,作者Ben Alex和Luke Taylor提供了对Spring Security的全面介绍,涵盖了从基本概念到高级特性以及如何配置和使用Spring Security的详细指南。 知识点一:Spring Security基础 1. Spring ...
2. **XML配置简化**:通过使用更简洁的命名空间和元素,使得Spring Security的XML配置更加清晰易读。 3. **更强大的认证机制**:支持多种认证方式,如X.509证书、OpenID、CAS等。 4. **Web表单登录增强**:提供了...
开始使用安全命名空间配置 高级web功能 方法安全 默认的 AccessDecisionManager 验证管理器和命名空间 应用程序示例 Tutorial 示例 Contacts 示例 LDAP 示例 OpenID 示例 CAS 示例 JAAS 示例 Pre-Authentication ...
#### 二、Security命名空间配置 - **命名空间设计**:Spring Security引入了专用的XML命名空间来简化配置,使得配置变得更加直观和简洁。 - **开始使用安全命名空间配置**:通过简单的XML配置即可完成大部分安全性...
在配置Spring Security时,有两种主要的方式:传统XML配置和命名空间配置。传统配置方式适用于Acegi时代的用户,而命名空间配置自2.0版本引入,简化了配置过程,提供了更直观的XML元素来定义安全设置。这两种配置...
- **Namespace配置**:使用Spring Security的命名空间简化XML配置,如`<http>`、`<authentication-manager>`等元素。 3. **认证流程** - 用户提交登录信息。 - Spring Security的`Filter Security Interceptor`...
使用命名空间配置,可以在`spring-security.xml`配置文件中通过`<http>`标签来定义安全规则,并通过`<user-service>`标签配置用户信息和权限。 对于用户权限的管理,可以使用数据库来存储用户信息和权限规则。这...