我根据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>
答案 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>
链定义必须从大多数特定模式排序到最常规模式,因此默认链是最后一个。