Java集成Sa-Token进行认证与授权

引言

        软件开发过程中都必须要有的一个功能,那就是认证与授权,经过大佬们的不断更新迭代,使得如今实现认证与授权功能变得相对简单,也许你并不能真正的接触到认证与授权这一功能,除非你接触的项目是从0到1的,即便是这样的项目,认证与授权这一块依旧是系统架构师负责的,正因如此,我们更应该去学习认证与授权,扩展自己的知识面,这样才能在未来成为别人眼中的大佬,那么什么是认证与授权呢,简单讲就是在进入系统前需要进行账号登录,登录时系统根据用户输入的账号密码进行验证,验证通过后返回该用户所拥有的操作权限,本文会从Java认证与授权的发展历程和现在使用最多的标准和框架来讲述

发展历程

        Java程序中的认证与授权机制经历了从简单到复杂、从单一到多样化的历史进程

早期

        校验用户名和密码,但随着网络攻击手段的不断迭代,这种方式就暴露除了缺陷

JavaSE时期

           JavaSE平台提供了更加灵活和安全的认证与授权解决方案,Java Authentication and AuthorizationService(标准认证与授权API),允许开发者在运行时动态配置应用程序的安全策略,支持多种认证方式,

JAVAEE时期

        Java应用开始支持更加复杂的认证与授权机制

Spring Security时期

        随着Spring框架的流行,其生态中的Spring Security逐渐成为Java应用中最受欢迎的认证与授权框架之一,它提供了全面的认证与授权功能,支持多种认证与机制,还提供了基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)以及基于策略的访问控制(PBAC)等,使得开发者能够更加方便地实现复杂地访问控制逻辑

OAuth2与OpenConnect

        随着第三方应用和服务的兴起,OAuth2和OpenID Connect逐渐成为Java应用中处理第三方认证与授权的重要标准。OAuth2运行第三方应用获取用户在HTTP服务上的部分信息,而无需获取用户的密码和访问所有数据。OpenID Connect则是一种基于OAuth2的身份验证协议,它允许用户通过第三方身份提供者进行身份验证,并且获取有关用户的身份信息。Java中,Spring Security OAuth项目为开发者提供了实现OAuth2和OpenID Connect认证与授权的必要API和工具,这使得Java应用能够更加方便地集成第三方认证服务,实现用户在不同应用程序间地无缝登录和权限管理

现在

        经过长时间地发展,现在Java应用中的认证与授权机制已经变得更加复杂和多样化。除了传统的校验用户名/密码和基于角色的访问控制等外,还涌现出了许多新的认证方式和授权策略,如基于令牌的身份验证(JWT),多因素认证(MFA)等,这些都使得Java应用的安全保护能力更加灵活和强大。并且随着云计算、微服务和容器技术的普及,Java应用中的认证与授权机制也开始向分布式、可扩展和自动化的方向发展,如,Spring Cloud Security,使得开发者可以更加方便地实现微服务之间地认证与授权集成,以及基于策略的自动化访问控制

        随着技术的不断进步和应用场景的不断拓展,Java应用中的认证与授权机制将继续向更加安全、灵活和智能化的方向发展

使用最多的标准和框架

标准

        OAuth 2.0

                开放标准,允许用户提供一个令牌,而不是用户名和密码,给第三方应用以访问它们其他服务上存储的私密资源,被广泛用于API授权,使得第三方应用能够安全的访问用户资源,通常结合Spring Security OAuth2等扩展库使用,实现授权服务器的搭建和客户端的授权请求

        OpenID Connect

                OAuth 2.0的扩展层,它允许用户通过单一的身份标识进行身份验证,并获取关于该用户的信息,在OAuth 2.0的认证流程基础上新增了用户信息的获取功能,广泛应用在Java应用中,特别时单点登录功能

        JWT

                一种用于双方安全传输信息的简洁的、URL安全的令牌标准,基于JSON对象,通过数字签名的方式进行验证和确保信息的安全性,通常与Spring Security等安全框架结合使用,用于生成、解析和校验令牌,广泛应用在分布式系统实现单点登录等功能

框架

        Spring Security

                Spring生态中的一个安全框架,提供了全面的安全性解决方案,支持认证、授权、加密、会话管理等安全功能,并且与Spring生态系统中的其他组件无缝集成,其中认证方式有多种:表单登录、HTTP Basic认证、OAuth2等,并且支持基于角色的访问控制和基于属性的访问控制

        Apache Shiro

                一个轻量级的Java安全框架,提供了身份验证、授权、加密和会话管理功能,还提供了丰富的配置选项和文档支持,适用于小型项目或对性能要求较高的场景

Sa-Token

简介

        最近几年出现的轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth 2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题,它的成功得益于简单且直观的API设计、模块化设计易于集成、对性能进行优化同时提供高效的加密算法来提高安全性、提供了丰富的扩展接口等,被广泛应用于Web应用中,因为小编最近有使用,感觉不错,推荐给大家

