init: Initialize the basic project.

This commit is contained in:
2026-01-06 09:58:29 +08:00
commit 1ab79d6f8f
1441 changed files with 129326 additions and 0 deletions

View File

@@ -0,0 +1 @@
# 登录鉴权插件api接口

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.nl</groupId>
<artifactId>nl-plugin-api</artifactId>
<version>3.0.0</version>
</parent>
<artifactId>nl-plugin-auth-api</artifactId>
<packaging>jar</packaging>
<description>登录鉴权插件api接口</description>
<dependencies>
<!-- 每个插件接口都要引入common -->
<dependency>
<groupId>org.nl</groupId>
<artifactId>nl-common</artifactId>
</dependency>
<!-- sa-token-core -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,40 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.api;
import cn.hutool.json.JSONObject;
/**
* 认证鉴权API
*
* @author yubaoshan
* @date 2024/7/18 17:35
*/
public interface AuthApi {
/**
* 获取基础登录业务数据b端在线用户c端在线用户
*
* @author yubaoshan
* @date 2024/7/18 17:35
*/
JSONObject getUserSessionCount();
/**
* 获取三方用户总量
*
* @author yubaoshan
* @date 2024/7/18 17:35
*/
Long getThirdUserCount();
}

View File

@@ -0,0 +1,124 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.api;
import cn.hutool.json.JSONObject;
import org.nl.auth.core.pojo.SaBaseClientLoginUser;
import org.nl.auth.core.pojo.SaBaseLoginUser;
import java.util.List;
/**
* 登录用户API由其他模块实现
*
* @author xuyuxiang
* @date 2021/12/23 21:48
*/
public interface SaBaseLoginUserApi {
/**
* 根据id获取B端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseLoginUser getUserById(String id);
/**
* 根据id获取C端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseClientLoginUser getClientUserById(String id);
/**
* 根据账号获取B端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseLoginUser getUserByAccount(String account);
/**
* 根据账号获取C端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseClientLoginUser getClientUserByAccount(String account);
/**
* 根据手机号获取B端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseLoginUser getUserByPhone(String phone);
/**
* 根据手机号获取C端用户信息查不到则返回null
*
* @author xuyuxiang
* @date 2022/3/10 16:14
**/
SaBaseClientLoginUser getClientUserByPhone(String phone);
/**
* 根据用户id获取用户集合
*
* @author xuyuxiang
* @date 2022/4/27 22:53
*/
List<JSONObject> listUserByUserIdList(List<String> userIdList);
/**
* 根据用户id获取角色集合
*
* @author xuyuxiang
* @date 2022/4/27 22:53
*/
List<JSONObject> getRoleListByUserId(String userId);
/**
* 根据角色id和用户id集合获取按钮码集合
*
* @author xuyuxiang
* @date 2022/4/27 22:54
*/
List<String> getButtonCodeListListByUserAndRoleIdList(List<String> userAndRoleIdList);
/**
* 根据角色id和用户id集合获取移动端按钮码集合
*
* @author xuyuxiang
* @date 2022/4/27 22:54
*/
List<String> getMobileButtonCodeListListByUserIdAndRoleIdList(List<String> userAndRoleIdList);
/**
* 根据角色id和用户id集合获取权限集合
*
* @author xuyuxiang
* @date 2022/4/27 22:54
*/
List<JSONObject> getPermissionListByUserIdAndRoleIdList(List<String> userAndRoleIdList, String orgId);
/**
* 更新用户的登录时间和登录ip等信息
*
* @author xuyuxiang
* @date 2022/4/27 22:57
*/
void updateUserLoginInfo(String userId, String device);
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.annotation;
import cn.dev33.satoken.annotation.SaCheckLogin;
import org.nl.auth.core.util.StpClientUtil;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 登录认证(前台User版):只有登录之后才能进入该方法
* 可标注在函数、类上(效果等同于标注在此类的所有方法上)
*
* @author xuyuxiang
* @date 2022/3/10 10:39
**/
@SaCheckLogin(type = StpClientUtil.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaClientCheckLogin {
}

View File

@@ -0,0 +1,51 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.annotation;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import org.nl.auth.core.util.StpClientUtil;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 权限认证(前台User版):必须具有指定权限才能进入该方法
* 可标注在函数、类上(效果等同于标注在此类的所有方法上)
*
* @author xuyuxiang
* @date 2022/3/10 10:40
**/
@SaCheckPermission(type = StpClientUtil.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaClientCheckPermission {
/**
* 需要校验的权限码
* @return 需要校验的权限码
*/
@AliasFor(annotation = SaCheckPermission.class)
String [] value() default {};
/**
* 验证模式AND | OR默认AND
* @return 验证模式
*/
@AliasFor(annotation = SaCheckPermission.class)
SaMode mode() default SaMode.AND;
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.annotation;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import org.nl.auth.core.util.StpClientUtil;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 角色认证(前台User版):必须具有指定角色标识才能进入该方法
* 可标注在函数、类上(效果等同于标注在此类的所有方法上)
*
* @author xuyuxiang
* @date 2022/3/10 10:41
**/
@SaCheckRole(type = StpClientUtil.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaClientCheckRole {
/**
* 需要校验的角色标识
* @return 需要校验的角色标识
*/
@AliasFor(annotation = SaCheckRole.class)
String [] value() default {};
/**
* 验证模式AND | OR默认AND
* @return 验证模式
*/
@AliasFor(annotation = SaCheckRole.class)
SaMode mode() default SaMode.AND;
}

View File

@@ -0,0 +1,49 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.enums;
import lombok.Getter;
import org.nl.common.exception.CommonException;
/**
* 登录端类型枚举
*
* @author xuyuxiang
* @date 2021/10/11 14:02
**/
@Getter
public enum SaClientTypeEnum {
/**
* B端用户
*/
B("B"),
/**
* C端用户
*/
C("C");
private final String value;
SaClientTypeEnum(String value) {
this.value = value;
}
public static void validate(String value) {
boolean flag = B.getValue().equals(value) || C.getValue().equals(value);
if(!flag) {
throw new CommonException("不支持的登录端类型:{}", value);
}
}
}

View File

@@ -0,0 +1,235 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
/**
* 基础的C端登录用户对象可继承此类扩展更多属性
*
* @author xuyuxiang
* @date 2021/12/23 21:49
*/
@Getter
@Setter
public abstract class SaBaseClientLoginUser {
/** id */
@Schema(description = "id")
private String id;
/** 头像 */
@Schema(description = "头像图片base64")
private String avatar;
/** 签名 */
@Schema(description = "签名图片base64")
private String signature;
/** 账号 */
@Schema(description = "账号")
private String account;
/** 姓名 */
@Schema(description = "姓名")
private String name;
/** 昵称 */
@Schema(description = "昵称")
private String nickname;
/** 性别 */
@Schema(description = "性别")
private String gender;
/** 年龄 */
@Schema(description = "年龄")
private String age;
/** 出生日期 */
@Schema(description = "出生日期")
private String birthday;
/** 民族 */
@Schema(description = "民族")
private String nation;
/** 籍贯 */
@Schema(description = "籍贯")
private String nativePlace;
/** 家庭住址 */
@Schema(description = "家庭住址")
private String homeAddress;
/** 通信地址 */
@Schema(description = "通信地址")
private String mailingAddress;
/** 证件类型 */
@Schema(description = "证件类型")
private String idCardType;
/** 证件号码 */
@Schema(description = "证件号码")
private String idCardNumber;
/** 文化程度 */
@Schema(description = "文化程度")
private String cultureLevel;
/** 政治面貌 */
@Schema(description = "政治面貌")
private String politicalOutlook;
/** 毕业院校 */
@Schema(description = "毕业院校")
private String college;
/** 学历 */
@Schema(description = "学历")
private String education;
/** 学制 */
@Schema(description = "学制")
private String eduLength;
/** 学位 */
@Schema(description = "学位")
private String degree;
/** 手机 */
@Schema(description = "手机")
private String phone;
/** 邮箱 */
@Schema(description = "邮箱")
private String email;
/** 家庭电话 */
@Schema(description = "家庭电话")
private String homeTel;
/** 办公电话 */
@Schema(description = "办公电话")
private String officeTel;
/** 紧急联系人 */
@Schema(description = "紧急联系人")
private String emergencyContact;
/** 紧急联系人电话 */
@Schema(description = "紧急联系人电话")
private String emergencyPhone;
/** 紧急联系人地址 */
@Schema(description = "紧急联系人地址")
private String emergencyAddress;
/** 上次登录ip */
@Schema(description = "上次登录ip")
private String lastLoginIp;
/** 上次登录地点 */
@Schema(description = "上次登录地点")
private String lastLoginAddress;
/** 上次登录时间 */
@Schema(description = "上次登录时间")
private Date lastLoginTime;
/** 上次登录设备 */
@Schema(description = "上次登录设备")
private String lastLoginDevice;
/** 最新登录ip */
@Schema(description = "最新登录ip")
private String latestLoginIp;
/** 最新登录地点 */
@Schema(description = "最新登录地点")
private String latestLoginAddress;
/** 最新登录时间 */
@Schema(description = "最新登录时间")
private Date latestLoginTime;
/** 最新登录设备 */
@Schema(description = "最新登录设备")
private String latestLoginDevice;
/** 用户状态 */
@Schema(description = "用户状态")
private String userStatus;
/** 排序码 */
@Schema(description = "排序码")
private Integer sortCode;
/** 扩展信息 */
@Schema(description = "扩展信息")
private String extJson;
/** 按钮码集合 */
@Schema(description = "按钮码集合")
private List<String> buttonCodeList;
/** 移动端按钮码集合 */
@Schema(description = "移动端按钮码集合")
private List<String> mobileButtonCodeList;
/** 权限码集合 */
@Schema(description = "权限码集合", hidden = true)
private List<String> permissionCodeList;
/** 角色码集合 */
@Schema(description = "角色码集合", hidden = true)
private List<String> roleCodeList;
/** 数据范围集合 */
@Schema(description = "数据范围集合", hidden = true)
private List<DataScope> dataScopeList;
/** 用户密码hash值 */
@JsonIgnore
@Schema(description = "用户密码hash值")
private String password;
/** 是否可登录,由继承类实现 */
public abstract Boolean getEnabled();
/**
* 数据范围类
*
* @author xuyuxiang
* @date 2022/8/15 13:57
**/
@Getter
@Setter
public static class DataScope {
/** API接口 */
@Schema(description = "API接口")
private String apiUrl;
/** 数据范围 */
@Schema(description = "数据范围")
private List<String> dataScope;
}
}

View File

@@ -0,0 +1,271 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
import java.util.List;
/**
* 基础的B端登录用户对象可继承此类扩展更多属性
*
* @author xuyuxiang
* @date 2021/12/23 21:49
*/
@Getter
@Setter
public abstract class SaBaseLoginUser {
/** id */
@Schema(description = "id")
private String id;
/** 头像 */
@Schema(description = "头像")
private String avatar;
/** 签名 */
@Schema(description = "签名")
private String signature;
/** 账号 */
@Schema(description = "账号")
private String account;
/** 姓名 */
@Schema(description = "姓名")
private String name;
/** 昵称 */
@Schema(description = "昵称")
private String nickname;
/** 性别 */
@Schema(description = "性别")
private String gender;
/** 年龄 */
@Schema(description = "年龄")
private String age;
/** 出生日期 */
@Schema(description = "出生日期")
private String birthday;
/** 民族 */
@Schema(description = "民族")
private String nation;
/** 籍贯 */
@Schema(description = "籍贯")
private String nativePlace;
/** 家庭住址 */
@Schema(description = "家庭住址")
private String homeAddress;
/** 通信地址 */
@Schema(description = "通信地址")
private String mailingAddress;
/** 证件类型 */
@Schema(description = "证件类型")
private String idCardType;
/** 证件号码 */
@Schema(description = "证件号码")
private String idCardNumber;
/** 文化程度 */
@Schema(description = "文化程度")
private String cultureLevel;
/** 政治面貌 */
@Schema(description = "政治面貌")
private String politicalOutlook;
/** 毕业院校 */
@Schema(description = "毕业院校")
private String college;
/** 学历 */
@Schema(description = "学历")
private String education;
/** 学制 */
@Schema(description = "学制")
private String eduLength;
/** 学位 */
@Schema(description = "学位")
private String degree;
/** 手机 */
@Schema(description = "手机")
private String phone;
/** 邮箱 */
@Schema(description = "邮箱")
private String email;
/** 家庭电话 */
@Schema(description = "家庭电话")
private String homeTel;
/** 办公电话 */
@Schema(description = "办公电话")
private String officeTel;
/** 紧急联系人 */
@Schema(description = "紧急联系人")
private String emergencyContact;
/** 紧急联系人电话 */
@Schema(description = "紧急联系人电话")
private String emergencyPhone;
/** 紧急联系人地址 */
@Schema(description = "紧急联系人地址")
private String emergencyAddress;
/** 员工编号 */
@Schema(description = "员工编号")
private String empNo;
/** 入职日期 */
@Schema(description = "入职日期")
private String entryDate;
/** 组织id */
@Schema(description = "组织id")
private String orgId;
/** 组织名称 */
@Schema(description = "组织名称")
private String orgName;
/** 职位id */
@Schema(description = "职位id")
private String positionId;
/** 职位名称 */
@Schema(description = "职位名称")
private String positionName;
/** 职级 */
@Schema(description = "职级")
private String positionLevel;
/** 主管id */
@Schema(description = "主管id")
private String directorId;
/** 兼任信息 */
@Schema(description = "兼任信息")
private String positionJson;
/** 上次登录ip */
@Schema(description = "上次登录ip")
private String lastLoginIp;
/** 上次登录地点 */
@Schema(description = "上次登录地点")
private String lastLoginAddress;
/** 上次登录时间 */
@Schema(description = "上次登录时间")
private Date lastLoginTime;
/** 上次登录设备 */
@Schema(description = "上次登录设备")
private String lastLoginDevice;
/** 最新登录ip */
@Schema(description = "最新登录ip")
private String latestLoginIp;
/** 最新登录地点 */
@Schema(description = "最新登录地点")
private String latestLoginAddress;
/** 最新登录时间 */
@Schema(description = "最新登录时间")
private Date latestLoginTime;
/** 最新登录设备 */
@Schema(description = "最新登录设备")
private String latestLoginDevice;
/** 用户状态 */
@Schema(description = "用户状态")
private String userStatus;
/** 排序码 */
@Schema(description = "排序码")
private Integer sortCode;
/** 扩展信息 */
@Schema(description = "扩展信息")
private String extJson;
/** 按钮码集合 */
@Schema(description = "按钮码集合")
private List<String> buttonCodeList;
/** 移动端按钮码集合 */
@Schema(description = "移动端按钮码集合")
private List<String> mobileButtonCodeList;
/** 权限码集合 */
@Schema(description = "权限码集合", hidden = true)
private List<String> permissionCodeList;
/** 角色码集合 */
@Schema(description = "角色码集合", hidden = true)
private List<String> roleCodeList;
/** 数据范围集合 */
@Schema(description = "数据范围集合", hidden = true)
private List<DataScope> dataScopeList;
/** 用户密码hash值 */
@JsonIgnore
@Schema(description = "用户密码hash值")
private String password;
/** 是否可登录,由继承类实现 */
public abstract Boolean getEnabled();
/**
* 数据范围类
*
* @author xuyuxiang
* @date 2022/8/15 13:57
**/
@Getter
@Setter
public static class DataScope {
/** API接口 */
@Schema(description = "API接口")
private String apiUrl;
/** 数据范围 */
@Schema(description = "数据范围")
private List<String> dataScope;
}
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.util;
import cn.hutool.core.collection.CollectionUtil;
import org.nl.auth.core.pojo.SaBaseClientLoginUser;
import java.util.List;
/**
* C端登录用户工具类
*
* @author xuyuxiang
* @date 2022/7/8 10:40
**/
public class StpClientLoginUserUtil {
/**
* 获取当前C端登录用户
*
* @author xuyuxiang
* @date 2022/7/8 10:41
**/
public static SaBaseClientLoginUser getClientLoginUser() {
return (SaBaseClientLoginUser) StpClientUtil.getTokenSession().get("loginUser");
}
/**
* 获取当前C端登录用户的当前请求接口的数据范围暂无数据范围
*
* @author xuyuxiang
* @date 2022/7/8 10:41
**/
public static List<String> getLoginUserDataScope() {
return CollectionUtil.newArrayList();
}
}

View File

@@ -0,0 +1,936 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.util;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import java.util.List;
/**
* Sa-Token 权限认证工具类 (C端用户版)
*
* @author xuyuxiang
* @date 2022/3/10 10:43
**/
public class StpClientUtil {
/**
* 账号类型标识
*/
public static final String TYPE = "C";
/**
* 底层的 StpLogic 对象,使用匿名子类 重写`stpLogic对象`的一些方法
*/
public static StpLogic stpLogic = new StpLogic(TYPE) {
/**
* 重写 StpLogic 类下的 `splicingKeyTokenName` 函数,返回一个与 `StpUtil` 相同的token名称
*/
@Override
public String splicingKeyTokenName() {
return super.splicingKeyTokenName();
}
// 此处可以根据需求重写其他方法
};
/**
* 获取当前 StpLogic 的账号类型
* @return See Note
*/
public static String getLoginType() {
return stpLogic.getLoginType();
}
/**
* 重置 StpLogic 对象
* @param stpLogic /
*/
public static void setStpLogic(StpLogic stpLogic) {
StpUtil.stpLogic = stpLogic;
// 防止自定义 stpLogic 被覆盖
SaManager.putStpLogic(stpLogic);
}
// =================== 获取token 相关 ===================
/**
* 返回token名称
* @return 此StpLogic的token名称
*/
public static String getTokenName() {
return stpLogic.getTokenName();
}
/**
* 在当前会话写入当前TokenValue
* @param tokenValue token值
*/
public static void setTokenValue(String tokenValue) {
stpLogic.setTokenValue(tokenValue);
}
/**
* 在当前会话写入当前TokenValue
* @param tokenValue token值
* @param cookieTimeout Cookie存活时间(秒)
*/
public static void setTokenValue(String tokenValue, int cookieTimeout) {
stpLogic.setTokenValue(tokenValue, cookieTimeout);
}
/**
* 获取当前TokenValue
* @return 当前tokenValue
*/
public static String getTokenValue() {
return stpLogic.getTokenValue();
}
/**
* 获取当前TokenValue (不裁剪前缀)
* @return /
*/
public static String getTokenValueNotCut() {
return stpLogic.getTokenValueNotCut();
}
/**
* 获取当前会话的Token信息
* @return token信息
*/
public static SaTokenInfo getTokenInfo() {
return stpLogic.getTokenInfo();
}
// =================== 登录相关操作 ===================
// --- 登录
/**
* 会话登录
* @param id 账号id建议的类型long | int | String
*/
public static void login(Object id) {
stpLogic.login(id);
}
/**
* 会话登录,并指定登录设备
* @param id 账号id建议的类型long | int | String
* @param device 设备标识
*/
public static void login(Object id, String device) {
stpLogic.login(id, device);
}
/**
* 会话登录,并指定是否 [记住我]
* @param id 账号id建议的类型long | int | String
* @param isLastingCookie 是否为持久Cookie
*/
public static void login(Object id, boolean isLastingCookie) {
stpLogic.login(id, isLastingCookie);
}
/**
* 会话登录并指定所有登录参数Model
* @param id 登录id建议的类型long | int | String
* @param loginModel 此次登录的参数Model
*/
public static void login(Object id, SaLoginModel loginModel) {
stpLogic.login(id, loginModel);
}
/**
* 创建指定账号id的登录会话
* @param id 登录id建议的类型long | int | String
* @return 返回会话令牌
*/
public static String createLoginSession(Object id) {
return stpLogic.createLoginSession(id);
}
/**
* 创建指定账号id的登录会话
* @param id 登录id建议的类型long | int | String
* @param loginModel 此次登录的参数Model
* @return 返回会话令牌
*/
public static String createLoginSession(Object id, SaLoginModel loginModel) {
return stpLogic.createLoginSession(id, loginModel);
}
// --- 注销
/**
* 会话注销
*/
public static void logout() {
stpLogic.logout();
}
/**
* 会话注销根据账号id
* @param loginId 账号id
*/
public static void logout(Object loginId) {
stpLogic.logout(loginId);
}
/**
* 会话注销根据账号id 和 设备标识
*
* @param loginId 账号id
* @param device 设备标识 (填null代表所有注销设备)
*/
public static void logout(Object loginId, String device) {
stpLogic.logout(loginId, device);
}
/**
* 会话注销,根据指定 Token
*
* @param tokenValue 指定token
*/
public static void logoutByTokenValue(String tokenValue) {
stpLogic.logoutByTokenValue(tokenValue);
}
/**
* 踢人下线根据账号id
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-5 </p>
*
* @param loginId 账号id
*/
public static void kickout(Object loginId) {
stpLogic.kickout(loginId);
}
/**
* 踢人下线根据账号id 和 设备标识
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-5 </p>
*
* @param loginId 账号id
* @param device 设备标识 (填null代表踢出所有设备)
*/
public static void kickout(Object loginId, String device) {
stpLogic.kickout(loginId, device);
}
/**
* 踢人下线,根据指定 Token
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-5 </p>
*
* @param tokenValue 指定token
*/
public static void kickoutByTokenValue(String tokenValue) {
stpLogic.kickoutByTokenValue(tokenValue);
}
/**
* 顶人下线根据账号id 和 设备标识
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-4 </p>
*
* @param loginId 账号id
* @param device 设备标识 (填null代表顶替所有设备)
*/
public static void replaced(Object loginId, String device) {
stpLogic.replaced(loginId, device);
}
// 查询相关
/**
* 当前会话是否已经登录
* @return 是否已登录
*/
public static boolean isLogin() {
return stpLogic.isLogin();
}
/**
* 检验当前会话是否已经登录,如未登录,则抛出异常
*/
public static void checkLogin() {
stpLogic.checkLogin();
}
/**
* 获取当前会话账号id, 如果未登录,则抛出异常
* @return 账号id
*/
public static Object getLoginId() {
return stpLogic.getLoginId();
}
/**
* 获取当前会话账号id, 如果未登录,则返回默认值
* @param <T> 返回类型
* @param defaultValue 默认值
* @return 登录id
*/
public static <T> T getLoginId(T defaultValue) {
return stpLogic.getLoginId(defaultValue);
}
/**
* 获取当前会话账号id, 如果未登录则返回null
* @return 账号id
*/
public static Object getLoginIdDefaultNull() {
return stpLogic.getLoginIdDefaultNull();
}
/**
* 获取当前会话账号id, 并转换为String类型
* @return 账号id
*/
public static String getLoginIdAsString() {
return stpLogic.getLoginIdAsString();
}
/**
* 获取当前会话账号id, 并转换为int类型
* @return 账号id
*/
public static int getLoginIdAsInt() {
return stpLogic.getLoginIdAsInt();
}
/**
* 获取当前会话账号id, 并转换为long类型
* @return 账号id
*/
public static long getLoginIdAsLong() {
return stpLogic.getLoginIdAsLong();
}
/**
* 获取指定Token对应的账号id如果未登录则返回 null
* @param tokenValue token
* @return 账号id
*/
public static Object getLoginIdByToken(String tokenValue) {
return stpLogic.getLoginIdByToken(tokenValue);
}
/**
* 获取Token扩展信息只在jwt模式下有效
* @param key 键值
* @return 对应的扩展数据
*/
public static Object getExtra(String key) {
return stpLogic.getExtra(key);
}
// =================== User-Session 相关 ===================
/**
* 获取指定账号id的Session, 如果Session尚未创建isCreate=是否新建并返回
* @param loginId 账号id
* @param isCreate 是否新建
* @return Session对象
*/
public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
return stpLogic.getSessionByLoginId(loginId, isCreate);
}
/**
* 获取指定key的Session, 如果Session尚未创建则返回null
* @param sessionId SessionId
* @return Session对象
*/
public static SaSession getSessionBySessionId(String sessionId) {
return stpLogic.getSessionBySessionId(sessionId);
}
/**
* 获取指定账号id的Session如果Session尚未创建则新建并返回
* @param loginId 账号id
* @return Session对象
*/
public static SaSession getSessionByLoginId(Object loginId) {
return stpLogic.getSessionByLoginId(loginId);
}
/**
* 获取当前会话的Session, 如果Session尚未创建isCreate=是否新建并返回
* @param isCreate 是否新建
* @return Session对象
*/
public static SaSession getSession(boolean isCreate) {
return stpLogic.getSession(isCreate);
}
/**
* 获取当前会话的Session如果Session尚未创建则新建并返回
* @return Session对象
*/
public static SaSession getSession() {
return stpLogic.getSession();
}
// =================== Token-Session 相关 ===================
/**
* 获取指定Token-Session如果Session尚未创建则新建并返回
* @param tokenValue Token值
* @return Session对象
*/
public static SaSession getTokenSessionByToken(String tokenValue) {
return stpLogic.getTokenSessionByToken(tokenValue);
}
/**
* 获取当前Token-Session如果Session尚未创建则新建并返回
* @return Session对象
*/
public static SaSession getTokenSession() {
return stpLogic.getTokenSession();
}
// =================== [临时有效期] 验证相关 ===================
/**
* 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
*/
public static void checkActiveTimeout() {
stpLogic.checkActiveTimeout();
}
/**
* 续签当前token(将 [最后操作时间] 更新为当前时间戳)
* <h1>请注意: 即时token已经 [临时过期] 也可续签成功,
* 如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否过期即可 </h1>
*/
public static void updateLastActiveToNow() {
stpLogic.updateLastActiveToNow();
}
// =================== 过期时间相关 ===================
/**
* 获取当前登录者的 token 剩余有效时间 (单位: 秒)
* @return token剩余有效时间
*/
public static long getTokenTimeout() {
return stpLogic.getTokenTimeout();
}
/**
* 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒)
* @return token剩余有效时间
*/
public static long getSessionTimeout() {
return stpLogic.getSessionTimeout();
}
/**
* 获取当前 Token-Session 剩余有效时间 (单位: 秒)
* @return token剩余有效时间
*/
public static long getTokenSessionTimeout() {
return stpLogic.getTokenSessionTimeout();
}
/**
* 获取当前 token [临时过期] 剩余有效时间 (单位: 秒)
* @return token [临时过期] 剩余有效时间
*/
public static long getTokenActiveTimeout() {
return stpLogic.getTokenActiveTimeout();
}
/**
* 对当前 Token 的 timeout 值进行续期
* @param timeout 要修改成为的有效时间 (单位: 秒)
*/
public static void renewTimeout(long timeout) {
stpLogic.renewTimeout(timeout);
}
/**
* 对指定 Token 的 timeout 值进行续期
* @param tokenValue 指定token
* @param timeout 要修改成为的有效时间 (单位: 秒)
*/
public static void renewTimeout(String tokenValue, long timeout) {
stpLogic.renewTimeout(tokenValue, timeout);
}
// =================== 角色验证操作 ===================
/**
* 获取:当前账号的角色集合
* @return /
*/
public static List<String> getRoleList() {
return stpLogic.getRoleList();
}
/**
* 获取:指定账号的角色集合
* @param loginId 指定账号id
* @return /
*/
public static List<String> getRoleList(Object loginId) {
return stpLogic.getRoleList(loginId);
}
/**
* 判断:当前账号是否拥有指定角色, 返回true或false
* @param role 角色标识
* @return 是否含有指定角色标识
*/
public static boolean hasRole(String role) {
return stpLogic.hasRole(role);
}
/**
* 判断:指定账号是否含有指定角色标识, 返回true或false
* @param loginId 账号id
* @param role 角色标识
* @return 是否含有指定角色标识
*/
public static boolean hasRole(Object loginId, String role) {
return stpLogic.hasRole(loginId, role);
}
/**
* 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
* @param roleArray 角色标识数组
* @return true或false
*/
public static boolean hasRoleAnd(String... roleArray) {
return stpLogic.hasRoleAnd(roleArray);
}
/**
* 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
* @param roleArray 角色标识数组
* @return true或false
*/
public static boolean hasRoleOr(String... roleArray) {
return stpLogic.hasRoleOr(roleArray);
}
/**
* 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
* @param role 角色标识
*/
public static void checkRole(String role) {
stpLogic.checkRole(role);
}
/**
* 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
* @param roleArray 角色标识数组
*/
public static void checkRoleAnd(String... roleArray) {
stpLogic.checkRoleAnd(roleArray);
}
/**
* 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
* @param roleArray 角色标识数组
*/
public static void checkRoleOr(String... roleArray) {
stpLogic.checkRoleOr(roleArray);
}
// =================== 权限验证操作 ===================
/**
* 获取:当前账号的权限码集合
* @return /
*/
public static List<String> getPermissionList() {
return stpLogic.getPermissionList();
}
/**
* 获取:指定账号的权限码集合
* @param loginId 指定账号id
* @return /
*/
public static List<String> getPermissionList(Object loginId) {
return stpLogic.getPermissionList(loginId);
}
/**
* 判断:当前账号是否含有指定权限, 返回true或false
* @param permission 权限码
* @return 是否含有指定权限
*/
public static boolean hasPermission(String permission) {
return stpLogic.hasPermission(permission);
}
/**
* 判断指定账号id是否含有指定权限, 返回true或false
* @param loginId 账号id
* @param permission 权限码
* @return 是否含有指定权限
*/
public static boolean hasPermission(Object loginId, String permission) {
return stpLogic.hasPermission(loginId, permission);
}
/**
* 判断:当前账号是否含有指定权限, [指定多个,必须全部具有]
* @param permissionArray 权限码数组
* @return true 或 false
*/
public static boolean hasPermissionAnd(String... permissionArray) {
return stpLogic.hasPermissionAnd(permissionArray);
}
/**
* 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
* @param permissionArray 权限码数组
* @return true 或 false
*/
public static boolean hasPermissionOr(String... permissionArray) {
return stpLogic.hasPermissionOr(permissionArray);
}
/**
* 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
* @param permission 权限码
*/
public static void checkPermission(String permission) {
stpLogic.checkPermission(permission);
}
/**
* 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过]
* @param permissionArray 权限码数组
*/
public static void checkPermissionAnd(String... permissionArray) {
stpLogic.checkPermissionAnd(permissionArray);
}
/**
* 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
* @param permissionArray 权限码数组
*/
public static void checkPermissionOr(String... permissionArray) {
stpLogic.checkPermissionOr(permissionArray);
}
// =================== id 反查token 相关操作 ===================
/**
* 获取指定账号id的tokenValue
* <p> 在配置为允许并发登录时此方法只会返回队列的最后一个token
* 如果你需要返回此账号id的所有token请调用 getTokenValueListByLoginId
* @param loginId 账号id
* @return token值
*/
public static String getTokenValueByLoginId(Object loginId) {
return stpLogic.getTokenValueByLoginId(loginId);
}
/**
* 获取指定账号id指定设备端的tokenValue
* <p> 在配置为允许并发登录时此方法只会返回队列的最后一个token
* 如果你需要返回此账号id的所有token请调用 getTokenValueListByLoginId
* @param loginId 账号id
* @param device 设备标识
* @return token值
*/
public static String getTokenValueByLoginId(Object loginId, String device) {
return stpLogic.getTokenValueByLoginId(loginId, device);
}
/**
* 获取指定账号id的tokenValue集合
* @param loginId 账号id
* @return 此loginId的所有相关token
*/
public static List<String> getTokenValueListByLoginId(Object loginId) {
return stpLogic.getTokenValueListByLoginId(loginId);
}
/**
* 获取指定账号id指定设备端的tokenValue 集合
* @param loginId 账号id
* @param device 设备标识
* @return 此loginId的所有相关token
*/
public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
return stpLogic.getTokenValueListByLoginId(loginId, device);
}
/**
* 返回当前会话的登录设备
* @return 当前令牌的登录设备
*/
public static String getLoginDevice() {
return stpLogic.getLoginDevice();
}
// =================== 会话管理 ===================
/**
* 根据条件查询Token
* @param keyword 关键字
* @param start 开始处索引 (-1代表查询所有)
* @param size 获取数量
* @return token集合
*/
public static List<String> searchTokenValue(String keyword, int start, int size, boolean sortType) {
return stpLogic.searchTokenValue(keyword, start, size, sortType);
}
/**
* 根据条件查询SessionId
* @param keyword 关键字
* @param start 开始处索引 (-1代表查询所有)
* @param size 获取数量
* @return sessionId集合
*/
public static List<String> searchSessionId(String keyword, int start, int size, boolean sortType) {
return stpLogic.searchSessionId(keyword, start, size, sortType);
}
/**
* 根据条件查询Token专属Session的Id
* @param keyword 关键字
* @param start 开始处索引 (-1代表查询所有)
* @param size 获取数量
* @return sessionId集合
*/
public static List<String> searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
return stpLogic.searchTokenSessionId(keyword, start, size, sortType);
}
// ------------------- 账号封禁 -------------------
/**
* 封禁指定账号
* <p> 此方法不会直接将此账号id踢下线而是在对方再次登录时抛出`DisableLoginException`异常
* @param loginId 指定账号id
* @param disableTime 封禁时间, 单位: 秒 -1=永久封禁)
*/
public static void disable(Object loginId, long disableTime) {
stpLogic.disable(loginId, disableTime);
}
/**
* 指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
* @param loginId 账号id
* @return see note
*/
public static boolean isDisable(Object loginId) {
return stpLogic.isDisable(loginId);
}
/**
* 获取指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
* @param loginId 账号id
* @return see note
*/
public static long getDisableTime(Object loginId) {
return stpLogic.getDisableTime(loginId);
}
/**
* 解封指定账号
* @param loginId 账号id
*/
public static void untieDisable(Object loginId) {
stpLogic.untieDisable(loginId);
}
// =================== 身份切换 ===================
/**
* 临时切换身份为指定账号id
* @param loginId 指定loginId
*/
public static void switchTo(Object loginId) {
stpLogic.switchTo(loginId);
}
/**
* 结束临时切换身份
*/
public static void endSwitch() {
stpLogic.endSwitch();
}
/**
* 当前是否正处于[身份临时切换]中
* @return 是否正处于[身份临时切换]中
*/
public static boolean isSwitch() {
return stpLogic.isSwitch();
}
/**
* 在一个代码段里方法内临时切换身份为指定账号id
* @param loginId 指定账号id
* @param function 要执行的方法
*/
public static void switchTo(Object loginId, SaFunction function) {
stpLogic.switchTo(loginId, function);
}
// ------------------- 二级认证 -------------------
/**
* 在当前会话 开启二级认证
* @param safeTime 维持时间 (单位: 秒)
*/
public static void openSafe(long safeTime) {
stpLogic.openSafe(safeTime);
}
/**
* 当前会话 是否处于二级认证时间内
* @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
*/
public static boolean isSafe() {
return stpLogic.isSafe();
}
/**
* 检查当前会话是否已通过二级认证,如未通过则抛出异常
*/
public static void checkSafe() {
stpLogic.checkSafe();
}
/**
* 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证)
* @return 剩余有效时间
*/
public static long getSafeTime() {
return stpLogic.getSafeTime();
}
/**
* 在当前会话 结束二级认证
*/
public static void closeSafe() {
stpLogic.closeSafe();
}
// =================== 历史API兼容旧版本 ===================
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.getLoginType() ,使用方式保持不变 </h1>
*
* 获取当前StpLogin的loginKey
* @return 当前StpLogin的loginKey
*/
@Deprecated
public static String getLoginKey() {
return stpLogic.getLoginType();
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
*
* 在当前会话上登录id
* @param loginId 登录id建议的类型long | int | String
*/
@Deprecated
public static void setLoginId(Object loginId) {
stpLogic.login(loginId);
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
*
* 在当前会话上登录id, 并指定登录设备
* @param loginId 登录id建议的类型long | int | String
* @param device 设备标识
*/
@Deprecated
public static void setLoginId(Object loginId, String device) {
stpLogic.login(loginId, device);
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
*
* 在当前会话上登录id, 并指定登录设备
* @param loginId 登录id建议的类型long | int | String
* @param isLastingCookie 是否为持久Cookie
*/
@Deprecated
public static void setLoginId(Object loginId, boolean isLastingCookie) {
stpLogic.login(loginId, isLastingCookie);
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.login() ,使用方式保持不变 </h1>
*
* 在当前会话上登录id, 并指定所有登录参数Model
* @param loginId 登录id建议的类型long | int | String
* @param loginModel 此次登录的参数Model
*/
@Deprecated
public static void setLoginId(Object loginId, SaLoginModel loginModel) {
stpLogic.login(loginId, loginModel);
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
*
* 会话注销根据账号id (踢人下线)
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-2
* @param loginId 账号id
*/
@Deprecated
public static void logoutByLoginId(Object loginId) {
stpLogic.kickout(loginId);
}
/**
* <h1> 本函数设计已过时,未来版本可能移除此函数,请及时更换为 StpUtil.kickout() ,使用方式保持不变 </h1>
*
* 会话注销根据账号id and 设备标识 (踢人下线)
* <p> 当对方再次访问系统时会抛出NotLoginException异常场景值=-2 </p>
* @param loginId 账号id
* @param device 设备标识 (填null代表所有注销设备)
*/
@Deprecated
public static void logoutByLoginId(Object loginId, String device) {
stpLogic.kickout(loginId, device);
}
}

View File

@@ -0,0 +1,55 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package org.nl.auth.core.util;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import org.nl.auth.core.pojo.SaBaseLoginUser;
import org.nl.common.util.CommonServletUtil;
import java.util.List;
/**
* B端登录用户工具类
*
* @author xuyuxiang
* @date 2022/7/8 10:40
**/
public class StpLoginUserUtil {
/**
* 获取当前B端登录用户
*
* @author xuyuxiang
* @date 2022/7/8 10:41
**/
public static SaBaseLoginUser getLoginUser() {
return (SaBaseLoginUser) StpUtil.getTokenSession().get("loginUser");
}
/**
* 获取当前B端登录用户的当前请求接口的数据范围
*
* @author xuyuxiang
* @date 2022/7/8 10:41
**/
public static List<String> getLoginUserDataScope() {
List<String> resultList = CollectionUtil.newArrayList();
getLoginUser().getDataScopeList().forEach(dataScope -> {
if(dataScope.getApiUrl().equals(CommonServletUtil.getRequest().getServletPath())) {
resultList.addAll(dataScope.getDataScope());
}
});
return resultList;
}
}