Spring Security知识学习
[TOC]
Spring Security原理相关知识
基本概念
Spring Security是一个基于Spring框架的安全框架,主要用于对用户的认证授权等功能。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
授权:经过认证后判断当前用户是否有权限进行某个操作
具体流程
- 流程图:
Spring Security的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的拦截器。
- 详细流程图
⭐⭐
所谓认证授权的详细流程,就是用户在登录时提交用户名和密码,UsernamePasswordAuthenticationFilter过滤器把用户名和密码封装为Authentication对象进行认证,通过一系列过滤器,在loadUserByUsername方法中从数据库中查询对应的用户信息,并将用户信息和该用户的权限信息(授权)一并通过实现了UserDetails接口的实现类返回,并在返回中的过滤器中设置SecurityContextHolder存放用户的权限信息。
常见面试题
- 如何对密码进行加密
在 Spring Security 中对密码进行加密通常使用的是密码编码器(PasswordEncoder)。PasswordEncoder 的作用是将明文密码加密成密文密码,以便于存储和校验。Spring Security 提供了多种常见的密码编码器,例如 BCryptPasswordEncoder。
- SecurityContextHolder作用
SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在SecurityContextHolder中。
SecurityContextHolder默认使用ThreadLocal策略来存储认证信息。看到ThreadLocal 也就意味着,这是一种与线程绑定的策略。Spring Security在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。
- Spring Security是如何完成身份认证的?
用户名和密码被过滤器获取到,封装成Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。
AuthenticationManager 身份管理器负责验证这个Authentication
认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例。
SecurityContextHolder安全上下文容器将第3步填充了信息的Authentication,通过SecurityContextHolder.getContext().setAuthentication(…)方法,设置到其中。