如何为RESTful端点禁用基于spring form的登录?

Bre*_*yan 10 java spring spring-security

我根据基本和基于表单的身份验证配置了spring-security auto-config='true'.

我希望端点/api/**不使用基于表单的安全性.外部的其他端点/api/**应使用基于表单的登录.我想401发送一个响应,发送给这些没有提供凭据的端点/api/**.

更新:感谢Luke Taylor在下面的评论,我提出了以下解决方案.

注意:此技术仅适用于spring-security 3.1.

首先我单挑/api/**.我们从不创建一个会话虽然使用一个如果可用,这是由处理create-session="never"和使用<session-management/>.

<http pattern="/api/**" create-session="never" use-expressions="true">
    <http-basic />
    <session-management />
    <intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/>
</http>

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/" access="permitAll"/>
    <intercept-url pattern="/**" access="isAuthenticated()"/>
</http>
Run Code Online (Sandbox Code Playgroud)

Sha*_*eep 19

使用Spring Security 3.1,您最好的选择是使用两个单独的<http>元素将应用程序的restful和非restful部分拆分为单独的过滤器链.然后可以将restful API链配置为无状态并使用基本身份验证,而默认链可以使用普通的表单登录配置.

然后你会有类似的东西:

<http pattern="/api/**" create-session="stateless">
    <intercept-url pattern="/api/**" access="ROLE_API_USER" />
    <http-basic />        
</http>

<!-- No pattern attribute, so defaults to matching any request -->
<http>
    <intercept-url pattern="/**" access="ROLE_USER" />
    <form-login />        
</http>
Run Code Online (Sandbox Code Playgroud)

链定义必须从最特定的模式到最一般的顺序排序,因此默认链是最后的.