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

2438915b01b4b8a49d85fe0e89a9372e.png

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

前言

现在是: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/323684.shtml

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

相关文章

POJ1015-Jury Compromise【01背包,dp】

正题 题目链接:http://poj.org/problem?id1015 题目大意 每个人有A值和B值,要求选M个人,使这M个人的|SumA−SumB||SumA−SumB|最小。 解题思路 我们用SumA−SumBSumA−SumB作为原本的价格,然后用fi,jfi,j表示已经选了i个人,Su…

JavaFX其他事件

一、其他事件 InputMethodEvent.InputMethodTextChanged 文本输入改变 ContextMenuEvent.CONTEXT_MENU_REQUESTED 上下文菜单请求 二、用法 node.setOnXX(event->{//do something });node.addEventFilter(XXEvent.XX, event -> {//do something});

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…

Ch5302-金字塔【区间dp】

正题 题目链接:http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5302%20%E9%87%91%E5%AD%97%E5%A1%94 题目大意 给出一个欧拉序(只要到达每一个结点就把他加进序列的那种,编号会重复),求有多…

常用公有云接入

一、云平台 1、AWS(亚马逊) 2、谷歌 3、AZURE(微软) 4、阿里 5、腾讯 6、华为 二、接入方式 1、REST API 2、SDK 三、云ECS 1、实例 2、系统盘 3、数据盘 4、网关 5、公有IP 6、共享带宽(阿里云)

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

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

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

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

jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】

正题 POJ链接:http://poj.org/problem?id1185 jzoj链接:https://jzoj.net/senior/#main/show/1768 洛谷评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2704 正题 每个炮兵攻击范围是上左下右各2格,高山地区不可以放炮兵,求所以…

常用公有云接入——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…

Ch4201-楼兰图腾【树状数组】

正题 题目链接:http://contest-hunter.org:83/contest/0x40%E3%80%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%BF%9B%E9%98%B6%E3%80%8D%E4%BE%8B%E9%A2%98/4201%20%E6%A5%BC%E5%85%B0%E5%9B%BE%E8%85%BE 题目大意 给若干个点,求可以得到/\和V的形状各多少个。 解…

常用公有云接入——谷歌

一、概念 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;暂时不…

常用公有云接入——阿里

一、术语 中文英文说明地域Region阿里云建设的数据中心。资源创建成功后无法更换地域。可用区Zone同一地域内&#xff0c;电力和网络互相独立的物理数据中心。一个地域下可以有多个可用区。同一地域内可用区之间内网互通并且故障隔离&#xff0c;云服务器 ECS 网络延时低。实例…

ASP.NET Core Razor 视图组件

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

POJ3468-A Simple Problem with Integers【线段树,树状数组,分块】

正题 题目链接&#xff1a;我是链接 其实洛谷线段树模板也是一样的&#xff1a;三种方法AC评测链接 题目大意 要求支持区间修改&#xff0c;区间求和。 线段树 直接用一个lazy标记&#xff0c;在之前的博客里有说 code1 #include<cstdio> #include<algorithm>…

“JSON parse error: Unexpected character (‘1‘ (code 49))的解决方式

现在是&#xff1a;2022年4月30日22:29:49 大家好&#xff0c;我是雄雄。 刚刚在调用接口的时候&#xff0c;出现了个错误&#xff1a; {"code": 400,"success": false,"data": null,"msg": "JSON parse error: Unexpected char…