我有一个安全上下文定义,它使用PreAuthenticatedProcessingFilterEntryPoint作为我的应用程序的flex部分。如何在我的应用程序的另一部分使用标准表单登录和html表单的另一个定义?这是我现在拥有的:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<http auto-config="true" access-denied-page="/admin/access-denied">
<intercept-url pattern="/admin/login*" filters="none"/>
<intercept-url pattern="/admin/access-denied" filters="none"/>
<intercept-url pattern="/admin/**/*" access="ROLE_ADMIN" />
<form-login login-page="/admin/login" authentication-failure-url="/admin/login?login_error=1"
default-target-url="/admin/index" login-processing-url="/admin/login-process"/>
<logout logout-success-url="/admin/login"/>
</http>
<global-method-security jsr250-annotations="enabled" />
<beans:bean id="preAuthenticatedEntryPoint" class="org.springframework.security.ui.preauth.PreAuthenticatedProcessingFilterEntryPoint" >
</beans:bean>
<beans:bean id="userAccountManager" class="com.mycomp.service.managers.jpa.UserAccountJpaManager" />
<beans:bean id="userService" class="com.mycomp.auth.DefaultUserDetailsService" />
<beans:bean id="defaultPasswordEncoder" class="com.mycomp.auth.DefaultPasswordEncoder" />
<authentication-provider user-service-ref="userService">
<password-encoder ref="defaultPasswordEncoder"/>
</authentication-provider>
</beans:beans>
我想要做的是为管理网站中的网址使用另一个身份验证提供程序,我目前拥有的是针对Flex应用程序的网址。所以我希望管理URL的安全性使用另一个userDetailsService bean。
答案 0 :(得分:12)
直到最近一直很棘手,但现在很容易!
Spring Security已在3.1版中添加了对场景的支持。它目前作为候选版本提供,由SEC-1171实施。语法的详细信息在3.1。
中包含的手册中使用起来非常简单。基本上,您只需在Spring Security配置中定义多个http
元素,每个元素对应一个上下文。我们这样使用它:
<!-- Configure realm for system administration users -->
<security:http pattern="/admin/**" create-session="stateless">
<security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" />
<security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" />
</security:http>
<!-- Configure realm for standard users -->
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired">
<security:form-login
...
...
</security:http>
需要注意的关键是第一个pattern="/admin/**"
元素上的http
。这告诉Spring /admin
下的所有网址都受该上下文而非默认上下文的影响 - 因此/admin
下的网址会使用您的预授权过滤器。
答案 1 :(得分:2)
将每个过滤器链映射到不同的URL模式:
<bean id="myfilterChainProxy"
class="org.springframework.security.util.FilterChainProxy">
<security:filter-chain-map pathType="ant">
<security:filter-chain pattern="/flex" filters="filterF"/>
<security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
</security:filter-chain-map>
</bean>
答案 2 :(得分:0)
所有关于Spring Security过滤器链拦截了您的应用程序的哪些部分。在你的xml配置中的某个地方(取决于你是否使用简单的标记配置),有一个拦截正则表达式,如下所示:
<intercept-url pattern="/**" ...>
您可以使用不同的拦截模式,使用不同的配置(也就是安全过滤器链的不同部分)。如果你发布当前的配置xml,我可以给你一个更具体的答案。
编辑:目前您正在使用 http 标记来定义Spring Security配置。此标记用作快捷方式/帮助程序,它自动定义安全筛选器链的许多部分,也可以手动设置。我认为您的用例不适合自动设置范例,因此您需要为不同的URL模式手动设置过滤器链(如下面的帖子中所示)。您可以创建自己的PreAuthenticationFilter(它将采用自定义UserDetailsService)并在适当的位置添加适用于您的过滤器链拦截映射。