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地址修改成正式環境的地址
- 別的沒有了
總結
以上是生活随笔為你收集整理的bladex实现单点登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iQOO 12系列或搭载6400万潜望长
- 下一篇: JDK环境变量配置(一次性成功)