11

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

我希望下面的端点/api/**不使用基于表单的安全性。外部的其他端点/api/**应使用基于表单的登录。我希望401对这些未在/api/**.

更新:感谢卢克泰勒在下面的评论,我提出了以下解决方案。

注意:此技术只能在 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>
4

1 回答 1

19

<http>使用 Spring Security 3.1,您最好的选择是使用两个单独的元素将应用程序的 restful 和 non-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>

链定义必须从最具体的模式到最一般的模式排序,因此默认链排在最后。

于 2012-08-15T11:22:15.377 回答