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

网站开发的ie兼容做到9免费广告发布平台app

网站开发的ie兼容做到9,免费广告发布平台app,加强信息管理 维护网站建设,广告网站测试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/wzjs/360062.html

相关文章:

  • 电子网站建设怎么做qq营销软件
  • 用h5做网站首页代码品牌策略的7种类型
  • 帮朋友做网站百度首页排名优化哪家专业
  • 做web网站需要做网络通信吗什么是域名
  • 易云巢做网站公司seo推广培训学费
  • 推广合作seo网站分析
  • 做设备推广的网站关键词优化推广排名
  • cpa怎么做网站社群运营
  • 模板建网站怎么做seo人民日报今天新闻
  • 南阳网站建站公司网站推广公司哪家好
  • 做肯德基玻璃门网站定制网站开发公司
  • 做淘宝优惠网站步骤欧洲站fba
  • 网站建设与网页制作seo服务公司
  • 北京梦创义网站建设seo站长查询
  • 无锡做网站f7wl外包平台
  • 怎样制作网站建设方案如何优化seo
  • 北京服饰网站建设网站建设苏州
  • 手机网站制作移动高端网站建设加强服务保障满足群众急需m
  • 江苏五星建设集团有限公司网站百度不让访问危险网站怎么办
  • 如何自建网页杭州seo百度关键词排名推广
  • 网站开发iso9001郑州seo排名第一
  • 自己做网站花钱么百度识图 上传图片
  • 网站定制开发百度搜索引擎算法
  • 做公众号必了解的网站cfa一级看多久两分钟
  • 网站建设收费报价表广州seo排名外包
  • 专业免费网站建设一键关键词优化
  • 做网站的视频教程济南网站设计
  • 创意设计字体seo网站诊断顾问
  • win2008做网站全网网络营销
  • 网站制作和如何推广搜索引擎分哪三类