当前位置: 首页 > news >正文

成都分类信息网站开发jsp网站开发实例教学

成都分类信息网站开发,jsp网站开发实例教学,欢迎访问中国建设银行网上银行网站,为网站添加注册功能Security的认证流程 先明白几个概念(在源码中找下面的方法) 1. AbstractAuthenticationToken抽象类, 令牌的基类 其中的方法和属性 authenticated:为true表示认证,为false表示未认证,用户有没有认证就是…

Security的认证流程

先明白几个概念(在源码中找下面的方法)

1. AbstractAuthenticationToken抽象类, 令牌的基类

  • 其中的方法和属性
  1. authenticated:为true表示认证,为false表示未认证,用户有没有认证就是设置这个属性的值
  2. authorities:权限信息
  3. getPrincipal():返回认证主体(通常是用户信息)。getCredentials():返回认证凭证(例如密码、验证码等)。
实现AbstractAuthenticationToken抽象类的具体类
  • 其中的主要的方法和属性
  1. 构造方法:参数是用户名、密码的构造方法,方法中会设置authenticated未为认证状态也就是false
  2. 构造方法:参数是用户名、密码、权限的构造方法,方法中会设置authenticated未为认证状态也就是true
  3. static authenticated():调用构造方法,返回一个认证的对象

2. AuthenticationProvider接口,它的实现类就是认证者,其中定义了认证的逻辑

  • 其中主要的属性和方法
  1. authenticate():通过验证用户名和密码,调用AbstractAuthenticationToken类的static authenticated()方法,用户就通过认证
    • authenticate()方法中使用了UserDetailsService 的实现类,而这个实现类会调用它的loadUserByUsername方法,在这个方法中会去数据库查询用户的所有信息,并返回,继续在authenticate()中认证
  2. supports(): 这个认证者支持认证那一类AbstractAuthenticationToken的实现类

3. AuthenticationManager :Provider的管理者,所有认证者都由他管理

  • 作用:选择一个合适的Provider执行它里面的authenticate()
  • 它只有一个抽象方法:Authentication authenticate()
  • 如何选择合适的Provider

以下代码中的Token指的是AbstractAuthenticationToken的实现类,Provider指的是AuthenticationProvider的实现类,不然代码过长

  • 当执行authenticationManager.authenticate(Token)方法去认证Token时,authenticationManager会遍历每一个注册的Provider从它的supports()中找到可以认证这个TokenProvider

Security原生的令牌和认证,执行流程

  1. 如果使用Security提供的登录方式,制作令牌和调用认证都由UsernamePasswordAuthenticationFilter过滤器处理
  2. 用户输入用户名、密码点击确定后UsernamePasswordAuthenticationFilter过滤器获得用户名和密码,调用Authentication attemptAuthentication方法制造了一个UsernamePasswordAuthenticationToken令牌并交给认证者
  3. 调用DaoAuthenticationProvider中的authenticate方法,这个方法在它的父类AbstractUserDetailsAuthenticationProvider中,在这个方法调用了以下方法:
    • retrieveUser()抽象方法,由具体类DaoAuthenticationProvider实现,作用:返回从数据库查询的用户信息
    • additionalAuthenticationChecks()抽象方法,由DaoAuthenticationProvider实现,作用:用户输入的密码与数据库密码做比对
    • createSuccessAuthentication()抽象方法,由DaoAuthenticationProvider实现,作用:检查密码是否泄露,并调用父类认证成功的方法
    • createSuccessAuthentication()具体方法,作用:1. 将令牌UsernamePasswordAuthenticationToken设置为认证通过状态;2. 执行getAuthorities()方法设置用户拥有的权限,用于cotroller中鉴权

有来项目认证流程

  • 以下是使用用户名和密码登录的流程,因为没有使用使用默认的配置,原来接收用户名和密码的过滤器就无法获取到用户名和密码

  1. 用户发送用户名和密码,controller接收
// package com.youlai.boot.shared.auth.controller;
@RequestMapping("/api/v1/auth")
public class AuthController {@PostMapping("/login")public Result<AuthenticationToken> login( @RequestParam String username,@RequestParam String password) {AuthenticationToken authenticationToken = authService.login(username, password);return Result.success(authenticationToken);}
}
  1. controller调用service:AuthenticationToken authenticationToken = authService.login(username, password);
