我已经在DelegatingAuthenticationEntryPoint
的帮助下将表单登录和Basic auth并排工作。
我要做的是让用户通过登录表单对标准“A”进行身份验证,并让用户通过基本身份验证请求根据标准“B”进行身份验证。
某些应用程序的资源通过RESTful服务公开(可通过Basic auth访问)。他们可以输入生成的键/值对,而不是让用户输入自己的凭据来进行REST服务调用,而是专门用于REST服务,以后可以由用户或应用管理员撤销。
我更愿意在两种身份验证方法之间尽可能多地共享特定于安全性的bean。我知道我需要单独的UserDetailsService
作为表单登录查询我的users
表,Basic auth将查询我的service_credentials
表。
在Spring Security中实现此类配置的正确方法是什么?
答案 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>