认证和授权的概念
认证解决“我是谁”问题
授权解决“我能作什么”的问题
Filter和FilterChain
任何Spring Web应用本质上只是一个Servlet,Security Filter在HTTP请求到达你的Controller之前过滤每一个传入的
Http请求。pring Security 实现认证和授权的地层机制
浏览器->Security Filter ->Tomcat ->检查用户是否认证->没有认证401/403 认证到DispatcherServlet->RestController、Controller
FilterChain
常见的内建过滤器
Http
熟悉Http的请求/响应结构
Filter和客户端交互(获取数据/返回数据)是通过请求/响应中的字段完成的
*/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// http
// .formLogin(Customizer.withDefaults())
// .authorizeRequests(req -> req.antMatchers("/api/greeting")
// .authenticated());
http.authorizeRequests()
.anyRequest().authenticated() //任何请求都会进行认证
.and()
.formLogin() //启用内建的登陆界面
.and()
.httpBasic(); //使用Http Basic Auth认证
}
}
密码进化史
明文-》哈希-》加盐-》自适应
SpringSecurity核心组件
SecurityContext :是用来存储当前认证的用户的详细信息
SecurityContextHolder : 是一个工具类,它提供了对安全上下文的访问。默认情况下,它使用一个ThreadLocal对象来存储安全上下文,这意味着它是线程安全的。
Authentication:存储了当前用户(与应用程序交互的主体)的详细信息,它是Spring认证体系的核心元素
Principal可以理解为用户的信息(比较简单的情况下,有可能是用户名)
Credentials 可以理解为密码
Authorites 可以理解为权限
UserDetailService和UserDetails
通常的场景下用户是具备一系列属性约束
JWT是什么
JWT是Json Web Token的缩写,基于RFC 7159标准定义,可以安全传输的小巧和包含的JSON对象,
使用数字签名的所以是可信任的和安全的,使用HMAC 算法进行加密火灾RSA算法加密
JWT的工作流程
访问令牌和刷新令牌
访问令牌:生命周期要短,一般在几分钟到几小时
刷新令牌:生命周期会长,应该在几到不超过一年
令牌i如何存放:理论上说,直接存放在store中最安全,但刷新浏览器会有重新登陆的行为,如果可以由服务器端直接设置在Cookie中也是比较安全的,都不适合的场景下建议加密后存在SessionStorage中
多因子验证
TOTP-基于时间的一次性密码
授权Authorization
安全表达式