使用spring-security和Basic Auth对REST服务进行身份验证

时间:2014-12-02 23:12:33

标签: spring-security basic-authentication

我正在尝试使用具有以下要求的spring-security为我的REST服务实现基本身份验证:

  • 授权由应用程序的其他部分完成(因此过滤器链中没有任何角色)
  • 我想使用普通bean配置所有内容而不进行任何自动配置

让我感到困惑的是,BasicAuthenticationFilter没有"授权" -Header,因此有效地允许访问没有该标头的所有请求。 我除了这样的请求以抛出异常而不是重定向到 authenticationEntryPoint

我的代码如下:

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
    <constructor-arg>
        <list>
            <security:filter-chain pattern="/rest/**" filters="basicAuthenticationFilter,exceptionTranslationFilter" />
        </list>
    </constructor-arg>
</bean>

                  

<bean id="basicAuthenticationFilter" class="authentication.MyBasicAuthenticationFilter">
    <property name="authenticationManager" ref="myAuthenticationManager" />
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
</bean>

<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
    <property name="realmName" value="myRealm" />
</bean>

我的假设是,我可能需要一个 filterSecurityInterceptor ,并且还需要一个 accessDecisionManager 。我不想使用这些,因为在我看来他们关心授权(与身份验证相反),我在申请的这一点上没有任何角色。

我只是想检查一个正确的用户名/密码组合 并做出相应的反应(401或403)。

我想我错过了一些非常基本的东西,所以任何提示或帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

如果没有授权(从Spring Security的角度来看),则允许任何请求,因此不需要身份验证。所以是的,你需要一个FilterSecurityInterceptor,即使它只根据用户是否经过身份验证做出决定。

在过滤器链的开头还需要SecurityContextPersistenceFilter,因为即使您的应用程序是无状态的,也需要在每个请求结束时清除安全上下文。

您可能会发现this article非常有用,因为它更详细地讨论了普通bean配置。