使用不同的源处理表单和HTTP基本身份验证

时间:2012-02-15 22:56:29

标签: spring-security

我已经在DelegatingAuthenticationEntryPoint的帮助下将表单登录和Basic auth并排工作。

我要做的是让用户通过登录表单对标准“A”进行身份验证,并让用户通过基本身份验证请求根据标准“B”进行身份验证。

某些应用程序的资源通过RESTful服务公开(可通过Basic auth访问)。他们可以输入生成的键/值对,而不是让用户输入自己的凭据来进行REST服务调用,而是专门用于REST服务,以后可以由用户或应用管理员撤销。

我更愿意在两种身份验证方法之间尽可能多地共享特定于安全性的bean。我知道我需要单独的UserDetailsService作为表单登录查询我的users表,Basic auth将查询我的service_credentials表。

在Spring Security中实现此类配置的正确方法是什么?

2 个答案:

答案 0 :(得分:13)

根据您的应用以及您是否使用Spring Security 3.1,最好将配置拆分为多个过滤器链,每个过滤器链都定义了一个单独的身份验证管理器:

<http pattern="/rest_api/**" create-session="stateless"
    authentication-manager-ref="serviceCredsAuthMgr">
    <http-basic />
</http>

<http authentication-manager-ref="mainAuthMgr">
    <form-login />
</http>

<authentication-manager id="serviceCredsAuthMgr">
    <authentication-provider user-service-ref="serviceCredsUserDetailsSvc" />
</authentication-manager>

<authentication-manager id="mainAuthMgr">
    <!-- whatever -->
</authentication-manager>

您还可以使用pattern属性来指定RequestMatcher实例,而不是request-matcher-ref属性,该实例将用于将传入请求映射到特定过滤器链。这有一个非常简单的界面,但可以允许您根据URL路径以外的其他内容进行匹配,例如Accept标题。

答案 1 :(得分:1)

使用SpringSecurity(3.2.3.RELEASE)可以正常工作以及基本身份验证:

<http pattern="/resources/**" security="none"/>
<http pattern="/webjars/**" security="none"/>

<http pattern="/rest/**" create-session="stateless" use-expressions="true">
    <intercept-url pattern="/**" access="isFullyAuthenticated()"/>
    <http-basic />
</http>

<http auto-config="true" use-expressions="true">
    <http-basic/>
    <intercept-url pattern="/login" access="permitAll"/>
    <intercept-url pattern="/loginfailed" access="permitAll"/>
    <intercept-url pattern="/logout" access="permitAll"/>

    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')"/>
    <intercept-url pattern="/**" access="isAuthenticated()"/>
    <form-login login-page="/login" default-target-url="/" authentication-failure-url="/loginfailed"/>
    <logout logout-success-url="/logout"/>
    <remember-me user-service-ref="userService"/>
</http>

<authentication-manager>
    <authentication-provider user-service-ref="userService">
<!--
        <jdbc-user-service data-source-ref="dataSource"
                           users-by-username-query="SELECT email, password, enabled FROM users WHERE email = ?"
                           authorities-by-username-query="
                                       SELECT u.email, r.name FROM users u, roles r WHERE u.id = r.user_id and u.email = ?"/>
-->
<!--
        <user-service>
            <user name="mail@yandex.ru" password="password" authorities="ROLE_USER"/>
            <user name="admin@gmail.com" password="admin" authorities="ROLE_ADMIN"/>
        </user-service>
-->
    </authentication-provider>
</authentication-manager>