// package com.youlai.boot.shared.auth.service.impl;
@Service
public class AuthServiceImpl implements AuthService {@Overridepublic AuthenticationToken login(String username, String password) {// 1. 创建用于密码认证的令牌(未认证)UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(username.trim(), password);// 2. 执行认证(认证中)Authentication authentication = authenticationManager.authenticate(authenticationToken);// 3. 认证成功后生成 JWT 令牌,并存入 Security 上下文,供登录日志 AOP 使用(已认证)AuthenticationToken authenticationTokenResponse =tokenManager.generateToken(authentication);SecurityContextHolder.getContext().setAuthentication(authentication);return authenticationTokenResponse;}
}
  1. new UsernamePasswordAuthenticationToken(username.trim(), password):生成令牌,其中主要的是用户输入的用户名、密码和认证成功与否的标志
  2. Authentication authentication = authenticationManager.authenticate(authenticationToken);
    • AuthenticationManager 是 Spring Security 提供的一个接口,负责选择一个合适的Provider去验证
      • 验证就是调用Providerauthenticate 方法。所以在执行authenticationManager.authenticate()时其实执行的是Provider.authenticate()
    • Provider.authenticate() 方法的作用:
      1. 获取到用户的数据库数据
      2. 用户输入的密码与数据库密码做比对
      3. 比对成功后将authenticationToken置为成功状态,并将数据库查询到的权限生成权限集合用于权限校验
  3. SysUserDetailsService.loadUserByUsername 方法
    • userService.getUserAuthInfo:从数据库获取用户详细信息(主要是密码、权限)
// package com.youlai.boot.core.security.service;
@Service
public class SysUserDetailsService implements UserDetailsService {private final UserService userService;// 根据用户名获取用户信息@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {try {UserAuthInfo userAuthInfo = userService.getUserAuthInfo(username);	// UserAuthInfo 数据表对应的实体类if (userAuthInfo == null) {throw new UsernameNotFoundException(username);}return new SysUserDetails(userAuthInfo);} catch (Exception e) {// 记录异常日志log.error("认证异常:{}", e.getMessage());// 抛出异常throw e;}}
}
  1. 实现了UserDetails接口的实体类
    • 用户的信息和权限就全有了
// package com.youlai.boot.core.security.model;
@Data
@NoArgsConstructor
public class SysUserDetails implements UserDetails {... // 省略了很多属性// 用户角色权限集合private Collection<SimpleGrantedAuthority> authorities;/*** 构造函数:根据用户认证信息初始化用户详情对象** @param user 用户认证信息对象 {@link UserAuthInfo}*/public SysUserDetails(UserAuthInfo user) {this.userId = user.getUserId();this.username = user.getUsername();this.password = user.getPassword();this.enabled = ObjectUtil.equal(user.getStatus(), 1);this.deptId = user.getDeptId();this.dataScope = user.getDataScope();// 初始化角色权限集合this.authorities = CollectionUtil.isNotEmpty(user.getRoles())? user.getRoles().stream()// 角色名加上前缀 "ROLE_",用于区分角色 (ROLE_ADMIN) 和权限 (user:add).map(role -> new SimpleGrantedAuthority(SecurityConstants.ROLE_PREFIX + role)).collect(Collectors.toSet()): Collections.emptySet();}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return this.authorities;}
}
http://www.dtcms.com/a/414089.html

相关文章:

  • SpringBoot 的启动原理
  • 墙绘产品展示交易平台|基于SpringBoot和Vue的墙绘产品展示交易平台(源码+数据库+文档)
  • 开源项目Sherpa-onnx:全平台离线语音识别的轻量级高性能引擎
  • 【大数据技术】ClickHouse配置详细解读
  • 企业网站建设价格表好的电商网站建设与维护意味着什么
  • Spring AI(七)Spring AI 的RAG实现集合火山向量模型+阿里云Tair(企业版)
  • 情绪点设置在开源AI大模型驱动的S2B2C商城小程序AI智能名片中的应用研究
  • 246-基于Django的美食菜谱数据分析推荐系统
  • 阿里云ECS服务器网站配置HTTPS连接
  • 带有渐变光晕
  • 针织厂家东莞网站建设河北教育网站建设
  • MySQL InnoDB压缩:OLTP性能优化实战
  • 【软件架构设计(40)】数据库规范化与性能优化
  • 鸿蒙NEXT蓝牙服务开发概述:构建无缝连接的物联网体验
  • 5G-A无源物联网:深度解析“不插电“智能的底层技术原理
  • Oracle与Kingbase深度兼容体验:从连接配置到性能优化全解析
  • github push 端口不通解决方案
  • OpenLayers地图交互 -- 章节十四:拖拽缩放交互详解
  • C++中 optional variant any 的使用
  • unity3d PuppetMaster 布娃娃插件在学习
  • 复古胶片风格室内人像自拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 网站开发之前前后端不分离wordpress 缓存首页
  • 【仿生机器人】基于 GPT-SoVITS 的 发声器
  • 二分查找思路详解,包含二分算法的变种,针对不同题的做法
  • 58同城枣庄网站建设wordpress 会员分值
  • C# .NetCore WebApi 性能改进 响应压缩
  • PyTorch CNN 改进:全局平均池化与 CIFAR10 测试分析
  • 精读C++20设计模式——创造型设计模式:单例模式
  • 网络实践——基于epoll_ET工作、Reactor设计模式的HTTP服务
  • 设计模式-行为型设计模式(针对对象之间的交互)