将通用逻辑应用于每个请求

时间:2019-07-26 11:53:11

标签: spring-boot spring-security

我是Spring Boot安全性的新手。我已经构建了一个基于Spring Boot的Web应用程序,客户端有多个端点。

现在,我想为到达端点的每个请求引入一些安全检查逻辑。我的意思是,无论请求针对哪个端点,安全检查逻辑对于每个请求都是通用的。这意味着我需要能够解析请求对象。如何使用Spring Boot Security实现此目的?

例如我可以通过创建如下的自定义身份验证提供程序来实现此目标吗?这将适用于所有请求吗?如何获得请求对象?

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
         // my security check logic, but how can I get the request object?
    }

还是我完全错误地实现了目标?

2 个答案:

答案 0 :(得分:0)

背景

通常不会为每个请求都调用您的身份验证提供程序。这取决于您的设置。通常,对于每个请求,Authentication都是从会话中加载的。如果用户已通过身份验证,则检查以查看客户端是否需要身份验证的过滤器(FilterSecurityInterceptor)将使请求通过。如果不是,它可能抛出Exception,最终由另一个执行重定向到登录页面的过滤器处理。

要点是,在这种典型设置中,AuthenticationManager(因此您的AuthenticationProvider)仅在请求通过登录端点时才被调用,因此通常不会为 每个 请求。

潜在解决方案

由于每个请求(通常)都会遍历整个过滤器链,因此您可以将所有逻辑放入过滤器中:

public class CustomAuthenticationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        // check the request here

        // ...

        // if you want the request to keep going through the filter chain:
        chain.doFilter(req,resp);

    }

}

然后,您只需将其添加到WebSecurityConfigurerAdapter中的链中即可:

@Override
protected configure(HttpSecurity http) {
    ...
    http.addFilterAfter(new CustomAuthenticationFilter(), CrsfFilter.class);
}

有无数种方法可以根据需要自定义过滤器。您可以添加AccessDecisionManager来处理过滤器中的“身份验证”失败的情况,也可以添加AuthenticationEntryPoint,也可以在FilterChain中将其下移以使{{ 1}}照顾您的ExceptionTranslationFilter ...等等。

答案 1 :(得分:0)

要获取最新信息,可以使用此静态方法。

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()) .getRequest();