Spring Security 是一种基于 Spring AOP 和 Servlet 过滤器 Filter 的安全框架,它提供了全面的安全解决方案,提供在 Web 请求和方法调用级别的用户鉴权和权限控制。
Web 应用的安全性通常包括两方面:用户认证(Authentication)和用户授权(Authorization)。
用户认证指的是验证某个用户是否为系统合法用户,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证。
用户授权指的是验证某个用户是否有权限执行某个操作。
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(); }
安全上下文,主要持有Authentication对象,如果用户未鉴权,那Authentication对象将会是空的。该示例可以通过SecurityContextHolder.getContext静态方法获取
AuthenticationManager接口只包含一个方法,那就是认证,它是认证相关的核心接口,也是发起认证的出发点。实际业务中可能根据不同的信息进行认证,所以Spring推荐通过实现AuthenticationManager接口来自定义自己的认证方式.Spring提供了一个默认的实现,ProviderManager。
其实ProviderManager不是自己处理身份验证请求,它将委托给配置的AuthenticationProvider列表,按照顺序进行依次认证,每个provider都会尝试认证,或者通过简单地返回null来跳过验证。如果所有实现都返回null,那么ProviderManager将抛出一个ProviderNotFoundException
AuthenticationProvider接口提供了两个方法,一个是真正的认证,另一个是满足什么样的身份信息才进行如上认证。
认证完成后, AuthenticationManager 将会返回该认证对象(UsernamePasswordAuthenticationToken)返回给过滤器
UsernamePasswordAuthenticationFilter
过滤器获取到,封装为请求Authentication,通常情况下是UsernamePasswordAuthenticationToken
这个实现类。认证管理器(AuthenticationManager)
进行认证Authentication
实例。SecurityContextHolder 安全上下文容器
将第3步填充了信息的 Authentication ,通过SecurityContextHolder.getContext().setAuthentication(...)
方法,设置到其中。可以看出AuthenticationManager接口(认证管理器)是认证相关的核心接口,也是发起认证的出发点,它 的实现类为ProviderManager。而Spring Security支持多种认证方式,因此ProviderManager维护着一个AuthenticationProvider
完成的。咱们知道web表单的对应的AuthenticationProvider实现类为DaoAuthenticationProvider
,它的内部又维护着一个UserDetailsService
负责UserDetails的获取。最终AuthenticationProvider
将UserDetails填充至Authentication。参考文章:
https://blog.csdn.net/sinat_29899265/article/details/80653167