springboot+vue实现用户统一认证、管理-前端实现

c8d468776b0926bc5794317392048b04.png

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

前言

现在是:2022年6月2日15:43:51

上篇文章讲述了springboot中实现用户统一认证的具体内容,主要从后端角度出发的,其实大部分功能还是前端与后端交互的比较多,上篇文章知识罗列了几个回调接口,我一般写这种API接口都是这样的思路。将调用的地址统一放在一个工具类(或者接口)中,然后具体的业务放在service层来实现,这样也方便后面别的类中共用。

涉及技能点

  1. 前端:Vue(avue)

  2. 后端:springboot (bladex框架)

  3. 数据库:mysql 5.7及以上

实现思路

  1. 上游平台通过回调接口,将用户和组织机构同步至子系统

  2. 上游平台通过url在地址栏中挂sessionid的方式访问子系统的登录页面

  3. 子系统检地址栏中是否有sessionid,如果有,则拿着sessionid去上游系统获取用户信息,然后在子系统中拿着用户信息自动登录

  4. 如果地址栏中没有sessionid,则需要带着子系统的登录地址,重定向至上游平台(上游平台怎么处理的,我就不知道了,我猜测,如果用户未在上游平台登录,则不带sessionid来的子系统,如果登录了则会带着过来。所以重定向到上游平台时,应该是让用户重新进行登录的)

  5. 当用户点击退出时,清除子系统的用户登录状态的同时还需要清除上游系统,且重定向至上游平台的登录页面

代码实现

  1. permission.js中判断地址栏中是否带着xxl_sso_sessionid参数,拿到参数的值,去做处理。

代码如下:

router.beforeEach((to, from, next) => {//单点登录//拿到地址栏中的参数//获取参数const threeSessionId = getQueryString("xxl_sso_sessionid");if (threeSessionId) {//拿到用户名threeCheckLogin(threeSessionId).then(res => {const code = res.data.code;if(code===200){const username =  res.data.data;//异步进行登录store.dispatch("LoginPrammeSystem", {username}).then(() => {sessionStorage.setItem("tag",0);//将ssoSessionKey保存起来(退出的时候要用,退出的时候记得要清空掉)localStorage.setItem("threeSessionId",threeSessionId);location.href = location.origin;});}});return;}else{//没有带着标识过来//第一步:在业务系统登录请求中判断Request中是否包含key值为xxl_sso_sessionid的值,// 如果获取不到,跳转到统一认证平台登录页面,需要带上跳转地址// (http://统一认证平台IP/login?redirect_url=业务系统登录地址)//  第二步:在统一认证平台登录页面点击“登录”按钮,登录成功后则跳转到http:// 业务系统登录地址?xxl_sso_sessionid=5_9b52f8fe1be24693a7492af854d53759const tag = sessionStorage.getItem("tag");if(tag!=='0'){location.href = tyrzptLoginUrl+"/login?redirect_url="+xuappLoginUrl;return;}}const meta = to.meta || {};const isMenu = meta.menu === undefined ? to.query.menu : meta.menu;store.commit("SET_IS_MENU", isMenu === undefined);if (getToken()) {if (store.getters.isLock && to.path !== lockPage) {//如果系统激活锁屏,全部跳转到锁屏页next({ path: lockPage });} else if (to.path === "/login") {//如果登录成功访问登录页跳转到主页next({ path: "/" });} else {//如果用户信息为空则获取用户信息,获取用户信息失败,跳转到登录页if (store.getters.token.length === 0) {store.dispatch("FedLogOut").then(() => {// next({ path: "/login" });//跳转到统一认证平台登录页面location.href = tyrzptLoginUrl + "/login"});} else {const value = to.query.src || to.fullPath;const label = to.query.name || to.name;const meta = to.meta || router.$avueRouter.meta || {};const i18n = to.query.i18n;if (to.query.target) {window.open(value);} else if (meta.isTab !== false &&!validatenull(value) &&!validatenull(label)) {store.commit("ADD_TAG", {label: label,value: value,params: to.params,query: to.query,meta: (() => {if (!i18n) {return meta;}return {i18n: i18n};})(),group: router.$avueRouter.group || []});}next();}}} else {//判断是否需要认证,没有登录访问去登录页if (meta.isAuth === false) {next();} else {//next("/login");//跳转到统一认证平台登录页面location.href = tyrzptLoginUrl+"/login"}}
});
  1. 拿到地址栏中xxl_sso_sessionid参数值,去上游系统中获取用户信息,接口已经在上篇文章中发出,这边只写调动的地方。

代码如下:

/*** 拿着session_id去获取用户名去* @returns {AxiosPromise}* @param ssoSessionKey*/export const threeCheckLogin = (ssoSessionKey) => {return request({url: '/api/api/sso/check_login',method: 'get',params: {ssoSessionKey,}})}

注意:xxl_sso_sessionid的值,需要记录住,在退出的时候需要用,我这里直接放在了localStorage中。

  1. 调用免密登录的方法,threeCheckLogin方法会给我们返回用户名,所以我们带着用户名,调用LoginPrammeSystem方法去登录。代码如下:

modules/user.js中的actions写:

//统一认证平台过来的用户登录此系统LoginPrammeSystem({ commit }, userInfo) {return new Promise((resolve, reject) => {LoginPrammeSystem("000000", userInfo.username,"xuapp").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);});});},
  1. 然后在api/user.js中写上具体登录的方法:

/*统一认证平台登录系统*/
export const LoginPrammeSystem = (tenantId, username, password) =>request({//去训练方案里面的系统登录url: "/api/blade-auth/oauth/token",method: "post",headers: {"Tenant-Id": tenantId,},params: {tenantId,username,password,grant_type: "custom",scope: "all",type: "",},});
  1. org.springblade.modules.auth.granter包下面新建自定义鉴权类CustomTokenGranter,代码如下:

/**      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.**  Redistribution and use in source and binary forms, with or without*  modification, are permitted provided that the following conditions are met:**  Redistributions of source code must retain the above copyright notice,*  this list of conditions and the following disclaimer.*  Redistributions in binary form must reproduce the above copyright*  notice, this list of conditions and the following disclaimer in the*  documentation and/or other materials provided with the distribution.*  Neither the name of the dreamlu.net developer nor the names of its*  contributors may be used to endorse or promote products derived from*  this software without specific prior written permission.*  Author: Chill 庄骞 (smallchill@163.com)*/
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年5月24日17:58:31
No such property: code for class: Script1
* @Return:
*/
@Component
@AllArgsConstructor
public 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)) {// 获取租户信息Tenant tenant = tenantService.getByTenantId(tenantId);if (TokenUtil.judgeTenant(tenant)) {throw new ServiceException(TokenUtil.USER_HAS_NO_TENANT_PERMISSION);}userInfo = userService.userInfo(tenantId, username);}return userInfo;}}

整个前端部分的登录流程大体就是这样的~欢迎大家指正。

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

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

相关文章

JS中 [] == ![]结果为true,而 {} == !{}却为false, 追根刨底

转载自 JS中 [] ![]结果为true,而 {} !{}却为false, 追根刨底 console.log( [] ![] ) // true console.log( {} !{} ) // false 在比较字符串、数值和布尔值的相等性时,问题还比较简单。但在涉及到对象的比较时,问题就变…

Centos7 amp;amp; Docker amp;amp; Jenkins amp;amp; ASP.NET Core

写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到…

国民体质测定标准手册及标准解析成JSON文件计算分数,java解析excel文件

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 现在是:2022年6月14日10:07:27 最近在做体质测评的功能,需要依据《国民体质测定标准手册及标准》,根据用户的个人信息,从而计算出各个…

getchar与putchar用法

#include<stdio.h>main(){int i;igetchar();//相当于char i;scanf("%c",&i); putchar(i);//相当于printf("%c",i); 需要i是字符才能输出不能是变量printf("\n");printf("%d",i);}输出结果一致 #include<stdio.h>main…

TCP为什么是三次握手和四次挥手

转载自 TCP为什么是三次握手和四次挥手 为什么建立连接是三次握手断开连接是四次挥手&#xff1f; 三次握手的流程和四次挥手的流程是什么&#xff1f; 三次握手与四次回收分别对应TCP连接与断开过程 tcp报文格式 标志位含义 ACK&#xff1a;确认序号有效。 SYN&#x…

HTM文件中使用vue

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 代码啊&#xff0c;尤其是比较重要客户的项目&#xff0c;即使包出去了&#xff0c;代码也一定要回到自己手里&#xff0c;不然干着急。 这个项目&#xff0c;已经经过两手了&#xff0c…

LVS三种模式的区别及负载均衡算法

转载自 LVS三种模式的区别及负载均衡算法 LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是一个虚拟的服务器集群系统&#xff0c;由章文嵩博士在1998年5月成立&#xff0c;在linux2.6后将lvs自动加入了kernel模块&#xff0c;我们…

王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

在国内&#xff0c;如果你没有听说过《王者荣耀》&#xff0c;那你一定是古董级的人物了。 《王者荣耀》&#xff08;以下简称“农药”&#xff09;&#xff0c;专注于移动端&#xff08;Android、IOS&#xff09;的MOBA游戏。笔者看到这么火爆&#xff0c;就萌生了了解一下这类…

新工作感悟~辞旧迎新~

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”现在是&#xff1a;2022年6月21日22:33:34公众号又好久没有更新啦。从以前的日更&#xff0c;到后来的周更&#xff0c;再到后来的月更……不知道会不会到不更的结局。。。最近换工作了&…

关于Spring底层原理面试的那些问题,你是不是真的懂Spring?

转载自 关于Spring底层原理面试的那些问题&#xff0c;你是不是真的懂Spring&#xff1f; 1.什么是 Spring 框架&#xff1f;Spring 框架有哪些主要模块&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解…

ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解

1.1. 名词解释 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序。 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取。 1.2. Kestrel基本工作原理 Kestrel是…

Failed to execute

今天用dev c无论打编译什么都是出现如下结果&#xff1a; 后来终于找到解决办法了: 原来是这里出现问题了&#xff0c;我的电脑是32位的&#xff0c;必须也是32位的编译系统。否则不管输入什么都是上面的结果&#xff1b; 所以以后不管下载软件还是编译东西第一步一定要看自…

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制&#xff0c;流程如下&#xff1a; 通过登录&#xff0c;来获取Token&#xff0c;再在之后每次请求的Header中追加Authorization为Token的凭据&#xff0c;服务端验证通过即可能获取想要访问的资源。关于JWT的技术&#xff0c;…

BATJ面试必会|Jvm 虚拟机篇

转载自 BATJ面试必会|Jvm 虚拟机篇 目录 一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存…

让网页背景颜色改变

如何改变背景的颜色呢&#xff0c;这里提供一个方法 <!DOCTYPE html> <html><head><style type"text/css">body {background-color: red}p {margin-left: 1px}</style><title>我yi癫狂</title></head><body>…

糊涂工具类真是场景下请求http接口的案例

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 现在是&#xff1a;2022年7月7日13:46:07 前言 今天有个这样的需求&#xff0c;PC端需要查看一下哪些天有数据&#xff0c;但是哪些有有没有数据我这边还看不出来&#xff0c;得请求别的系…

体验 ASP.NET Core 中的多语言支持(Localization)

首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOptions &#xff08;这里假设使用英文与中文&#xff09;&#xff1a; public void ConfigureServices(IServiceCollection services) { services.AddLoca…

java中复杂业务情况下的集合操作(增减集合同步数据)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 现在是&#xff1a;2022年7月5日16:14:28 前言 今天分享个案例&#xff0c;需求是这样的&#xff1a;一个团组中是可以包含多个会员&#xff0c;在给团组创建训练方案时&#xff0c;本质上…

springboot整合spring @Cache和Redis

转载自 springboot整合spring Cache和Redis spring基于注解的缓存 对于缓存声明&#xff0c;spring的缓存提供了一组java注解: Cacheable:触发缓存写入。CacheEvict:触发缓存清除。CachePut:更新缓存(不会影响到方法的运行)。Caching:重新组合要应用于方法的多个缓存操作。…

段落分开

分三段 <!DOCTYPE html> <html><head></head><body><p>This is a paragraph.</p> <p>This is another paragraph.</p> <p>这是网页设计中定义段落的标记&#xff0c;称为开始标记&#xff0c;称为结束标记。把一…