bladex实现单点登录

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

前言

现在是: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地址修改成正式环境的地址
  • 别的没有了

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

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

相关文章

若依实现单点登录(解析请求链接中的参数做鉴权认证)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是&#xff1a;2022年4月19日19:56:56 昨天写了个bladex的单点登录&#xff0c;回想起来还是比较复杂的&#xff0c;今天又收到了个在若依里面实现单点登录。具体是这样的:别的系…

Docker打包 Asp.Net Core应用,在CentOS上运行

本文主要介绍下运用docker虚拟技术打包Asp.net core应用。 Docker作为一个开源的应用容器引擎&#xff0c;近几年得到广泛的应用&#xff0c;使用Docker我们可以轻松实现应用的持续集成部署&#xff0c;一次打包&#xff0c;到处运行。 开篇借用百科上对docker的介绍。 Docker …

若依实现系统单点登录(可绕过验证码)

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是&#xff1a;2022年4月19日19:56:56昨天写了个bladex的单点登录&#xff0c;回想起来还是比较复杂的&#xff0c;今天又收到了个在若依里面实现单点登录。具体是这样的:别的系…

springboot解析txt文件顺便加到数据库中(nohup文件)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是&#xff1a;2022年4月20日13:33:23 以前是怎么都没想到&#xff0c;我需要在服务器的nohup文件中找记录&#xff0c;然后往数据库里面更新。具体因为啥不提了&#xff0c;说多…

ASP.Net Core 2.0中的Razor Page不是WebForm

随着.net core2.0的发布&#xff0c;我们可以创建2.0的web应用了。2.0中新东西的出现&#xff0c;会让我们忘记老的东西&#xff0c;他就是Razor Page。下面的这篇博客将会介绍ASP.Net Core 2.0中的Razor Page。 在ASP.Net Core 2.0新特点之一就是支持Razor Page。今天的Razor…

记录几个部署项目常用的命令

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 查询运行项目的进程 ps -aux|grep farbeat 杀死进程 kill -9 1600336进入目录 cd /www/wwwroot/farbeat/查看文件 ls将日志输出在nohup文件中的方式启动项目(注意.jar文件的名字) nohup j…

C#最佳工具集合:IDE、分析、自动化工具等

C#是企业中广泛使用的编程语言&#xff0c;特别是那些依赖微软的程序语言。如果您使用C#构建应用程序&#xff0c;则最有可能使用Visual Studio&#xff0c;并且已经寻找了一些扩展来对您的开发进行管理。但是&#xff0c;这个工具列表可能会改变您编写C#代码的方式。 C#编程的…

常用公有云接入——AZURE

一、概念 1、订阅 可以使用订阅为组织内的团队提供访问开发环境&#xff08;即测试、生产、开发、临时部署等&#xff09;和项目的权限。针对每个应用程序环境创建不同的订阅&#xff0c;并为每个订阅分配不同的服务管理员帐户&#xff0c;这是保护每个环境安全的一个好方法。…

记录几个常用部署项目的命令,以备后用!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”查询运行项目的进程ps -aux|grep farbeat杀死进程kill -9 1600336进入目录cd /www/wwwroot/farbeat/查看文件ls将日志输出在nohup文件中的方式启动项目(注意.jar文件的名字)nohup java -…

分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测

由于Beetle.DT是一个分布式压力测试工具&#xff0c;所以在使用上并不像普通工具那样安装运行这么简单&#xff1b;由于工具涉及到测试管理中心&#xff0c;节点和管理端等工具&#xff1b; 所以必须要进行相应的部署才能运行。接下来详解一下如果安装Beetle.DT并进行简单的HTT…

常用公有云接入——谷歌

一、概念 1、项目 一个账号有唯一的项目&#xff0c;所有虚拟机都在project里面建。 2、计算引擎 虚拟机资源。 二、创建方式 1、页面控制台 2、gcloud命令行 3、REST API 4、SDK 三、Java SDK 1、创建API服务凭据&#xff0c;并下载P12文件 2、Maven <dependency&…

elementui实现表格单选功能

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不可以多选。效果如下所示&#xff1a; 原来…

element-ui实现表格单选的功能

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是&#xff1a;2022年4月20日13:33:23需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不…

ASP.NET Core Razor 视图组件

视图组件简介 在新的ASP.NET Core MVC中&#xff0c;视图组件类似于局部视图&#xff0c;但它们更强大。视图组件不使用模型绑定&#xff0c;仅依赖于您在调用时提供的数据。 视图组件特性&#xff1a; 呈现页面响应的某一部分而不是整个响应包括在控制器和视图之间发现的关…

三个好用的并发工具类

转载自 三个好用的并发工具类 以前的文章中&#xff0c;我们介绍了太多的底层原理技术以及新概念&#xff0c;本篇我们轻松点&#xff0c;了解下 Java 并发包下、基于这些底层原理的三个框架工具类。 它们分别是&#xff1a; 信号量 Semaphore 倒计时门栓 CountDownLatch …

Error Handling in ASP.NET Core

前言 在程序中&#xff0c;经常需要处理比如 404&#xff0c;500 &#xff0c;502等错误&#xff0c;如果直接返回错误的调用堆栈的具体信息&#xff0c;显然大部分的用户看到是一脸懵逼的&#xff0c;你应该需要给用户返回那些看得懂的界面。比如&#xff0c;“当前页面不存在…

基于python的selenium

一.安装 安装WebDriver 查看chrome版本号&#xff0c;设置-帮助-关于Google chrome&#xff0c;找到版本号。 可以到这个网站进行下载对应版本的chromedriver,如果chrome浏览器版本过高,可以下载最新版的chromedriver进行使用 Chrome for Testing availability 下载下来之后…

多信息登录、检测用户信息是否完善且引导补全

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注&#xff1a;穆雄雄的博客 前言 现在是2022年4月28日13:41:29&#xff01; 今天分享两块内容。 1.需求&#xff1a;用户可以通过手机号、邮箱来注册我们的系统&#xff0c;用户完成之后&#xff0c;可以去完善自己的个人信息…

PNG 图片压缩原理解析

转载自 PNG 图片压缩原理解析 什么是PNG PNG的全称叫便携式网络图型&#xff08;Portable Network Graphics&#xff09;是目前最流行的网络传输和展示的图片格式&#xff0c;原因有如下几点&#xff1a; 无损压缩&#xff1a;PNG图片采取了基于LZ77派生算法对文件进行压缩&…

element ui实现多层级复杂表单的操作(添加与回显)之表单操作交互操作

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月3日11:47:15&#xff01;劳动节假期已经过去了三天了&#xff0c;今天是被封家里的第7天&#xff0c;也是解封的第一天。 说实话&#xff0c;在家里的工作效率一点都…