Spring Security 上下文中的身份验证和授权有什么区别?

Has*_*oon 3 java authentication authorization spring-security spring-boot

我正在开发一个 java spring boot 项目,我正在尝试使用 JWT 为用户身份验证设置 spring 安全性,我正在关注的教程(以及我在互联网上找到的许多教程和项目)讨论了两个部分-认证和授权

在大多数教程中,有两个过滤器类,一个处理身份验证,另一个处理授权!(有些我发现只有一个类扩展了OncePerRequestFilter类)。

在那些有两个过滤器类的项目中, Authentication 过滤器类扩展了UsernamePasswordAuthenticationFilter类。授权类扩展BasicAuthenticationFilter类。

有没有办法只能在我的项目中使用身份验证部分,或者我应该使用这两个类在 spring 安全中设置用户身份验证?

任何解释将不胜感激。

Pra*_*ngi 5

有没有办法只能在我的项目中使用身份验证部分,或者我应该使用这两个类在 spring 安全中设置用户身份验证?

不,没有仅认证部分的概念,您对 spring 安全有错误的看法,spring 安全完全是关于使用默认配置或通过实现自定义配置的配置。(AuthenticationFiltersAuthenticationProvidersAuthenticationToken等)


Spring 安全是关于身份验证和授权的,Spring 安全是通过在 web.xml 中声明一个过滤器 DelegatingFilterProxy 来配置的(在 Spring boot 中,它将通过自动配置来完成)。

根据代理过滤器或 spring 管理的 bean,Spring 安全性在您的应用程序之前放置了一个WALL ( HttpFireWall )。如果身份验证和授权部分都成功,则请求可以到达您的应用程序。

1. 认证就是对用户的识别。

它会经历

  • 验证凭据或
  • 验证授权标头内容或
  • 验证与请求关联的 cookie(JSESSIONID cookie),即会话
  • 如果以上都不匹配,则用户被标识为匿名。

在此步骤中,Authentication 将创建对象。从 auth 对象你可以得到

  • details 对象(有关身份验证请求的其他详细信息)
  • 主要对象UserDetailsAuthenticatedPrincipalPrincipal
  • 凭据(通常是密码,但可以是与 相关的任何内容AuthenticationManager
  • 授予权限的集合
  • 和一个布尔认证的.

2. 授权就是访问决策。

会有FilterSecurityInterceptor哪些来自于它得到了过滤器链几乎是最后一个Authentication从对象SecurityContext和被授予的权限列表(角色授予),它会做出决定是否允许该请求到达请求的资源与否,决定通过与配套制造中配置的允许 AntMatchers HttpSecurityConfiguration

考虑例外 401-UnAuthorized 和 403-Forbidden。这些决定将在过滤器链的最后完成
401-UnAuthorized : Un认证用户试图访问安全资源。
403-Forbidden:经过身份验证的用户尝试访问受限资源。
未经身份验证的用户将被允许访问不受限制的资源,他不会收到未经授权的错误,但由未经身份验证的用户AnonymousAuthenticationFilter设置权限ROLE_ANONYMOUS来处理。

注意
下面给出的过滤器排序。其中,
身份验证是@order-4
授权是@Order-9(Last)

来自 Doc
Spring Security 有几个领域,您定义的模式针对传入的请求进行测试,以确定应如何处理请求。当FilterChainProxy决定请求应该通过哪个过滤器链以及FilterSecurityInterceptor决定哪些安全约束应用于请求时,就会发生这种情况。在针对您定义的模式进行测试时,了解机制是什么以及使用什么 URL 值非常重要。

过滤器排序
过滤器在链中定义的顺序非常重要。无论您实际使用哪种过滤器,顺序应如下所示:
1. ChannelProcessingFilter,因为它可能需要重定向到不同的协议
2.SecurityContextPersistenceFilter,因此可以在 Web 请求开始时在 SecurityContextHolder 中设置 SecurityContext,并且可以将 SecurityContext 的任何更改复制到HttpSessionWeb 请求结束时(准备用于下一个 Web 请求)
3. ConcurrentSessionFilter,因为它使用SecurityContextHolder功能,但需要更新SessionRegistry,以反映从主正在进行请求
4.认证处理机制- UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter一样等等-这样SecurityContextHolder可以被修改,以包含令牌有效的认证请求
5SecurityContextHolderAwareRequestFilter,如果你正在使用它将 Spring Security 感知安装HttpServletRequestWrapper到您的 servlet 容器中
6.RememberMeAuthenticationFilter,这样如果没有较早的认证处理机制更新SecurityContextHolder,并且请求提供了一个 cookie 使记住我的服务发生,一个合适的记住的 Authentication 对象将放在那里
7. AnonymousAuthenticationFilter,这样如果没有较早的认证处理机制更新了SecurityContextHolder, 一个匿名的 Authentication 对象将放在那里
8. ExceptionTranslationFilter, 捕捉任何 Spring Security 异常,以便可以返回 HTTP 错误响应或AuthenticationEntryPoint启动适当的
9. FilterSecurityInterceptor, 保护 Web URI 并在访问被拒绝时引发异常

只是为了对 Spring Security 中的过滤器有所了解

在此处输入图片说明

最后,如果您不熟悉 Spring Security。我的建议是尝试最多的示例并花更多时间在调试日志上并尝试理解流程。