学习 Spring-security
Spring-security
过滤器:用户名密码认证、异常处理。授权
认证流程:
登录:
- 自定义登录接口
调用ProviderManager 进行认证,认证通过生成jwt
把用户信息存入redis ——》k,v - id,token 或 token,userInfo
- 自定义UserDetailsService
查询数据库
校验:
定义Jwt认证过滤器
获取token
解析token获取其中的userid
从redis中获取用户信息
存入SecurityContextHolder
权限:user、role、user_role表
退出登录:token在redis中删除
Spring-security充分利用 Spring 的 IoC 和 AOP 功能
Spring-security 用来做身份验证以及权限控制
Spring Security +JWT+redis 实现登入登出以及权限校验
JWT是什么?
是个字符串,头部.载荷.签名 like: xxxx.xxxx.xxxx
JWT(JSON Web Token)是一种基于Token的认证机制,用于在客户端和服务器之间建立安全的双向通信。它由三个部分组成:Header、Payload和Signature。
Header:包含JWT的类型(如:JWT)、签名算法(如:HS256)、以及生成该JWT的客户端的ID等信息。
Payload:包含JWT的声明信息,如:用户ID、用户角色、过期时间等。
Signature:对Header和Payload的签名,用于验证数据的完整性和身份。
token是什么?
userId+加密后的密码Token是指通过加密算法生成的用于身份验证的令牌。Token通常包含身份信息、过期时间等信息,用于验证用户的身份和权限。在身份验证系统中,服务器会生成一个Token,并将其发送给客户端。客户端在下次访问时需要携带这个Token,以便服务器验证用户身份。
JWT校验过程
- 浏览器发送用户名和密码 发起登录请求
- 服务端验证身份 根据算法将用户标识符打包生成token字符串 并且返回给浏览器
- 当浏览器需要发起请求时 将token一起发送给服务器
- 服务器发现数据中携带有token 随即进行解密和鉴权
- 校验成功 服务器返回请求的数据
JWT工具类:生成、验证
生成token
放入header中的Authorization
Authorization: Bearer <token string>过滤器
登录过滤器:拦截用户登录信息,验证交给Spring security
AuthenticationManager.authenticate()
UsernamePasswordAuthenticationFilter 它负责检查用户是否已经登录,并从请求中获取用户名和密码进行验证。如果用户已登录,它将创建一个用户对象并将其存储在 SecurityContextHolder 中。如果用户未登录,它将返回一个未授权的响应。
权限验证过滤器:登录成功后的鉴权操作
- BasicAuthenticationFilter
或合并两过滤器
- OncePerRequestFilter 全局过滤器 仅执行一次,可以设置日志记录
异常相关
访问无权时的拦截器类:处理认证过的用户访问需要权限的异常handler,返回“你未登录 你没有访问权限”,实现
AccessDeniedHandlerAuthenticationEntryPoint,用于匿名访问资源无权限的处理,实现
AuthenticationEntryPointsecurity-config配置类:组装各种过滤器拦截器、异常处理point、配置拦截什么接口
service 实现 UserDetailsService 重写loadUserByUsername(String username)方法 用于身份验证
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; //UserDetails 包含用于构建认证对象的必要信息(例如:用户名,密码controller
扩:BCrypt加密存进数据库、redis存token
spring security获取session
Filter
切面
Filter.doFilter() 可做日志打印
H2数据库 嵌入式内存数据库 适合写demo用,一旦重启项目就清空
可通过在启动类中初始化角色信息
三种模式:内嵌模式(应用程序和数据库在同一个JVM中)、服务器模式(使用jdbc远程连接)、混合模式
BCryptPasswordEncoder
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
//加密
String password = bCryptPasswordEncoder.encode("123");
//验证
boolean matches = bCryptPasswordEncoder.matches(loginPassword, password);

浙公网安备 33010602011771号