2

我正在使用 spring security (4.0.0.M2) 来保护我的 web 应用程序以及我的 rest api。一切都很好。但我有一个问题。当用户无法通过身份验证时,我想返回 401 的 http 结果 403(禁止)

我为每个身份验证场景定义了不同的 http 定义,一个用于 web,一个用于 api。

<http pattern="/rest/v?/**" auto-config="false" use-expressions="true"
    disable-url-rewriting="true" authentication-manager-ref="tokenAuthenticationManager" 
    create-session="stateless" realm="API security check"
    entry-point-ref="http403EntryPoint">
    <intercept-url pattern="/rest/v?/*" access="isAuthenticated()" />   
    <anonymous enabled="false" />
    <http-basic />
</http>

<authentication-manager id="tokenAuthenticationManager" erase-credentials="true">
    <authentication-provider user-service-ref="tokenUserDetailsService" />
</authentication-manager>

public class TokenUserDetailsService implements UserDetailsService {
    @Override
    public org.springframework.security.core.userdetails.UserDetails loadUserByUsername(String checkUser)
            throws UsernameNotFoundException {

        // lookup user
        if (user == null) {
            // here I whant to return 403 instead of 401
            throw new UsernameNotFoundException("User not found");
        }
    }
}

在这种情况下,有人可以帮助返回 http 状态代码 403 吗?

谢谢你的帮助。

此致

桑尼

4

2 回答 2

0

目前我找到了一个可行的解决方案。当我使用自定义过滤器 (position=pre_auth) 时,我可以使用 doFilter 方法更改响应代码。

但我不确定这是否真的是最好的解决方案。

于 2014-10-04T21:15:24.457 回答
0

BasicAuthenticationFilter由元素创建的也<http-basic>具有对入口点的引用。它在身份验证失败时调用它,这就是 401 代码的来源(这对于基本身份验证来说是正常的)。

如果要更改它,可以使用entry-point-ref命名空间属性。所以

<http-basic entry-point-ref="http403EntryPoint" />

应该给出你想要的结果。

于 2014-10-03T16:41:02.543 回答