集成与使用

        以微服务为例讲解两种不同环境的集成,网关采用Spring WebFlux环境,其他服务采用SpringBoot环境

Spring WebFlux环境

Maven依赖
<!-- Sa-Token 权限认证(Reactor响应式集成) -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-reactor-spring-boot-starter</artifactId><version>1.39.0</version>
</dependency>
配置全局过滤器
/*** [Sa-Token 权限认证] 全局配置类* @author muze*/
@Configuration
public class SaTokenConfig {/*** 注册 [Sa-Token全局过滤器]*/@Beanpublic SaReactorFilter getSaReactorFilter() {return new SaReactorFilter()// 指定 [拦截路由].addInclude("/**")// 指定 [放行路由].addExclude("/login")// 指定[认证函数]: 每次请求执行登录校验.setAuth(obj -> StpUtil.checkLogin())// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数.setError(e -> SaResult.error(e.getMessage()));}
}
跨域解决方式
一、在全局过滤器中链式调用如下方法
                // 前置函数:在每次认证函数之前执行.setBeforeAuth(obj -> {SaHolder.getResponse()// ---------- 设置跨域响应头 ----------// 允许指定域访问跨域资源.setHeader("Access-Control-Allow-Origin", "*")// 允许所有请求方式.setHeader("Access-Control-Allow-Methods", "*")// 允许的header参数.setHeader("Access-Control-Allow-Headers", "*")// 有效时间.setHeader("Access-Control-Max-Age", "3600");// 如果是预检请求,则立即返回到前端SaRouter.match(SaHttpMethod.OPTIONS).free(r -> System.out.println("--------OPTIONS预检请求,不做处理")).back();});
二、自定义WebFlux配置
/*** 自定义WebFlux配置* 实现WebFlux接口* 覆写配置 CORS(跨源资源共享)策略方法* @author muze*/
@Configuration
public class CustomWebFluxConfig implements WebFluxConfigurer {/*** 配置 CORS(跨源资源共享)策略* @param corsRegistry 配置 CORS(跨源资源共享)策略的注册器*/@Overridepublic void addCorsMappings(CorsRegistry corsRegistry) {corsRegistry.addMapping("/**") // 允许跨域的路径.allowedOrigins("*") // 允许跨域请求的域名.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法.allowedHeaders("*") // 允许的请求头.allowCredentials(true); // 允许证书(cookies)}
}

SpringBoot环境

Maven依赖
<!-- Sa-Token 权限认证 -->
<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.39.0</version>
</dependency>
配置yml文件
############## Sa-Token 配置 ##############
sa-token: # token 名称(同时也是 cookie 名称)token-name: satoken# token 有效期(单位:秒) 默认30天,-1 代表永久有效timeout: 2592000# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结active-timeout: -1# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)is-concurrent: true# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)is-share: true# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)token-style: uuid# 是否输出操作日志 is-log: true

集成好后我们只需要在登录业务中调用Sa-Token提供的登录API:login,传入用户主键即可

/*** 用户控制层* @author muze*/
@RestController
public class UserController {/*** 登录* @param username 用户名* @param password 密码* @return 登录结果*/@PostMapping("/login")public SaResult login(String username, String password) {// TODO:校验用户名和密码// 正确则调用login传入用户主键,返回登录结果StpUtil.login(1);return SaResult.ok("登录成功");}
}

这样就登录成功了,Sa-Token会生成一个令牌并保存到浏览器的cookie中,后续请求前端需要携带cookie中的令牌访问后端接口,网关会在全局过滤器中调用checkLogin去校验是否已经登录

如果我们的项目没有网关,那么我们就需要配置跨域和拦截器,每次请求在拦截器中进行登录验证

/*** 跨域配置* @author muze*/
@Configuration
public class WebConfig implements WebMvcConfigurer {/*** 添加跨域映射* @param registry Cross-Origin Resource Sharing Registry:跨域资源共享登记*/@Overridepublic void addCorsMappings(CorsRegistry registry) {// 允许跨域访问的URL模式registry.addMapping("/**")// 允许跨域请求的域名(ip:port).allowedOrigins("*")// 允许的方法.allowedMethods("GET", "POST", "PUT", "DELETE")// 允许的头信息.allowedHeaders("*")// 是否允许发送Cookie.allowCredentials(false);}/*** 添加拦截器* @param interceptorRegistry 注册拦截器实体*/@Overridepublic void addInterceptors(InterceptorRegistry interceptorRegistry) {//添加 Sa-Token 拦截器,校验规则为 登录校验 StpUtil.checkLogin()interceptorRegistry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))// 添加校验路径.addPathPatterns("/**")// 排除校验路径.excludePathPatterns("/login");}
}

到这里,一个Java集成Sa-Token并完成一个简单的登录和登录验证就完成了,还有很多简单好用的API,详情请参考官方在线文档:Sa-Token

总结

