为啥认证应该在过滤器而不是控制器中实现?
Posted
技术标签:
【中文标题】为啥认证应该在过滤器而不是控制器中实现?【英文标题】:Why the authentication should be implemented in a filter and not in a controller?为什么认证应该在过滤器而不是控制器中实现? 【发布时间】:2019-01-09 02:23:48 【问题描述】:按照关于如何在 Spring Boot 应用程序中实现 JWT 身份验证的好教程 (https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/),我看到 /login 是由过滤器而不是由控制器处理的。这不是 Bruno 的任性,Spring 为自己提供了一个过滤器(UsernamePasswordAuthenticationFilter 等)。
为什么要使用过滤器?是不是因为它放在了授权过滤器之前,这样我们就可以拦截新的登录尝试而不受认证过滤器的影响?
谢谢! 安瑞克
【问题讨论】:
【参考方案1】:过滤器链是spring-security
核心概念之一。 spring-security
documentation 的简介解释了以下好处:
Spring Security 的 Web 基础架构完全基于标准 servlet 过滤器。 [...]
Spring Security 在内部维护一个过滤器链,其中每个过滤器都有特定的职责,并且根据需要哪些服务从配置中添加或删除过滤器。
一般来说:您使用spring
之类的框架来处理标准应用程序流程,例如您的案例中的身份验证和登录。 spring-security
处理这个的概念是过滤器链。由于使用框架会带来一些回报(例如开销),因此强烈建议使用框架为您提供的可能性。
在您的情况下,/login
由UsernamePassworAuthenticationFilter
处理。此过滤器带来了一些用于登录和处理身份验证的标准逻辑,因此不由控制器处理。
过滤器 (
UsernamePassworAuthenticationFilter
) 调用配置的AuthenticationManager
来处理每个身份验证请求。认证成功或认证失败后的目的地分别由AuthenticationSuccessHandler
和AuthenticationFailureHandler
策略接口控制。过滤器具有允许您设置这些属性的属性,以便您可以完全自定义行为
【讨论】:
以上是关于为啥认证应该在过滤器而不是控制器中实现?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode6/Swift - 如何在多个视图控制器中实现 iAdBannerView?
如何在 Justhost 中实现 Cronjob? [关闭]
为啥我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?