Spring-security,404错误应该是限制文件夹中的401或403

时间:2014-07-18 12:26:08

标签: java-ee spring-security

我在spring-security.xml中有这个配置:

<http 
    create-session="stateless" 
    realm="Protected API"
    auto-config="true"
    use-expressions="true">
    <intercept-url pattern="/**" access="permitAll" />
    <intercept-url pattern="/api/auth/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />    
    <intercept-url pattern="/api/auth/admin/**" access="hasRole('ROLE_ADMIN')" />   
    <http-basic/>   
</http>

因此任何用户都可以访问 / api / mypublicservice1 。注册用户可以访问 / api / auth / userservice2 。只有管​​理员才能访问 / api / auth / admin / adminservice3 。那是有效的。

但我想要一种更好的方法来处理404限制文件夹中的请求。

例如:

  • 对于匿名用户, / api / auth / userservice2 返回 401
  • 对于匿名用户, / api / auth / thispagedoesntexist 返回404;相反它应该返回 401
  • 对于非管理员用户, / api / auth / admin / adminservice3 返回 401
  • 对于非管理员用户, / api / auth / admin / thispagedoesntexist 返回404;相反,它应该返回 403

当未授权用户尝试将不存在的页面访问到受限文件夹时,如何返回正确的身份验证代码(401/403)?定制过滤器? HandlerExceptionResolver?

1 个答案:

答案 0 :(得分:0)

正如Luke Taylor所指出的,我的拦截网址顺序错误:

<http 
    create-session="stateless" 
    realm="Protected API"
    use-expressions="true">
    <intercept-url pattern="/api/auth/admin/**" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/api/auth/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />       
    <intercept-url pattern="/**" access="permitAll" />
    <http-basic/>   
</http>