电子商务网站建设方面的论文,外贸公司经营范围,网站建设考试多选题,中建西部建设网站文章目录Sa-Token 介绍SpringBoot 集成 Sa-TokenSa-Token 功能登录认证会话查询Token 查询权限认证权限校验角色校验注解鉴权注册 Sa-Token 拦截器关闭注解校验路由拦截鉴权注册 Sa-Token 路由拦截器[记住我] 模式密码加密Sa-Token 集成 Redis方式1、使用 jdk 默认序列化方式方…
文章目录Sa-Token 介绍SpringBoot 集成 Sa-TokenSa-Token 功能登录认证会话查询Token 查询权限认证权限校验角色校验注解鉴权注册 Sa-Token 拦截器关闭注解校验路由拦截鉴权注册 Sa-Token 路由拦截器[记住我] 模式密码加密Sa-Token 集成 Redis方式1、使用 jdk 默认序列化方式方式2、使用 jackson 序列化方式集成 Redis 注意集成 Thymeleaf1、引入依赖2、注册标签方言对象3、使用标签方言登录判断3.2、角色判断权限判断调用 Sa-Token 相关APISa-Token使用问题汇总访问静态资源Sa-Token 介绍
Sa-Token 是一个轻量级 Java 权限认证框架主要解决登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token最新开发文档地址https://sa-token.cc Sa-Token功能结构图 SpringBoot 集成 Sa-Token 创建 SpringBoot 项目 再 Pom.xml 文件中添加 Sa-Token 依赖 !-- Sa-Token 权限认证在线文档https://sa-token.cc --
dependencygroupIdcn.dev33/groupIdartifactIdsa-token-spring-boot-starter/artifactIdversion1.34.0/version
/dependency注如果你使用的 SpringBoot 3.x只需要将 sa-token-spring-boot-starter 修改为 sa-token-spring-boot3-starter 即可。 设置配置文件 支持零配置启动项目 但同时也可以在 application.yml 中增加如下配置。 server:# 端口port: 8081############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token: # token名称 (同时也是cookie名称)token-name: satoken# token有效期单位s 默认30天, -1代表永不过期 timeout: 2592000# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒activity-timeout: -1# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) is-concurrent: true# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) is-share: true# token风格token-style: uuid# 是否输出操作日志 is-log: falseSa-Token 功能
登录认证 会话登录 // 会话登录参数填写要登录的账号id建议的数据类型long | int | String 不可以传入复杂类型如User、Admin 等等
StpUtil.login(Object id); StpUtil.login()函数让 Sa-Token 为这个账号创建了一个Token凭证且通过 Cookie 上下文返回给了前端除此之外Sa-Token 在背后做了大量的工作包括但不限于 检查此账号是否之前已有登录为账号生成 Token 凭证与 Session 会话通知全局侦听器xx 账号登录成功将 Token 注入到请求上下文等等其它工作…… 在 Cookie 功能的加持下我们可以仅靠 StpUtil.login(id) 一句代码就完成登录认证。 Cookie 可以从后端控制往浏览器中写入 Token 值。Cookie 会在前端每次发起请求时自动提交 Token 值。 注销登录 // 当前会话注销登录
StpUtil.logout();是否登录 // 获取当前会话是否已经登录返回true已登录false未登录
StpUtil.isLogin();检查登录 // 检验当前会话是否已经登录, 如果未登录则抛出异常NotLoginException代表当前会话暂未登录可能的原因有很多
StpUtil.checkLogin();会话查询
// 获取当前会话账号id, 如果未登录则抛出异常NotLoginException
StpUtil.getLoginId();// 类似查询API还有
StpUtil.getLoginIdAsString(); // 获取当前会话账号id, 并转化为String类型
StpUtil.getLoginIdAsInt(); // 获取当前会话账号id, 并转化为int类型
StpUtil.getLoginIdAsLong(); // 获取当前会话账号id, 并转化为long类型// ---------- 指定未登录情形下返回的默认值 ----------// 获取当前会话账号id, 如果未登录则返回null
StpUtil.getLoginIdDefaultNull();// 获取当前会话账号id, 如果未登录则返回默认值 defaultValue可以为任意类型
StpUtil.getLoginId(T defaultValue);Token 查询
// 获取当前会话的token值
StpUtil.getTokenValue();// 获取当前StpLogic的token名称
StpUtil.getTokenName();// 获取指定token对应的账号id如果未登录则返回 null
StpUtil.getLoginIdByToken(String tokenValue);// 获取当前会话剩余有效期单位s返回-1代表永久有效
StpUtil.getTokenTimeout();// 获取当前会话的token信息参数
StpUtil.getTokenInfo();权限认证 因为每个项目的需求不同其权限设计也千变万化 所以 Sa-Token 将 [ 获取当前账号权限码集合 ] 操作以接口的方式暴露给你以方便你根据自己的业务逻辑进行重写。 新建一个类实现 StpInterface 接口例如以下代码
/*** 自定义权限验证接口扩展*/
Component // 保证此类被SpringBoot扫描完成Sa-Token的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {/*** 返回一个账号所拥有的权限码集合 */Overridepublic ListString getPermissionList(Object loginId, String loginType) {// 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限ListString list new ArrayListString(); list.add(user.add);list.add(user.update);list.add(user.get);// list.add(user.delete);list.add(art.*);return list;}/*** 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)*/Overridepublic ListString getRoleList(Object loginId, String loginType) {// 本list仅做模拟实际项目中要根据具体业务逻辑来查询角色ListString list new ArrayListString(); list.add(admin);list.add(super-admin);return list;}}参数解释
loginId账号id即你在调用 StpUtil.login(id) 时写入的标识值。loginType账号体系标识此处可以暂时忽略在 [ 多账户认证 ] 章节下会对这个概念做详细的解释。
权限校验
// 获取当前账号所拥有的权限集合
StpUtil.getPermissionList();// 判断当前账号是否含有指定权限, 返回 true 或 false
StpUtil.hasPermission(user.add); // 校验当前账号是否含有指定权限, 如果验证未通过则抛出异常: NotPermissionException
StpUtil.checkPermission(user.add); // 校验当前账号是否含有指定权限 [指定多个必须全部验证通过]
StpUtil.checkPermissionAnd(user.add, user.delete, user.get); // 校验当前账号是否含有指定权限 [指定多个只要其一验证通过即可]
StpUtil.checkPermissionOr(user.add, user.delete, user.get); 角色校验
// 获取当前账号所拥有的角色集合
StpUtil.getRoleList();// 判断当前账号是否拥有指定角色, 返回 true 或 false
StpUtil.hasRole(super-admin); // 校验当前账号是否含有指定角色标识, 如果验证未通过则抛出异常: NotRoleException
StpUtil.checkRole(super-admin); // 校验当前账号是否含有指定角色标识 [指定多个必须全部验证通过]
StpUtil.checkRoleAnd(super-admin, shop-admin); // 校验当前账号是否含有指定角色标识 [指定多个只要其一验证通过即可]
StpUtil.checkRoleOr(super-admin, shop-admin); 权限通配符“*”Sa-Token允许你根据通配符指定泛权限例如当一个账号拥有art.*的权限时art.add、art.delete、art.update都将匹配通过 注解鉴权
SaCheckLogin: 登录校验 —— 只有登录之后才能进入该方法。SaCheckRole(admin): 角色校验 —— 必须具有指定角色标识才能进入该方法。SaCheckPermission(user:add): 权限校验 —— 必须具有指定权限才能进入该方法。SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法。SaCheckBasic: HttpBasic校验 —— 只有通过 Basic 认证后才能进入该方法。SaIgnore忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。SaCheckDisable(comment)账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。
Sa-Token 使用全局拦截器完成注解鉴权功能为了不为项目带来不必要的性能负担拦截器默认处于关闭状态 因此为了使用注解鉴权你必须手动将 Sa-Token 的全局拦截器注册到你项目中
注册 Sa-Token 拦截器
以SpringBoot2.0为例新建配置类SaTokenConfigure.java
Configuration
public class SaTokenConfigure implements WebMvcConfigurer {// 注册 Sa-Token 拦截器打开注解式鉴权功能 Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册 Sa-Token 拦截器打开注解式鉴权功能 registry.addInterceptor(new SaInterceptor()).addPathPatterns(/**); }
}保证此类被springboot启动类扫描到即可
关闭注解校验
SaInterceptor 只要注册到项目中默认就会打开注解校验如果要关闭此能力需要
Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SaInterceptor(handle - {SaRouter.match(/**).check(r - StpUtil.checkLogin());}).isAnnotation(false) // 指定关闭掉注解鉴权能力这样框架就只会做路由拦截校验了 ).addPathPatterns(/**);
}路由拦截鉴权
假设我们有如下需求 项目中所有接口均需要登录认证只有 “登录接口” 本身对外开放 那么给每个接口加上鉴权注解手写全局拦截器似乎都不是非常方便。
注册 Sa-Token 路由拦截器
以SpringBoot2.0为例, 新建配置类SaTokenConfigure.java
Configuration
public class SaTokenConfigure implements WebMvcConfigurer {// 注册拦截器Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册 Sa-Token 拦截器校验规则为 StpUtil.checkLogin() 登录校验。registry.addInterceptor(new SaInterceptor(handle - StpUtil.checkLogin())).addPathPatterns(/**).excludePathPatterns(/user/doLogin); }
}以上代码我们注册了一个基于 StpUtil.checkLogin() 的登录校验拦截器并且排除了/user/doLogin接口用来开放登录除了/user/doLogin以外的所有接口都需要登录才能访问。
[记住我] 模式
Sa-Token的登录授权默认就是[记住我]模式为了实现[非记住我]模式你需要在登录时如下设置 StpUtil.login() 函数的第二个参数
// 设置登录账号id为10001第二个参数指定是否为[记住我]当此值为false后关闭浏览器后再次打开需要重新登录
StpUtil.login(10001, false);勾选 [记住我] 按钮时调用StpUtil.login(10001, true)此时用户即使重启浏览器 Token 依然有效。不勾选 [记住我] 按钮时调用StpUtil.login(10001, false)此时用户在重启浏览器后 Token 便会消失导致会话失效。
密码加密
Sa-Token 支持摘要加密、对称加密、非对称加密、Base64加密等方式。
// md5加密
SaSecureUtil.md5(123456);// sha1加密
SaSecureUtil.sha1(123456);// sha256加密
SaSecureUtil.sha256(123456);Sa-Token 集成 Redis
方式1、使用 jdk 默认序列化方式
!-- Sa-Token 整合 Redis 使用 jdk 默认序列化方式 --
dependencygroupIdcn.dev33/groupIdartifactIdsa-token-dao-redis/artifactIdversion1.34.0/version
/dependency方式2、使用 jackson 序列化方式
!-- Sa-Token 整合 Redis 使用 jackson 序列化方式 --
dependencygroupIdcn.dev33/groupIdartifactIdsa-token-dao-redis-jackson/artifactIdversion1.34.0/version
/dependency集成 Redis 注意
1. 无论使用哪种序列化方式你都必须为项目提供一个 Redis 实例化方案例如
!-- 提供Redis连接池 --
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId
/dependency2. 引入了依赖我还需要为 Redis 配置连接信息吗 需要只有项目初始化了正确的 Redis 实例Sa-Token才可以使用 Redis 进行数据持久化参考以下yml配置
spring: # redis配置 redis:# Redis数据库索引默认为0database: 1# Redis服务器地址host: 127.0.0.1# Redis服务器连接端口port: 6379# Redis服务器连接密码默认为空# password: # 连接超时时间timeout: 10slettuce:pool:# 连接池最大连接数max-active: 200# 连接池最大阻塞等待时间使用负值表示没有限制max-wait: -1ms# 连接池中的最大空闲连接max-idle: 10# 连接池中的最小空闲连接min-idle: 03. 集成 Redis 后是我额外手动保存数据还是框架自动保存 框架自动保存。集成 Redis 只需要引入对应的 pom依赖 即可框架所有上层 API 保持不变。
4. 集成包版本问题 Sa-Token-Redis 集成包的版本尽量与 Sa-Token-Starter 集成包的版本一致否则可能出现兼容性问题。
集成 Thymeleaf
可以在 Thymeleaf 页面中使用 Sa-Token 相关API俗称 —— 标签方言。
1、引入依赖
首先我们确保项目已经引入 Thymeleaf 依赖然后在此基础上继续添加
!-- 在 thymeleaf 标签中使用 Sa-Token --
dependencygroupIdcn.dev33/groupIdartifactIdsa-token-dialect-thymeleaf/artifactIdversion1.34.0/version
/dependency2、注册标签方言对象
在 SaTokenConfigure 配置类中注册 Bean
Configuration
public class SaTokenConfigure {// Sa-Token 标签方言 (Thymeleaf版)Beanpublic SaTokenDialect getSaTokenDialect() {return new SaTokenDialect();}
}3、使用标签方言
然后我们就可以愉快的使用在 Thymeleaf 页面中使用标签方言了
登录判断
h2标签方言测试页面/h2
p登录之后才能显示span sa:loginvalue/span
/p
p不登录才能显示span sa:notLoginvalue/span
/p3.2、角色判断
p具有角色 admin 才能显示span sa:hasRoleadminvalue/span
/p
p同时具备多个角色才能显示span sa:hasRoleAndadmin, ceo, ctovalue/span
/p
p只要具有其中一个角色就能显示span sa:hasRoleOradmin, ceo, ctovalue/span
/p
p不具有角色 admin 才能显示span sa:lackRoleadminvalue/span
/p权限判断
p具有权限 user-add 才能显示span sa:hasPermissionuser-addvalue/span
/p
p同时具备多个权限才能显示span sa:hasPermissionAnduser-add, user-delete, user-getvalue/span
/p
p只要具有其中一个权限就能显示span sa:hasPermissionOruser-add, user-delete, user-getvalue/span
/p
p不具有权限 user-add 才能显示span sa:lackPermissionuser-addvalue/span
/p调用 Sa-Token 相关API
以上的标签方言可以满足我们大多数场景下的权限判断然后有时候我们依然需要更加灵活的在页面中调用 Sa-Token 框架API
首先在 SaTokenConfigure 配置类中为 Thymeleaf 配置全局对象
Configuration
public class SaTokenConfigure {Autowiredprivate void configureThymeleafStaticVars(ThymeleafViewResolver viewResolver) {viewResolver.addStaticVariable(stp, StpUtil.stpLogic);}}然后就可以在页面上调用 StpLogic 的 API 了例如
p调用 StpLogic 方法调用测试/p
p th:if${stp.isLogin()}从SaSession中取值span th:text${stp.getSession().get(name)}/span
/pSa-Token使用问题汇总
访问静态资源
项目引入Sa-Token后需要对访问的静态资源路径放行否则就会被拦截那么需要在用户自创建的WebMvcConfigurer实现类中配置本地资源映射路径并添加Sa-Token拦截器的路由拦截规则对访问静态资源的路径进行放行。 //配置本地资源映射路径 Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/static/**).addResourceLocations(classpath:/static/);}// 注册Sa-token拦截器// 注册拦截器Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册 Sa-Token 拦截器定义详细认证规则registry.addInterceptor(new SaInterceptor(handler - {// 指定一条 match 规则SaRouter.match(/**) // 拦截.notMatch(/static/**) // 放行 /static/** 路径.check(r - StpUtil.checkLogin()); // 执行校验登录})).addPathPatterns(/**);}
文章转载自: http://www.morning.jkftn.cn.gov.cn.jkftn.cn http://www.morning.c7624.cn.gov.cn.c7624.cn http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn http://www.morning.wjlrw.cn.gov.cn.wjlrw.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.pzdxg.cn.gov.cn.pzdxg.cn http://www.morning.zzfqn.cn.gov.cn.zzfqn.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.bwznl.cn.gov.cn.bwznl.cn http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.rmtxp.cn.gov.cn.rmtxp.cn http://www.morning.bppml.cn.gov.cn.bppml.cn http://www.morning.tdwjj.cn.gov.cn.tdwjj.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.bfmrq.cn.gov.cn.bfmrq.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.qwwhs.cn.gov.cn.qwwhs.cn http://www.morning.jmbfx.cn.gov.cn.jmbfx.cn http://www.morning.shsh1688.com.gov.cn.shsh1688.com http://www.morning.zkdbx.cn.gov.cn.zkdbx.cn http://www.morning.wqgr.cn.gov.cn.wqgr.cn http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn http://www.morning.rytps.cn.gov.cn.rytps.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.mplld.cn.gov.cn.mplld.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.bdgb.cn.gov.cn.bdgb.cn http://www.morning.sypby.cn.gov.cn.sypby.cn http://www.morning.rfkyb.cn.gov.cn.rfkyb.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn http://www.morning.mrcpy.cn.gov.cn.mrcpy.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.sskkf.cn.gov.cn.sskkf.cn http://www.morning.qnzld.cn.gov.cn.qnzld.cn http://www.morning.rttkl.cn.gov.cn.rttkl.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.dtlqc.cn.gov.cn.dtlqc.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.lxwjx.cn.gov.cn.lxwjx.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.qfqld.cn.gov.cn.qfqld.cn http://www.morning.bpp999.com.gov.cn.bpp999.com http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn http://www.morning.fkwp.cn.gov.cn.fkwp.cn http://www.morning.yfcbf.cn.gov.cn.yfcbf.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.rlwcs.cn.gov.cn.rlwcs.cn http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn http://www.morning.xhftj.cn.gov.cn.xhftj.cn http://www.morning.ltkms.cn.gov.cn.ltkms.cn http://www.morning.fkmyq.cn.gov.cn.fkmyq.cn http://www.morning.kyfrl.cn.gov.cn.kyfrl.cn http://www.morning.pffx.cn.gov.cn.pffx.cn http://www.morning.wnhgb.cn.gov.cn.wnhgb.cn http://www.morning.gghhmi.cn.gov.cn.gghhmi.cn http://www.morning.lbfgq.cn.gov.cn.lbfgq.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn http://www.morning.pbzgj.cn.gov.cn.pbzgj.cn http://www.morning.fslrx.cn.gov.cn.fslrx.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.kfhm.cn.gov.cn.kfhm.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.dhnqt.cn.gov.cn.dhnqt.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn