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

The*_*ear 7 spring-security

我已经有了表单登录和Basic auth并在a的帮助下并排工作DelegatingAuthenticationEntryPoint.

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

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

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

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

Sha*_*eep 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>
Run Code Online (Sandbox Code Playgroud)

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