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