        当我们在职场中还接触不到认证与授权,但又希望了解并学习来提升自己和为未来做准备的话,可以进行自主学习,该篇文章就是小编的自主学习并使用的一些心得,希望能帮助到你们,感兴趣的朋友赶紧去试试吧,相信这篇文章能给你们一些帮助

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

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

相关文章

uni-app获取到的数据如何保留两位小数

<view><text class"daily_r">{{ (chartD.selfPowerCount || 0).toFixed(2) }}</text>度</view> 1&#xff0c;在模板中&#xff0c;所有需要保留两位小数的数值都使用了 toFixed(2) 方法&#xff0c;例如 {{ (chartD.selfPowerCount || 0).…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

09. 字典

一、什么是字典 在 Python 中&#xff0c;字典&#xff08;dictionary&#xff09;是一系列 键值对。每个键都与一个值关联&#xff0c;可以使用键来访问与之关联的值。字典中的 元键 只能是 不可变类型 的数据类型&#xff0c;也就是 可哈希类型。与键相关的值可以是数字、字符…

QT的exec函数

在Qt框架中&#xff0c;exec()方法是QDialog类&#xff08;及其子类&#xff09;的一个成员函数&#xff0c;用于以模态&#xff08;modal&#xff09;方式显示对话框。当exec()被调用时&#xff0c;它会启动一个局部的事件循环&#xff0c;这个循环会阻塞对对话框之外的其他窗…

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…

云计算之elastaicsearch logstach kibana面试题

1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…

关于音频 DSP 的接口种类以及其应用场景介绍

在音频系统中&#xff0c;DSP&#xff08;数字信号处理器&#xff09;扮演着重要角色&#xff0c;通常会通过不同的接口与音频系统中的其他组件&#xff08;如功放、扬声器、音频源等&#xff09;进行连接。以汽车应用场景为例&#xff0c;以下是一些常见的接口类型分类及其介绍…

Linux操作系统学习---初识环境变量

目录 ​编辑 环境变量的概念&#xff1a; 小插曲&#xff1a;main函数的第一、二个参数 获取环境变量信息&#xff1a; 1.main函数的第三个参数 2.查看单个环境变量 3.c语言库函数getenv() 和环境变量相关的操作指令&#xff1a; 1.export---导出环境变量&#xff1a; 2.unse…

每日速记10道java面试题04

其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 目录 一、什么是java的自动拆箱和装箱&#xff1f; 二、什么是java中的迭代器&#xff1f; 三、Java 运行时异常和编译时异常之间的区别是什么? 四、…

Python字典的用法(定义、增加、删除、修改、查询、遍历)

一.字典的介绍 dictionary&#xff08;字典&#xff09;是除了列表以外的 Python 中最灵活的数据类型。dict&#xff08;字典&#xff09;可以采用多个数据&#xff0c;通常用于存储描述一个物体的相关信息。 字典和列表最主要的区别是&#xff0c;字典是无序的对象集合&#x…

多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG

Title: 多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG 文章目录 I. 向量叉乘的矩阵转换恒等式II. 符号计算 Maxima 程序推导III. 推论和关联公式的说明1. 推论2. 应用于对极几何中基本矩阵推导3. 应用于基本矩阵与单应矩阵关系4. 与刚体运动…

支持多种快充协议的取电芯片,支持最大功率140W

前言 在快节奏的现代生活中&#xff0c;人们对于小家电的依赖日益加深&#xff0c;而随之而来的充电问题也日益凸显。传统的充电方式往往受限于电压、电流的限制&#xff0c;难以满足不同设备对电力的多样化需求。而PD快充协议的诞生&#xff0c;则为这一难题提供了全新的解决…

分页查询功能

EmployeeController /** * 员工分页查询 * * param employeePageQueryDTO * return */ GetMapping("/page") ApiOperation("员工分页查询") public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) { log.info("…

深度学习读书笔记 绪论

深度学习是什么&#xff1f; 机器学习的分支。 深度学习问题也是指从有限样例中总结出一般的规律&#xff0c;应用在新的未知数据上的方法。 机器学习的三个基本要素 模型 机器学习任务首要弄明白的&#xff0c;也就是一个机器学习任务所面对的输入空间和输出空间。 输入…

“移门缓冲支架:为家庭安全加码”

在智能家居日益普及的今天&#xff0c;科技不仅改变了我们的生活方式&#xff0c;也提升了家居的安全。移门缓冲支架作为一项结合了现代技术的小型装置&#xff0c;正逐渐成为提升家庭安全的重要配件。它通过吸收门关闭时的冲击力、减缓关门速度以及减少噪音等多重功能&#xf…

npm error code ETIMEDOUT 简单排查

今天突然没到一个仓库的ius问题。改完之后想发布npm包 出现下面的场景 npm addUser npm adduser npm notice Log in on https://registry.npmjs.org/ Create your account at: https://www.npmjs.com/login?next/login/cli/12596c8b-ba4a-4763-8a97-215087d380c4 Press ENTER…

力扣96:不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1 卡…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展

Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型&#xff08;LLM&#xff09;的指南。Torchtune 是一个PyTorch库&#xff0c;旨在让您轻松地…