Java + sa-token统一身份认证开发笔记

官网地址:Sa-Token

统一认证服务端

直接用的官网的demo,稍加改动,因为要前后端分离,加了一个H5Controller,官网也有详细介绍,这一部分不难,照着做就行了

配置文件:

# Sa-Token 配置
sa-token:# ------- SSO-模式一相关配置  (非模式一不需要配置)# cookie:# 配置 Cookie 作用域# domain: stp.com# ------- SSO-模式二相关配置sso:# Ticket有效期 (单位: 秒),默认五分钟ticket-timeout: 300# 所有允许的授权回调地址allow-url: "*"# ------- SSO-模式三相关配置 (下面的配置在使用SSO模式三时打开)# 是否打开模式三is-http: truesign:# API 接口调用秘钥secret-key: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明)

业务服务端

因为要用到跨redis,跨域,所以要用到他们的client3模式。

配置文件

sa-token:# SSO-相关配置sso:# SSO-Server端 统一认证地址auth-url: http://localhost:9000/sso/auth#auth-url: http://127.0.0.1:5500/sso-login.html# 使用 Http 请求校验ticket (模式三)is-http: true# SSO-Server端 ticket校验地址check-ticket-url: http://localhost:9000/sso/checkTicket# 单点注销地址slo-url: http://localhost:9000/sso/signout# 查询数据地址get-data-url: http://localhost:9000/sso/getDatasign:# API 接口调用秘钥secret-key: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor

上面是demo,整合到自己的业务服务端

将自己的token一并返回给前端

	@RequestMapping("/sso/doLoginByTicket")public SaResult doLoginByTicket(String ticket) {Object loginId = SaSsoProcessor.instance.checkTicket(ticket, "/sso/doLoginByTicket");if(loginId != null) {StpUtil.login(loginId);String token = jwtConfig.createToken(loginId.toString()) ;Map<String, Object> resultMap = new HashMap<>();resultMap.put("satoken", StpUtil.getTokenValue());resultMap.put("token", token);return SaResult.data(resultMap);}return SaResult.error("无效ticket:" + ticket);}

