大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂

前言

现在是:2022年4月17日16:19:51

在实际开发中,有时候我们有这样的需求,即,一个体系中的用户是共通的,比如统一体系下,A系统的张三,去B系统中不需要重新注册即可直接登录,今天简单的整理了下,希望对大家有帮助。

效果如下


同步用户至别的系统中

1.配置代理

找到vue.config.js文件,在devServer节点下面配置一个代理:

"/programme": {//本地服务接口地址target: "http://127.0.0.1:6776/api/trainingprograme/",//远程演示服务地址,可用于直接启动项目//target: "http://farbeat.ruixm.club:7665",changeOrigin: true,pathRewrite: {"^/programme": "",},},

2.然后vue页面中写请求方法:

  /*跳转到训练方案的系统*//*跳转到训练方案的系统*/goTraingProgramme() {//先获取当前用户的信息getCurrentUserInfo().then(res=>{const  data = res.data.data;//请求训练方案的系统,将当前用户信息同步过去goTraingProgramme(data).then(() => {var loginForm = {username: data.account,password: data.password,};console.log("loginForm",loginForm);//异步进行登录this.$store.dispatch("LoginPrammeSystem", loginForm).then(()=> {this.$message({type: "warning",message: "正在进入训练方案系统……"});//跳转到训练方案的系统,正式环境下需要更改window.open("http://localhost:1889/");},()=>{this.$message({type: "error",message: "登录失败,请重试!"});});});});},

3.在system/user.js中先获取当前用户的信息,拿着获取到的用户名和密码去训练方案系统登录去

 /*** 获取当前用户的信息* @returns {*}*/export const getCurrentUserInfo = () => {return request({url: "/api/blade-user/getCurrentUserInfo",method: "get",});};

4.后台控制器UserController中的获取当前用户信息的代码如下:

/*** 获取当前用户的信息*/@GetMapping("/getCurrentUserInfo")@ApiOperationSupport(order = 5)@ApiOperation(value = "获取当前用户的信息")public R getCurrentUserInfo() {User user = userService.getById(AuthUtil.getUserId());return R.data(user);}

5.请求训练方案的系统,将当前用户信息同步过去,在js文件中添加如下请求方法:

 /*** 跳转到训练方案的系统* 直接跳过去,暂时不带token* @returns {*}*/export const goTraingProgramme = (userInfo) => {return request({url: "/programme/getModelLogin",method: "post",params: {userInfo,},});};

6.在训练方案的系统中需要将三方系统中同步过来的信息加到数据库中,为后面的单点登录做准备,代码如下:

 /*** 1.直接传过来用户对象,想存什么价就存什么* 2.检测一下运动员表中有没有这个人,有的话跳过,没有则需要加进来* 3.根据账号去查询用户表中有没有这个账户,有的话执行更新操作* 4.用户表作用没有这个账户,则执行添加的操作** @param userInfo* @return 成功的信息*/@ApiOperation("跳转到训练方案的接口,然后调用登陆的方法,然后去首页")@ApiImplicitParams({@ApiImplicitParam(paramType = "header", dataType = "String", name = "Authorization",value = "token令牌,请联系系统人员分配地址", required = true)})@PostMapping(value = "/getModelLogin")public String getModelLogin(String userInfo) {/*** 1.检测运动员表里面有没有传过来的用户,如果有,不添加* 如果没有则添加* 2.根据用户名查询有没有这个人,有:检查密码对不对* 3.没有这个账户,则添加一条记录进去*/JSONObject userObject = JSONObject.parseObject(userInfo);JSONObject jsonObject = new JSONObject();//去查询运动员表QueryWrapper<Athletes> athletesQueryWrapper = new QueryWrapper<>();athletesQueryWrapper.lambda().eq(Athletes:: getWorkcode,userObject.getString("id"));athletesQueryWrapper.last("limit 1");Athletes athletes = athletesService.getOne(athletesQueryWrapper);if(athletes==null){//没有找到,添加进去athletes = new Athletes();athletes.setWorkcode(userObject.getString("id"));athletes.setAname(userObject.getString("id"));athletesService.save(athletes);}//检测用户表/*LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(User::getAccount,userObject.getString("account"));*/User user = userService.userByAccount(userObject.getString("tenantId"),userObject.getString("account"));if(user==null){user = new User();}//创建人是管理员user.setCreateUser(1123598821738675201L);user.setUserType(userObject.getInteger("userType"));user.setPhone(userObject.getString("phone"));//角色(和张三的角色一样)user.setRoleId("1426105929175019521");user.setAccount(userObject.getString("account"));user.setDeptId("1123598813738675201");user.setPassword(userObject.getString("password"));user.setName(userObject.getString("name"));//调用修改和添加的方法userService.saveOrUpdate(user);jsonObject.put("code",200);jsonObject.put("msg","操作成功");return jsonObject.toJSONString();}

以上内容就是请求训练方案系统,然后将信息放在库里面,下面我们来实现一下登录的功能这是重点

单点登录

1.配置代理信息

    /*请求登陆的方法*/"/modelLogin": {//本地服务接口地址,这是测试环境,正式环境需要更改下地址target: "http://127.0.0.1:6776/blade-auth/",changeOrigin: true,pathRewrite: {"^/modelLogin": "",},},

2.vue中调用请求登录(关键代码,其实上面都已经放过了):

//异步进行登录this.$store.dispatch("LoginPrammeSystem", loginForm).then(() => {//跳转到指定连接(正式环境需要更改地址)window.open("http://localhost:1889/");});

3.在modules/user.js中封装LoginPrammeSystem方法:

 //登录训练方案的系统LoginPrammeSystem({ commit }, userInfo) {return new Promise((resolve, reject) => {LoginPrammeSystem("000000", userInfo.username, userInfo.password).then((res) => {const data = res.data;if (data.error_description) {Message({message: data.error_description,type: "error",});} else {commit("SET_TOKEN", data.access_token);commit("SET_REFRESH_TOKEN", data.refresh_token);commit("SET_TENANT_ID", data.tenant_id);commit("SET_USER_INFO", data);commit("DEL_ALL_TAG");commit("CLEAR_LOCK");}resolve(data);}).catch((error) => {reject(error);});});},

4.在api/user.js中去请求训练方案系统中登录方法:

 /*登录训练方案的系统*/export const LoginPrammeSystem = (tenantId, username, password) =>request({//去训练方案里面的系统登录url: "/modelLogin/oauth/token",method: "post",headers: {"Tenant-Id": tenantId,},params: {tenantId,username,password,grant_type: "custom",scope: "all",type: "",},});

5.在训练方案的鉴权登录的模块中,添加一个类:CustomTokenGranter,代码如下:

package org.springblade.modules.auth.granter;import lombok.AllArgsConstructor;import org.springblade.core.log.exception.ServiceException;import org.springblade.core.tool.utils.DigestUtil;import org.springblade.core.tool.utils.Func;import org.springblade.modules.auth.enums.UserEnum;import org.springblade.modules.auth.provider.ITokenGranter;import org.springblade.modules.auth.provider.TokenParameter;import org.springblade.modules.auth.utils.TokenUtil;import org.springblade.modules.system.entity.Tenant;import org.springblade.modules.system.entity.UserInfo;import org.springblade.modules.system.service.ITenantService;import org.springblade.modules.system.service.IUserService;import org.springframework.stereotype.Component;/*** @Description: 别的系统登陆本系统* @author: 穆雄雄* @date: 2022年4月17日11:04:07No such property: code for class: Script1* @Return:*/@Component@AllArgsConstructorpublic class CustomTokenGranter implements ITokenGranter {public static final String GRANT_TYPE = "custom";private final IUserService userService;private final ITenantService tenantService;@Overridepublic UserInfo grant(TokenParameter tokenParameter) {String tenantId = tokenParameter.getArgs().getStr("tenantId");String username = tokenParameter.getArgs().getStr("username");String password = tokenParameter.getArgs().getStr("password");UserInfo userInfo = null;if (Func.isNoneBlank(username, password)) {// 获取租户信息Tenant tenant = tenantService.getByTenantId(tenantId);if (TokenUtil.judgeTenant(tenant)) {throw new ServiceException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);}// 获取用户类型String userType = tokenParameter.getArgs().getStr("userType");// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展if (userType.equals(UserEnum.WEB.getName())) {userInfo = userService.userInfo(tenantId, username,password, UserEnum.WEB);} else if (userType.equals(UserEnum.APP.getName())) {userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), UserEnum.APP);} else {userInfo = userService.userInfo(tenantId, username, DigestUtil.hex(password), UserEnum.OTHER);}}return userInfo;}}

6.在 TokenGranter缓存池 中的静态代码块中添加如下代码:

//客户端自定义登录的方法GRANTER_POOL.put(CustomTokenGranter.GRANT_TYPE, SpringUtil.getBean(CustomTokenGranter.class));

注意事项

  • 记得将本地的localhost地址修改成正式环境的地址
  • 别的没有了

bladex实现单点登录相关推荐

  1. springboot实现用户统一认证、管理(单点登录)

    大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是:2022年5月25日13:44:16 最近和模拟登录杠上了,这不,又来了个需求,还是以这个技术点入手的. 需求大概是这样的:为了统一管 ...

  2. [转]单点登录原理与简单实现

    一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...

  3. 在ASP.NET 中实现单点登录

    出自:[孟宪会之精彩世界] 发布日期:2005年1月27日 8点48分0秒 [有删改] 由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录.在ASP.NE ...

  4. 单点登录与权限管理本质:session和cookie介绍

    本篇开始写「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,这部分主要介绍相关的知识概念.抽象的处理过程.常见的实现框架.通过这部分的介绍,能够对单点登录与权限管理有整体上的了解,对其相关 ...

  5. 【C#】ASP.NET网页中添加单点登录功能

    背景 首先,要说明的是,原先需求定义的是,同一个账号只能同时有一个人来登录,如果另外一个登录的话,前一个登陆者就自动被踢掉.本来原先要做成存储到服务器的数据库中,但是后来如果是非正常退出的话 下次就没 ...

  6. 配置Exchange OWA和Sharepoint网站单点登录

    配置Exchange OWA和Sharepoint网站单点登录 如果我们在组织中已经部署完成了Lync.Exchange以及Sharepoint,那么我们会发现这三套系统在通过域账户登录计算机时,如果 ...

  7. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  8. SSO单点登录基于CAS架构封装 Memcached 实例

    2019独角兽企业重金招聘Python工程师标准>>> SSO认证中心是CAS整个应用架构的一个极其重要的关键点,必须满足如下两点要求: 1.高可用,不允许程序发生故障.如果认证中心 ...

  9. 使用 CAS 在 Tomcat 中实现单点登录

    CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...

最新文章

  1. Windows下安装PHP开发环境
  2. Java-第三章-使用if选择结构实现,如果年龄够7岁或5岁并且是男,可以搬桌子
  3. VM:如何向vmware虚拟机中传输文件(或者共享文件夹)之详细攻略(图文教程)
  4. 李佳琦谈公益:时代成就了我 我也要回馈社会
  5. Anaconda安装后找不到conda.exe
  6. Node.js:中间件——配置静态资源中间件
  7. JCTF Writeup
  8. c语言在线翻译器,command(c语言翻译工具)
  9. Word设置封面无页码,摘要罗马数字页码,正文数字页码
  10. css如何实现自动换行,CSS实现自动换行的方法
  11. cubeIDE快速开发流程
  12. iptables 实现主机防火墙(四表五链)
  13. 【精华贴】一键启动bat脚本——Anaconda Jupyter Notebook
  14. 得到app文稿导出_逻辑思维,阅读付费平台“得到APP”功能分析
  15. 你知道判断高防抗ddos的能力吗?
  16. 如何在电脑上打开epub电子书
  17. python 主力资金_邢不行 | 量化投资中如何计算机构、主力、散户资金流数据【视频】...
  18. 【mysql进阶-彩蛋篇】深入理解顺序io和随机io(全网最详细篇)
  19. Android开发 :调用系统相机拍照保存照片并显示在当前界面
  20. Windows 7之BitLock To Go

热门文章

  1. [Java基础]Set集合概述和特点
  2. [蓝桥杯][算法提高VIP]因式分解
  3. hdu2544 最短路-邻接表+优先队列实现dijkstra
  4. python车辆识别硬件_Opencv python之车辆识别项目
  5. 算法---字符串顺序平移
  6. 数据结构---递归实现十进制装换为任意进制
  7. 与Min_25筛有关的一些模板
  8. UOJ#191. 【集训队互测2016】Unknown
  9. 牛客练习赛70 重新排列
  10. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis