为什么认证应该在过滤器而不是控制器中实现?

时间:2018-08-01 13:27:30

标签: security spring-security jwt

在关于如何在Spring Boot应用程序(https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/)中实现JWT身份验证的优秀教程之后,我已经看到/ login由过滤器而不是控制器处理。这不是布鲁诺的随心所欲,Spring正在为自己提供一个过滤器(UsernamePasswordAuthenticationFilter等)。

为什么要使用过滤器?是因为它放置在授权过滤器之前,并且这样我们可以拦截新的登录尝试而不受身份验证过滤器的影响?

谢谢! 恩里克

1 个答案:

答案 0 :(得分:1)

过滤器链是spring-security核心概念之一。 spring-security documentation的简介说明了以下好处:

  

Spring Security的Web基础结构完全基于标准的servlet过滤器。 [...]

     

Spring Security在内部维护一个过滤器链,其中每个过滤器都负有特殊责任,并且根据需要的服务将过滤器添加到配置中或从配置中删除。

通常来说:您使用spring之类的框架来处理标准的应用程序流,例如您的案例身份验证和登录。 spring-security的概念就是过滤链。由于使用框架会带来一些收益(例如开销),因此强烈建议您使用框架为您提供的可能性。

在您的情况下,/loginUsernamePassworAuthenticationFilter处理。该过滤器会带来一些用于登录处理的标准逻辑并处理身份验证,因此不会由控制器处理。

  

过滤器(UsernamePassworAuthenticationFilter)调用已配置的AuthenticationManager以处理每个身份验证请求。认证成功或认证失败后的目的地分别由AuthenticationSuccessHandlerAuthenticationFailureHandler策略接口控制。过滤器具有允许您设置这些属性的属性,因此您可以完全自定义行为