根据用户名称实现单点登录

一、参数格式

二、后端实现

Controller层
public class IAccessTokenLoginController extends BaseController {@Autowiredprivate ISysUserService sysUserService;@Autowiredprivate ISingleTokenServiceImpl tokenService;/*** 登录方法** @return 结果*/@PostMapping("/login")public AjaxResult singleLogin(@RequestBody LoginBody loginBody) {String accessToken = loginBody.getAccessToken();if (StringUtils.isNotEmpty(accessToken)) {String tokenNew = tokenService.singleLogin(accessToken);AjaxResult ajax = AjaxResult.success();ajax.put(Constants.TOKEN, tokenNew);return ajax;} else {return AjaxResult.error();}}
}
注意:LoginBody新增变量accessToken
@Service
public class ISingleTokenServiceImpl implements ISingleTokenService {@Autowiredprivate TokenService tokenService;@Autowiredprivate AuthenticationManager authenticationManager;public String singleLogin(String accessToken) {// 用户验证Authentication authentication = null;String username =accessToken;try{
//            username=parseAccessToken(accessToken);
//不用进行处置 直接传参authentication = authenticationManager.authenticate(new IAuthenticationToken(username));}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();// 生成tokenreturn tokenService.createToken(loginUser);}public String parseAccessToken(String accessToken) {try {// 从 access token 中提取 payloadClaims claims = Jwts.parser().parseClaimsJws(accessToken).getBody();// 获取 usernameString username = (String) claims.get("username");return username;} catch (Exception e) {System.out.println("无法解析 access token!" + e);return null;}}
  • 添加自定义IAuthenticationToken 
  • public class IAuthenticationToken extends AbstractAuthenticationToken {private final Object principal;public IAuthenticationToken(Object principal) {super(null);this.principal = principal;this.setAuthenticated(false);}public IAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {super(authorities);this.principal = principal;super.setAuthenticated(true);}@Overridepublic Object getCredentials() {return null;}@Overridepublic Object getPrincipal() {return this.principal;}@Overridepublic void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {if (isAuthenticated) {throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");}super.setAuthenticated(false);}@Overridepublic void eraseCredentials() {super.eraseCredentials();}}
    

    添加IAuthenticationProvider

  • @Component
    public class IAuthenticationProvider implements AuthenticationProvider {@Autowiredprivate UserDetailsServiceImpl userDetailsService;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {IAuthenticationToken authenticationToken = (IAuthenticationToken) authentication;String username = (String) authenticationToken.getPrincipal();UserDetails user = userDetailsService.loadUserByUsername(username);IAuthenticationToken result = new IAuthenticationToken(user, Collections.emptyList());/*Details 中包含了 ip地址、 sessionId 等等属性 也可以存储一些自己想要放进去的内容*/result.setDetails(authenticationToken.getDetails());return result;}@Overridepublic boolean supports(Class<?> aClass) {return IAuthenticationToken.class.isAssignableFrom(aClass);}
    }
    

    修改SecurityConfig 放行我们的请求登录路径 并把自定义认证加进来
    .antMatchers("/hello","/single/login","/login", "/register", "/captchaImage").anonymous()
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        

    auth.authenticationProvider(new CustomLoginAuthenticationProvider(userDetailsService));
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    auth.authenticationProvider(iAuthenticationProvider);

    }

  • 前端根据后台返回的token进行访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

器件选型【二极管,电感篇】

二极管篇&#xff1a; 一句话总结&#xff1a;二极管选型时主要考虑二极管的最大反向电压&#xff0c;反向电流&#xff0c;最高工作频率&#xff08;由结电容决定&#xff09;,反向恢复时间 二极管的主要作用是防反接&#xff0c;续流 二极管结电容: 在高频电路中&#xff…

JeecgBoot Vue3前端项目性能优化按需加载方案

JeecgBoot vue3前端项目在 3.5.5 版本之前&#xff0c;的确存在很严重的性能问题&#xff0c;大家可以参考以下文档进行升级。 按需加载改造方法 1、全局注册地方去掉2、组件改成异步注册3、用不到的大组件可以删掉 【精简项目方案】 大组件 1、富文本 tinyme2、Markdown3、…

NVIDIA GTC 2024将回归线下

NVIDIA 宣布将于 3 月 18 日至 21 日在圣何塞会议中心举办 GTC 2024 大会。预计将有超 30 万人亲临现场或线上注册参会。NVIDIA 创始人兼首席执行官黄仁勋将于太平洋时间 3 月 18 日&#xff08;星期一&#xff09;下午 1 点&#xff0c;即北京时间 3 月 19 日&#xff08;星期…

前端- 基础 表单标签 - 使用场景及组成

大家都有到银行去办理业务的时候&#xff0c;大多数情况下会填一些 纸质的表之类的东西如下图 而我们在网页中也会经常遇到 像现实生活中在银行填表那样的情景&#xff0c;如下图 &#xff1a; 上示就是 网页中的表单的使用场景了 表单标签 &#xff1a; 为什么需要表单 …

290. Word Pattern一个击败了100C++用户的代码

题目描述 Given a pattern and a string s, find if s follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s. Example 1&#xff1a; Input: pattern “abba”, s “dog c…

吴恩达机器学习笔记:第5周-9 神经网络的学习1(Neural Networks: Learning)

目录 9.1 代价函数9.2 反向传播算法9.3 反向传播算法的直观理解 9.1 代价函数 首先引入一些便于稍后讨论的新标记方法&#xff1a; 假设神经网络的训练样本有&#x1d45a;个&#xff0c;每个包含一组输入&#x1d465;和一组输出信号&#x1d466;&#xff0c;&#x1d43f;…

【2024】使用Vuetifi搭建vue3+Ts项目,并使用tailwind.css

目录 使用Vuetifi搭建项目使用tailwind.css 只要跟着官方文档来就不会出错。 使用Vuetifi搭建项目 npm create vuetifyyarn create vuetifypnpm create vuetifybun create vuetify在终端运行一个就行&#xff0c;之后就可以选配置了。 使用tailwind.css 先运行&#xff1a; …

【数据结构】数组、双链表代码实现

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Spring中最常用的11个扩展点

前言 我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。 除…

C++输入输出(I\O)

我们知道C是由C语言发展而来的&#xff0c;几乎完全兼容C语言&#xff0c;换句话说&#xff0c;你可以在C里面编译C语言代码。如下图: C语言是面向过程的语言&#xff0c;C在C语言之上增加了面向对象以及泛型编程机制&#xff0c;因此C更适合中大型程序的开发&#xff0c;然而C…

kafka(三)springboot集成kafka(1)介绍

一、相关组件介绍 1、pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency> </dependencies> 2、k…

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…

计网面试题整理上

1. 计算机网络的各层协议及作用&#xff1f; 计算机网络体系可以大致分为一下三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。 OSI七层模型&#xff1a;大而全&#xff0c;但是比较复杂、而且是先有了理论模型&#xff0c;没有实际应用。TCP/IP四层模型&#xff1a…

【三维重建】相移法+格雷码

本篇文章介绍一种稠密点云的获取方式——条纹结构光三维重建算法。 在学习此算法前&#xff0c;我们需要对基于视觉的三维重建算法有一定了解。 需要了解什么是相机模型、相机标定以及三角化的相关知识。 【三维重建】摄像机几何-CSDN博客 【三维重建】摄像机标定&#xff…

微信小程序-2

数据绑定 index.js Page({data: {info: hello world,randomNumber: Math.random() * 10,imgSrc:http://www.itheima.com/images/logo.png} })index.wxml <view>{{ info }}</view><view>{{ randomNumber > 5 ? 随机数大于等于5 : 随机数小于5 }}</v…

低密度奇偶校验码LDPC(七)——SPA和积译码算法的简化

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

神经网络推理优化方法总结

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

Jenkins 的安装(详细教程)

文章目录 一、简介二、安装前准备三、windows 安装与启动1. 方式一2. 方式二3. 方式三 四、创建管理员用户五、常用设置1. 配置镜像地址2. 更改工作目录3. 开启可注册用户4. 全局变量配置 一、简介 官网&#xff1a;https://www.jenkins.io 中文文档&#xff1a;https://www.j…

【MGR】MySQL Group Replication快速开始

目录 17.2 Getting Started 17.2.1 Deploying Group Replication in Single-Primary Mode 17.2.1.1 Deploying Instances for Group Replication 17.2.1.2 Configuring an Instance for Group Replication Storage Engines Replication Framework Group Replication Sett…

Java基础概念 1-6注释关键字字面量变量-基本用法变量-使用方式和注意事项变量练习-计算公交车的人数

Java基础概念 1-注释 单行注释 // 多行注释 /* */ 文档注释 /** */ --暂时不用 例: public class HelloWorld{ //main方法,表示程序的主入口.public static void main (String[] args){/*输出语句(打印语句)会把小括号内的内容进行输出打印.*/System.out.…