提供一个api获取登录后的相关信息

    @RequestMapping("/loginBySso")public Result<?> loginBySso(HttpServletRequest request) {String token = request.getHeader("token");String userId = jwtConfig.getUsernameFromToken(token);QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", userId);SysUser sysUser = sysUserService.getOne(queryWrapper, false);if (sysUser != null) {if(sysUser.getLockFlag()!=null && sysUser.getLockFlag().equals("1")){return Result.error("用户已被锁定,请联系管理员解锁!",sysUser);}if(!"0".equals(sysUser.getStatus())){if(DBsUserConstant.Status.SECPERIOD.equals(sysUser.getStatus())){return Result.error("用户账号已删除,请联系管理员!",sysUser);}else {return Result.error("用户账号正在申请中,请联系管理员审核!", sysUser);}}LoginModel model = getUserInfo(sysUser);return Result.ok(JSON.toJSONString(model));} else {return Result.error("无此用户!");}}

业务客户端

参考的这个demo

整合到自己的业务客户端

修改路由配置,非常关键

router.beforeEach(async (to, from, next) => {//debugger;let token = sessionStorage.getItem('token');const url = new URL(window.location.href)const params = getParams(url);let ticket = params.ticket;if (ticket && isEmpty(token)) {//debugger;//有票据拿tokenconst ticketRes = await ssoLoginByTicket({ticket: ticket})sessionStorage.setItem('token', ticketRes.data.data.token)localStorage.setItem('satoken', ticketRes.data.data.satoken)const res = await userLoginBySso()afterLogin(res);config.configData.sso_enable = truenext({ path: desktopUrl() })return false} else {if (to.path === '/sso')  {config.configData.sso_enable = true} //无票据,进入登录页面if (config.configData.sso_enable && isEmpty(token)) {const ssoUrlRes = await ssoAuthUrl({clientLoginUrl: location.origin+'/'})location.href = ssoUrlRes.data.datareturn false;}//如果直接跳登录页面,不管是不是sso都眺if (to.path === '/login') {next()return false}//跳首页时直接决定是登录页还是桌面if (to.path === '/' ||  to.path === '/sso') {if (isEmpty(token)) {next("login")} else {next("desktop")}return false}//不能反着跳if (to.path  === "/" && from.path === "/login") {return false;}    }  next()
})

相关api

import Vue from 'vue'
import {ajax} from '@/utils/httputils'
import config from '@/config/index.js'const API_URL = config.configData.api_url
const http = (method, url, data) => {return new Promise((resolve, reject) => {return ajax(method, url, data).then((res) => {if (res.data.code == 200) {resolve(res)} else {reject(res)}}).catch(error => reject(error))})
}
/*** server* /sso/auth* /sso/checkTicket* /sso/signout* /sso/userinfo** client* /sso/getSsoAuthUrl* /sso/doLoginByTicket* /sso/logout* /sso/logoutCall*/
export function ssoAuth(data) {return http('get', API_URL + "/sso/auth", data)
}
export function ssoCheckTicket(data) {return http('get', API_URL + "/sso/checkTicket", data)
}
export function ssoSignout(data) {return http('get', API_URL + "/sso/signout", data)
}
export function ssoUserInfo(data) {return http('get', API_URL + "/sso/userinfo", data)
}export function ssoAuthUrl(data) {return http('get', API_URL + "/sso/getSsoAuthUrl", data)
}
export function ssoLoginByTicket(data) {return http('get', API_URL + "/sso/doLoginByTicket", data)
}
export function ssoLogout(data) {return http('get', API_URL + "/sso/logout", data)
}
export function ssoLogoutCall(data) {return http('get', API_URL + "/sso/logoutCall", data)
}

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

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

相关文章

vo、po、dto、bo、pojo、entity

VO&#xff1a;Value Object&#xff0c;值对象。 通常用于业务层之间的数据传递&#xff0c;由new创建&#xff0c;由GC回收&#xff1b;例如&#xff1a;将商品信息和用户信息重新用一个对象封装起来。和PO一样也是仅仅包含数据而已&#xff0c;但应是抽象出的业务对象&…

全网良心开源知识库:AI学习者的宝藏之地

导语&#xff1a;在这个信息爆炸的时代&#xff0c;想要入门AI&#xff0c;找到最一流的学习资源并非易事。然而&#xff0c;有一个地方&#xff0c;能让你免费学习AI&#xff0c;获取最顶尖的知识&#xff0c;还能加入最优秀的AI学习圈。今天&#xff0c;我要向大家推荐的&…

Jumpserver 堡垒机用户启用双因子登录

前言&#xff1a; 堡垒机双因子登录 堡垒机往往是内部权限的集合体&#xff0c;拿到了堡垒机的用户账号密码&#xff0c;很容易就顺藤摸瓜攻破各种应用系统&#xff0c;除了常规的用户名复杂密码的要求外&#xff0c;我们常常都要求采用双因子的登录方式。双因子最常见的就是账…

【Qt学习笔记】(六)界面优化

界面优化 1 QSS1.1 背景介绍1.2 基本语法1.3 QSS设置方式1.3.1 指定控件样式设计1.3.2 全局样式设置1.3.3 使用 Qt Designer 编辑样式 1.4 选择器1.4.1选择器概况1.4.2 子控件选择器&#xff08;Sub-Controls&#xff09;1.4.3伪类选择器(Pseudo-States) 1.5 样式属性1.5.1 盒模…

MyBatis:编织数据之美的艺术

在数据库交互的舞台上&#xff0c;MyBatis就如同一位出色的编码艺术家&#xff0c;通过其独特的姿态和技巧&#xff0c;将数据库操作变得既优雅又高效。在这篇博客中&#xff0c;我们将深入研究MyBatis的使用详解&#xff0c;揭开其中的奥秘&#xff0c;感受数据之美的艺术之旅…

SpringCloud-Nacos配置管理

在nacos中添加配置文件 如何在nacos中管理配置呢&#xff1f; 然后在弹出的表单中&#xff0c;填写配置信息&#xff1a;如&#xff1a;userservice-dev.yaml 注意&#xff1a;项目的核心配置&#xff0c;需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置…

【机器学习】基于麻雀搜索算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类别…

linux服务器上遇到杀不死的进程怎么办?

想要结束某个进程时&#xff0c;一般会先top一下找到进程号&#xff0c;然后kill xxx。 然而&#xff0c;我最近发现一个两百多兆的进程一直杀不死&#xff0c;kill完一个还会自动产生新的。 此时&#xff0c;可以用以下指令找到自己名下所有正在运行的进程&#xff0c;对症下药…

解决在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store的问题| Bug

目录 如果你已经尝试过将python添加到系统变量在系统变量里把你自己的路径放到应用商店的路径之前删除windowsapps下的python.exe文件 如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行&#xff0c;输入…

【linux】环境基础|开发工具|gcc|yum|vim|gdb|make|git

目录 ​编辑 Linux 软件包管理器 yum 软件包: 操作&#xff1a; 拓展&#xff1a;lrzsz简介 Linux开发工具 Linux编辑器-vim使用 vim 的基本概念 命令模式 插入模式 底行模式 vim 命令模式的操作指令 vim 底行模式的操作命令 Linux编译器-gcc/g使用 功能 格…

5_springboot_shiro_jwt_多端认证鉴权_禁用Cookie

1. Cookie是什么 ​ Cookie是一种在客户端&#xff08;通常是用户的Web浏览器&#xff09;和服务器之间进行状态管理的技术。当用户访问Web服务器时&#xff0c;服务器可以向用户的浏览器发送一个名为Cookie的小数据块。浏览器会将这个Cookie存储在客户端&#xff0c;为这个Co…

java的前缀和算法

前缀和的概念 对于一个给定的数组A&#xff0c;它的前缀和数组S中S[i]表示从第1个元素到第i个元素的总和&#xff0c;用公式表示为&#xff1a; SiA1A2A3...An 前缀和的作用 在O(1)的时间求出数组任意区间的区间和。 降低求解的复杂度 算法模板 int n10; int [] arrnew in…

【Linux】盘点广义层面上【三种最基本的进程状态】

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

SQL语句之SELECT语句

一般格式 SELECT DISTINCT/ALL 目标列表达式 //要显示的属性列 FROM 表名/视图名 //查询的对象 WHERE 条件表达式 //查询条件 GROUP BY 列名 HAVING 条件表达式 //查询结果分组 ORDER BY 列名 次序; //最终查询结果排序 文章目录 一、基本查询 1、SELECT 目标列表达…

进程(2)——进程优先级

1、基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。 还可以把进程运行到指定的CPU上&#xff0c;这样一来&a…

Spring MVC开发小练习

1. 加法计算器 需求&#xff1a;输入两个整数&#xff0c;计算和 约定前后端交互接口&#xff1a; 在开发项目前&#xff0c;根据需求先约定好前后端交互接口&#xff0c;双方按照接口文档进行开发&#xff0c;接口文档一旦写好&#xff0c;尽量不要轻易改变&#xff0c;如果…

Springboot+vue的船舶维保管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶维保管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

2024最新自动化测试面试题合集 (附答案)

1、你会封装自动化测试框架吗&#xff1f; 这个问得最多&#xff0c;甚至有很多公司直接写在招聘要求中&#xff01; 当然可以&#xff0c;自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;Tes…

网络编程-DAY6

1>创建一个武器信息库&#xff0c;包含编号&#xff08;主键&#xff09;、名称、属性、描述、价格 2>添加三把武器 3>修改某把武器的价格 4>展出价格在1000到4000的武器 5>卖掉一把武器&#xff0c;删除该武器的信息 6>几天后&#xff0c;客户顶着光头…

HarmonyOS NEXT应用开发之左右拖动切换图片效果案例

介绍 本示例使用滑动手势监听&#xff0c;实时调整左右两侧内容显示区域大小和效果。通过绑定gesture事件中的PanGesture平移手势&#xff0c;实时获取拖动距离。当拖动时&#xff0c;实时地调节左右两个Image组件的宽度&#xff0c;从而成功实现左右拖动切换图片效果的功能。…