这个附录提供了对安全命名空间中可用元素的参考信息,也介绍了它们创建的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中的
AuthenticationSuccessHandlerbean的名称。
向配置中添加一个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_"。