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

简介: springboot实现用户统一认证、管理-前端实现


前言

现在是: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_9b52f8fe1be24693a7492af854d53759
    const 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;
  @Override
  public 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;
  }
}

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

相关文章
|
12月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
880 5
|
5月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
453 1
|
7月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
329 0
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
398 70
|
7月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
8月前
|
Java 应用服务中间件 Scala
Spring Boot 实现通用 Auth 认证的 4 种方式
本文介绍了在Spring Boot中实现通用Auth的四种方式:传统AOP、拦截器(Interceptor)、参数解析器(ArgumentResolver)和过滤器(Filter)。每种方式都通过实例代码详细说明了实现步骤,并总结了它们的执行顺序。首先,Filter作为Servlet规范的一部分最先被调用;接着是Interceptor,它可以在Controller方法执行前后进行处理;然后是ArgumentResolver,在参数传递给Controller之前解析并验证参数
133 1
|
9月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
553 11
|
11月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
165 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
11月前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
90 1
.自定义认证前端页面
|
11月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
544 8

热门文章

最新文章