【问题标题】:Why the authentication should be implemented in a filter and not in a controller?为什么认证应该在过滤器而不是控制器中实现?
【发布时间】:2019-01-09 02:23:48
【问题描述】:
【问题讨论】:
标签:
security
spring-security
jwt
【解决方案1】:
过滤器链是spring-security 核心概念之一。 spring-security documentation 的简介解释了以下好处:
Spring Security 的 Web 基础架构完全基于标准 servlet 过滤器。 [...]
Spring Security 在内部维护一个过滤器链,其中每个过滤器都有特定的职责,并且根据需要哪些服务从配置中添加或删除过滤器。
一般来说:您使用spring 之类的框架来处理标准应用程序流程,例如您的案例中的身份验证和登录。 spring-security 处理这个的概念是过滤器链。由于使用框架会带来一些回报(例如开销),因此强烈建议使用框架为您提供的可能性。
在您的情况下,/login 由UsernamePassworAuthenticationFilter 处理。此过滤器带来了一些用于登录和处理身份验证的标准逻辑,因此不由控制器处理。
过滤器 (UsernamePassworAuthenticationFilter) 调用配置的 AuthenticationManager 来处理每个身份验证请求。认证成功或认证失败后的目的地分别由AuthenticationSuccessHandler 和AuthenticationFailureHandler 策略接口控制。过滤器具有允许您设置这些属性的属性,以便您可以完全自定义行为