Spring Security是什么
Spring Security 是一种基于 Spring AOP 和 Servlet 过滤器 Filter 的安全框架,它提供了全面的安全解决方案,提供在 Web 请求和方法调用级别的用户鉴权和权限控制。
Web 应用的安全性通常包括两方面:用户认证(Authentication)和用户授权(Authorization)。
-
用户认证指的是验证某个用户是否为系统合法用户,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证。
-
用户授权指的是验证某个用户是否有权限执行某个操作。
核心组件
SecurityContextHolder、
SecurityContextHolder 是最基本的对象,它负责存储当前安全上下文信息。即保存着当前用户是什么,是否已经通过认证,拥有哪些权限。。。等等。SecurityContextHolder默认使用ThreadLocal策略来存储认证信息,意味着这是一种与线程绑定的策略。在Web场景下的使用Spring Security,在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
SecurityContext
安全上下文,主要持有Authentication对象,如果用户未鉴权,那Authentication对象将会是空的。该示例可以通过SecurityContextHolder.getContext静态方法获取
Authentication
- getAuthorities,权限列表,通常是代表权限的字符串列表;
- getCredentials,密码信息,由用户输入的密码凭证,认证之后会移出,来保证安全性;
- getDetails,细节信息,Web应用中一般是访问者的ip地址和sessionId;
- getPrincipal, 最重要的身份信息,一般返回UserDetails的实现类;
UserDetails 和 UserDetailsService
AuthenticationManager
AuthenticationManager接口只包含一个方法,那就是认证,它是认证相关的核心接口,也是发起认证的出发点。实际业务中可能根据不同的信息进行认证,所以Spring推荐通过实现AuthenticationManager接口来自定义自己的认证方式.Spring提供了一个默认的实现,ProviderManager。
ProviderManager
其实ProviderManager不是自己处理身份验证请求,它将委托给配置的AuthenticationProvider列表,按照顺序进行依次认证,每个provider都会尝试认证,或者通过简单地返回null来跳过验证。如果所有实现都返回null,那么ProviderManager将抛出一个ProviderNotFoundException
AuthenticationProvider
AuthenticationProvider接口提供了两个方法,一个是真正的认证,另一个是满足什么样的身份信息才进行如上认证。
认证完成后, AuthenticationManager 将会返回该认证对象(UsernamePasswordAuthenticationToken)返回给过滤器
认证流程:
- 用户提交用户名、密码被SecurityFilterChain中的
UsernamePasswordAuthenticationFilter
过滤器获取到,封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken
这个实现类。 - 然后过滤器将Authentication提交至
认证管理器(AuthenticationManager)
进行认证 - 认证成功后, AuthenticationManager 身份管理器返回一个被填充满了信息的(包括上面提到的权限信息, 身份信息,细节信息,但密码通常会被移除)
Authentication
实例。 SecurityContextHolder 安全上下文容器
将第3步填充了信息的 Authentication ,通过SecurityContextHolder.getContext().setAuthentication(...)
方法,设置到其中。可以看出AuthenticationManager接口(认证管理器)是认证相关的核心接口,也是发起认证的出发点,它 的实现类为ProviderManager。而Spring Security支持多种认证方式,因此ProviderManager维护着一个
List 列表,存放多种认证方式,最终实际的认证工作是由AuthenticationProvider
完成的。咱们知道web表单的对应的AuthenticationProvider实现类为DaoAuthenticationProvider
,它的内部又维护着一个UserDetailsService
负责UserDetails的获取。最终AuthenticationProvider
将UserDetails填充至Authentication。
参考文章:
https://blog.csdn.net/sinat_29899265/article/details/80653167