[TOC]

Spring Security原理相关知识

基本概念

Spring Security是一个基于Spring框架的安全框架,主要用于对用户的认证授权等功能。

认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户

授权:经过认证后判断当前用户是否有权限进行某个操作

具体流程

  • 流程图:

image-20230723214953358

Spring Security的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。

UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。

FilterSecurityInterceptor:负责权限校验的拦截器。

  • 详细流程图

image-20230723215418090

⭐⭐

所谓认证授权的详细流程,就是用户在登录时提交用户名和密码,UsernamePasswordAuthenticationFilter过滤器把用户名和密码封装为Authentication对象进行认证,通过一系列过滤器,在loadUserByUsername方法中从数据库中查询对应的用户信息,并将用户信息和该用户的权限信息(授权)一并通过实现了UserDetails接口的实现类返回,并在返回中的过滤器中设置SecurityContextHolder存放用户的权限信息。

常见面试题

  1. 如何对密码进行加密

在 Spring Security 中对密码进行加密通常使用的是密码编码器(PasswordEncoder)。PasswordEncoder 的作用是将明文密码加密成密文密码,以便于存储和校验。Spring Security 提供了多种常见的密码编码器,例如 BCryptPasswordEncoder。

  1. SecurityContextHolder作用

SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在SecurityContextHolder中。

SecurityContextHolder默认使用ThreadLocal策略来存储认证信息。看到ThreadLocal 也就意味着,这是一种与线程绑定的策略。Spring Security在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。

  1. Spring Security是如何完成身份认证的?
  1. 用户名和密码被过滤器获取到,封装成Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。

  2. AuthenticationManager 身份管理器负责验证这个Authentication

  3. 认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例。

  4. SecurityContextHolder安全上下文容器将第3步填充了信息的Authentication,通过SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中。