10

我有一个安全上下文定义,它将 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>

我想做的是为管理站点中的 url 使用另一个身份验证提供程序,我目前拥有的是用于 flex 应用程序的身份验证提供程序。所以我希望管理员 url 的安全性使用另一个 userDetailsS​​ervice bean。

4

3 回答 3

12

直到最近,这一直很棘手,但现在很容易!

Spring Security 在 3.1 版本中增加了对场景的支持。它目前作为候选发布版本提供,由SEC-1171实施。语法的详细信息在 3.1 附带的手册中。

使用起来非常简单。基本上,您只需http在 Spring Security 配置中定义多个元素,每个上下文一个。我们这样使用它:

<!-- 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 下的所有 URL/admin都受制于该上下文而不是默认上下文 - 因此下的 URL/admin将使用您的预授权过滤器。

于 2011-02-21T00:05:12.510 回答
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>
于 2009-07-01T19:46:55.977 回答
0

这完全取决于 Spring Security 过滤器链拦截了应用程序的哪些部分。在您的 xml 配置中的某处(取决于您是否进行了简单的标签配置)有一个像这样的拦截正则表达式

<intercept-url pattern="/**" ...>

您可以有不同的拦截模式,使用不同的配置(也就是安全过滤器链的不同部分)。如果您发布当前配置 xml,我可以给您一个更具体的答案。

编辑:目前您正在使用http标签来定义您的 Spring Security 配置。此标签用作快捷方式/帮助程序,它自动定义了许多也可以手动设置的安全过滤器链。我认为您的用例不适合自动设置范例,因此您需要为不同的 URL 模式手动设置过滤器链(如我下面的帖子所示)。您可以创建自己的 PreAuthenticationFilter(它将采用自定义 UserDetailsS​​ervice)并将其添加到过滤器链拦截映射的适当位置。

于 2009-07-01T19:45:49.083 回答