spring - AccessDeniedHandler 重定向到登录页面

标签 spring spring-mvc spring-security

当(在 Spring Security/MVC 中)对页面的访问被拒绝时,由于用户没有足够的权限(尽管他已通过身份验证),我需要通过显示登录页面(而不是显示 403 访问被拒绝页面的标准行为)。
我可以编写一个 AccessDeniedHandler,它重定向到登录页面。但是,当 Spring Security 发现已经有另一个用户登录时,它会如何 react ?当新用户成功通过身份验证后,我可以以某种方式注销旧用户吗?

最佳答案

当已经有另一个用户登录时,我尝试登录新用户。它有效 - 无需注销第一个用户。他的授权被新的授权所取代。这是对我自己的问题的简单回答。

如果有人感兴趣,如何在访问被拒绝的情况下转发到登录页面 - 这是我的解决方案:

首先定义一个自定义的RequestCache:

@Component("myRequestCache")
public class MyRequestCache extends HttpSessionRequestCache {
    public MyRequestCache() {
        super();
    }
}

第二个定义自定义AccessDeniedHandler:

@Component("myAccessDeniedHandler")
public class MyAccessDeniedHandler implements AccessDeniedHandler {

    @Autowired
    @Qualifier("myRequestCache")
    private RequestCache myRequestCache;

    public MyAccessDeniedHandler() {
    }

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc)
        throws IOException, ServletException {
        
        if (!response.isCommitted()) {

            //Save Target-Request
            myRequestCache.saveRequest(request, response);
        
            //Forward to the login page
            request.getRequestDispatcher("/loginPage").forward(request, response);
        }
    }   
}

第三,将这两个配置到 Spring Security 中:

@Configuration
@EnableWebSecurity
public class myConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("myRequestCache")
    RequestCache myRequestCache;

    @Autowired
    @Qualifier("myAccessDeniedHandler")
    AccessDeniedHandler myAccessDeniedHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
        http
        .requestCache()
            .requestCache(myRequestCache)
            .and()
        .exceptionHandling()
            .accessDeniedHandler(myAccessDeniedHandler)
    }
}

这里发生了什么?
MyAccessDeniedHandler 在出现 AccessDeniedException 的情况下转发到登录页面。由于此转发是由这个自编程类调用的,而不是由过滤器链中的 Spring 调用的,因此我们必须告诉 spring,目标请求是什么 - 在成功身份验证后它必须重定向到哪里。我们通过 RequestCache 来完成此操作。

关于spring - AccessDeniedHandler 重定向到登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41610042/

相关文章:

java - HttpSecurity 正则表达式匹配器未按预期工作

java - 使用 Spring 实现基于 token 的授权的最佳方法是什么?

ajax - 如何使用 jsf 2.0 配置 spring webflow?

Spring webflow 2.3.0 - 如何在表单操作方法中获取 flowExecutionKey?

javascript - 使用 JavaScript 发送删除请求

java - Spring + Hibernate 未插入数据库(@Transactional 不起作用)

java - Spring MVC 应用程序中的 UTF8 转换错误

spring - 配置 Hibernate C3P0 连接池

java - 使用 Java 配置在 Spring 中重定向 404 错误

spring - 在带有 CORS 的 REST 中使用 Spring 登录时出现问题