当 Web session 过期时,Spring Security 会以 403 HTTP 状态响应。理想情况下,它会以 401 响应。未经授权和禁止是不同的。如果存在有效 session ,则对 protected 资源的请求仅应返回 403,但用户只是没有对所述资源的权限。如果资源是安全的并且没有经过身份验证的 session ,那么 Spring Security 应该返回 401。
我的应用程序需要非常具体地区分这两个错误代码。
我的问题是,如何自定义此行为?为了引用我关于 401 和 403 之间差异的论点,read this .
最佳答案
这是我的解决方案:
@Configuration
public class WebCtxConfig implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof SessionManagementFilter) {
SessionManagementFilter filter = (SessionManagementFilter) bean;
filter.setInvalidSessionStrategy(new InvalidSessionStrategy() {
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
});
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
关于grails - Spring Security 插件应该响应 401 而不是 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606164/