如果用户未授权,则Spring Security会显示404

时间:2015-06-05 14:12:27

标签: java spring spring-mvc spring-security

我的春季安全配置是

<http pattern="/resources/**" security="none"/>
    <http pattern="/login**" security="none"/>
    <http pattern="/invalidsession**" security="none"/>
    <http pattern="/forgotpassword**" security="none"/>
    <http pattern="/accessdenied**" security="none"/>
    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/common/**" access="hasAnyRole('SITE_ADMIN','CLIENT_ADMIN')" />
        <intercept-url pattern="/site/**" access="hasRole('SITE_ADMIN')" />
        <intercept-url pattern="/**" access="hasRole('CLIENT_ADMIN')" />
        <!-- access denied page 
        <access-denied-handler error-page="/accessdenied" />
        -->
        <access-denied-handler ref="my403" />
        <form-login login-page="/login" 
             username-parameter="username"
            password-parameter="password"  authentication-failure-url="/login?error" 
            authentication-success-handler-ref="myAuthenticationSuccessHandler"
            />
        <logout logout-success-url="/login?logout" />
        <session-management invalid-session-url="/invalidsession" />
    </http>

当SITE_ADMIN用户打开一个不存在的页面时,它会显示拒绝访问页面而不是404页面。这是因为 <intercept-url pattern="/**" access="hasRole('CLIENT_ADMIN')" /> 。 Spring安全性是在pagenotfound之前检查授权。如果页面不存在且SITE_ADMIN当前正在记录,我该如何显示404。

2 个答案:

答案 0 :(得分:1)

不确定为什么要这样,但您可以通过实施AuthenticationEntryPoint来完成此操作,并为commence method set 404设置CLIENT_ADMIN并为其他人保留默认值

类似

   @Component
  public class EntryPointUnauthorizedHandler implements AuthenticationEntryPoint{
            @Override
 public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,AuthenticationException e) throws IOException, ServletException {
     // use SecurityContextHolder.getContext() for your security checks
     httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,"Access Denied");
                }

            }

现在您可以在http-security config

中添加入口点

答案 1 :(得分:1)

此要求将难以实现:Spring安全过滤器在调度程序servlet看到请求之前执行其Web授权测试

那可以做些什么呢?这是一些路径,但我从来没有尝试过任何一条路径。

1 /使用自定义AccessDeniedHandler。它的handle方法将获取请求和响应,因此它可以尝试使用虚拟响应将它们直接传递给DispatcherServlet。困难的部分是分析响应以查看它是否是404错误页面,如果它是复制真实响应中的虚拟响应,否则继续使用默认的AccessDeniedHandlerImpl方法。看起来相当hacky ......

2 /放弃网络安全,只对所有服务方法使用方法安全性。这样,只有在DispatcherServlet成功找到请求的控制器时才会调用安全性。缺点是您将无法获得静态页面的安全性。但是这种方式如果更多 spring方式

无论如何,我永远不会尝试这样做。我不允许有人进入某个特定的层次结构,我不希望他确切地知道存在哪些页面。我不是特别喜欢混淆的安全性,但我更喜欢隐藏对用户没有直接用处的所有内容。