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

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 处理这个的概念是过滤器链。由于使用框架会带来一些回报(例如开销),因此强烈建议使用框架为您提供的可能性。

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

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

【讨论】:

以上是关于为啥认证应该在过滤器而不是控制器中实现?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode6/Swift - 如何在多个视图控制器中实现 iAdBannerView?

如何在 Justhost 中实现 Cronjob? [关闭]

为啥我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?

AngularJS中实现权限控制 - 基于RBAC

为啥我的代码没有过滤并且仍然打印列中的所有内容而不是应该过滤的内容?

在 ios cordova 插件中,对于视图控制器,如何确定是不是应该发生方向更改