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

时间:2012-08-14 06:31:20

标签: java spring spring-security

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

我希望/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>

1 个答案:

答案 0 :(得分: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>

链定义必须从大多数特定模式排序到最常规模式,因​​此默认链是最后一个。