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

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

前言

现在是:2022年4月19日19:56:56

昨天写了个bladex的单点登录,回想起来还是比较复杂的,今天又收到了个在若依里面实现单点登录。具体是这样的:别的系统中访问我们的系统,但是用户已经在那边系统登录过了,跳转到这边无需在来一次登录,直接上本系统中继续后续的操作。

实现思路

  1. 三方系统(也就是需要跳转我们系统的系统),直接请求我们系统的登录页面,挂着token参数。
  2. 在我们系统登录界面,判断请求链接中有没有token,没有则正常走登录流程。
  3. 如果没有token,则重新写一个单点登录的接口,去请求。
  4. 在后台将拿到的token,去三方系统中鉴权,通过则继续登录,没有通过则直接返回到登录页面。

实现代码

前端

1.在loginvue页面中的created方法中,调用单点登录的方法。

	created() {//平台单独的登录  2022年4月19日11:23:58this.getLoginByNameAndTokenJ();},

2.在methods中写函数的实现:

	/*** 三方平台单点登陆系统 2022年4月19日11:22:33* 只传递token*/getLoginByNameAndTokenJ(){//获取地址栏中的tokenvar token = this.$route.query.token;//调用登录的接口if(token==''||token==undefined||token==null){//不是那边系统过来的,不走这个地方(阻止created的方法继续向下走)}else{//转圈圈,不要看到登陆页面,无感体验this.loading = true;var logininfo= {"token":token};//执行另一套登录操作//不是本系统的用户,去J平台登陆去this.$store.dispatch("LoginJHaveToken", logininfo).then(() => {this.$message.success("登录成功");this.loading = false;//判断当前角色getInfo().then((res) => {//获取角色名称var rolesName = res.roles[0];//获取所属场馆this.deptInfo = res.dept;sessionStorage.setItem("ssUserName", res.user.nickName);//如果是场馆管理员if (rolesName === 'changguanmanager') {this.$router.push({path: "/VenueKanban",query: {changguan: res, aa: 0},replace: true}).catch(() => {});//否则就是其他用户} else {this.$router.push({path: this.redirect || "/"}).catch(() => {});}});}).catch(err=> {console.log("有异常信息",err);//异常信息this.loading = false;if (this.captchaOnOff) {this.getCode();}});}},

3.在user.js中,实现LoginJHaveToken方法:

	//平台带着token登录,不需要输入账号密码//密码都是123456,//还需要带着token验证一下LoginJHaveToken({ commit }, userInfo) {const token = userInfo.tokenconst queryParams ={'token':token};return new Promise((resolve, reject) => {getLoginByJHaveToken(queryParams).then(res => {setToken(res.token)commit('SET_TOKEN', res.token)resolve()}).catch(error => {reject(error)})})},

4.在login.js中,实现getLoginByJHaveToken方法:

	/*** 平台带着tonken进行登录** @param queryParam* @returns {*}*/export function getLoginByJHaveToken(queryParam) {return request({url: '/ToThirdPart/toThirdPartGetAuthJHaveToken',method: 'post',params: queryParam})}

后端

1.在/ToThirdPart/toThirdPartGetAuthJHaveToken控制器中实现登录的操作:

/*** @Description: 平台带着token来系统里面登陆* 这边需要做两个步骤:* 1.检测数据库里面有没有这个用户名,有则不操作,无则添加* 2.去平台验证一下Token是否有,有的话继续操作后面的登录* 平台没有这个token,则直接打回去,不让上来* @author: 穆雄雄* @date: 2022/4/19 上午 11:38* @Return: com.ruoyi.common.core.domain.AjaxResult*/@PostMapping("/toThirdPartGetAuthJHaveToken")@ApiOperation(value = "平台带着token过来登录")public AjaxResult toThirdPartGetAuthJHaveToken(String token) {//调用验证token的方法JSONObject jsonObject = checkJToken(token);String code = jsonObject.getString("code");Integer level = 0;String loginName = "";Long organId = null;//返回结果AjaxResult ajax = null;if (code.equals("0")) {//验证成功JSONObject dataObject = jsonObject.getJSONObject("data");//拿到其他的信息level = dataObject.getInteger("level");loginName = dataObject.getString("name");organId = dataObject.getLong("organId");} else {ajax = AjaxResult.error(jsonObject.getString("msg"));return ajax;}String isUserNameHas = "";//检测一下用户名存在不存在if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(loginName))) {isUserNameHas = "用户已存在,不需要执行添加的操作";} else {//用户不存在时,将用户添加到数据库中SysUser sysUser = new SysUser();//登录名sysUser.setUserName(loginName);//昵称sysUser.setNickName(loginName);//密码统一都是123456sysUser.setPassword(SecurityUtils.encryptPassword("123456"));//创建者,标识J平台过来的用户sysUser.setCreateBy("j_have_token");//创建日期sysUser.setCreateTime(new Date());//所属等级sysUser.setHierarchy(level);//明文sysUser.setMingwen("123456");//账户权限:为了区分是平台的用户还是本系统用户//id返回来之后需要加上sysUser.setDeptId(organId);//所属等级如果没有,则角色是全国的//1  省  2 市     3  区if (level == null) {//角色Long[] roleids = {104L};sysUser.setRoleIds(roleids);} else {Long[] roleids = {100L};sysUser.setRoleIds(roleids);}int rows = userService.insertUser(sysUser);if (rows > 0) {isUserNameHas = "添加成功";}}ajax = AjaxResult.success();// 生成令牌(不加验证码登录)String tokenNew = loginService.loginNoCode(loginName, "123456", null);ajax.put(Constants.TOKEN, tokenNew);ajax.put("isUserNameHas", isUserNameHas);ajax.put("msg", "登录成功");return ajax;}

2.鉴权方法checkJToken,验证token是否存在,存在则返回用户信息,不存在则打回去:

	 /*** 检测一下J平台的token 对不对** @param token* @return*/public JSONObject checkJToken(String token) {JSONObject jsonObject = new JSONObject();//测试环境String baseUrl = "http://xxxxx/checkTokenRtnInfo?stk=" + token;HttpResponse d = HttpRequest.get(baseUrl).header(HttpHeaders.CONTENT_TYPE, "application/json").header(HttpHeaders.ACCEPT, "application/json").execute();return (JSONObject) JSONObject.parse(d.body().toString());}

3.绕过验证码登录的方法,重写loginService.loginNoCode方法:

	/*** 不加验证码登录** @param username 用户名* @param password 密码* @param uuid 唯一标识* @return 结果*/public String loginNoCode(String username, String password,  String uuid){// 用户验证Authentication authentication = null;try{// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));}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();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}

最后就可以了,可能这种方式不是最好的,但是目前仅想到这种方法。

注意事项

  1. 因为若依的登录方法是带着验证码的,如果不带,则会提示验证码失效
  2. 目前登录传参的方式是post,相对比较安全点。
  3. 三方系统请求的时候,参数是在链接中挂着,不是很靠谱。

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

常用公有云接入——AZURE

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

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

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

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

由于Beetle.DT是一个分布式压力测试工具,所以在使用上并不像普通工具那样安装运行这么简单;由于工具涉及到测试管理中心,节点和管理端等工具; 所以必须要进行相应的部署才能运行。接下来详解一下如果安装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;在家里的工作效率一点都…

TypeScript 2.5 发布,增加语言级重构

在 TypeScript 2.5 版本中&#xff0c;Microsoft 专注于提高开发人员的生产力&#xff0c;其范围已经超出了代码编辑器所提供的常见功能。 习惯于类型语言&#xff08;如 C&#xff03;&#xff09;的开发人员喜欢使用那些可以轻松执行常见重构的工具。现在 TypeScript 可以利…