学习 Spring-security

Spring-security

过滤器:用户名密码认证、异常处理。授权

认证流程:

登录:

  1. 自定义登录接口

调用ProviderManager 进行认证,认证通过生成jwt

把用户信息存入redis ——》k,v - id,token 或 token,userInfo

  1. 自定义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。

  1. Header:包含JWT的类型(如:JWT)、签名算法(如:HS256)、以及生成该JWT的客户端的ID等信息。

  2. Payload:包含JWT的声明信息,如:用户ID、用户角色、过期时间等。

  3. Signature:对Header和Payload的签名,用于验证数据的完整性和身份。

token是什么?

userId+加密后的密码

Token是指通过加密算法生成的用于身份验证的令牌。Token通常包含身份信息、过期时间等信息,用于验证用户的身份和权限。在身份验证系统中,服务器会生成一个Token,并将其发送给客户端。客户端在下次访问时需要携带这个Token,以便服务器验证用户身份。

JWT校验过程

  1. 浏览器发送用户名和密码 发起登录请求
  2. 服务端验证身份 根据算法将用户标识符打包生成token字符串 并且返回给浏览器
  3. 当浏览器需要发起请求时 将token一起发送给服务器
  4. 服务器发现数据中携带有token 随即进行解密和鉴权
  5. 校验成功 服务器返回请求的数据
  • JWT工具类:生成、验证

    生成token

    放入header中的Authorization

    Authorization: Bearer <token string>
    
  • 过滤器

    • 登录过滤器:拦截用户登录信息,验证交给Spring security

      • AuthenticationManager.authenticate()

      • UsernamePasswordAuthenticationFilter 它负责检查用户是否已经登录,并从请求中获取用户名和密码进行验证。如果用户已登录,它将创建一个用户对象并将其存储在 SecurityContextHolder 中。如果用户未登录,它将返回一个未授权的响应。

    • 权限验证过滤器:登录成功后的鉴权操作

      • BasicAuthenticationFilter
    • 或合并两过滤器

      • OncePerRequestFilter 全局过滤器 仅执行一次,可以设置日志记录
  • 异常相关

    • 访问无权时的拦截器类:处理认证过的用户访问需要权限的异常handler,返回“你未登录 你没有访问权限”,实现 AccessDeniedHandler

    • AuthenticationEntryPoint,用于匿名访问资源无权限的处理,实现AuthenticationEntryPoint

  • security-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);   
posted @ 2024-02-22 01:42  你今日食咗饭未  阅读(15)  评论(0)    收藏  举报