v1.4.0更新

This commit is contained in:
shengzhang
2020-09-07 02:21:35 +08:00
parent 61647a2bba
commit 167cff595e
51 changed files with 624 additions and 500 deletions

View File

@@ -6,15 +6,19 @@ import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoDefault;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpInterfaceDefaultImpl;
import cn.dev33.satoken.util.SaTokenInsideUtil;
/**
* 管理sa-token所有对象
* 管理sa-token所有对象
* @author kong
*
*/
public class SaTokenManager {
// 配置文件 Bean
/**
* 配置文件 Bean
*/
private static SaTokenConfig config;
public static SaTokenConfig getConfig() {
if (config == null) {
@@ -25,7 +29,7 @@ public class SaTokenManager {
public static void setConfig(SaTokenConfig config) {
SaTokenManager.config = config;
if(config.getIsV()) {
SaTokenUtil.printSaToken();
SaTokenInsideUtil.printSaToken();
}
}
public synchronized static void initConfig() {
@@ -34,7 +38,10 @@ public class SaTokenManager {
}
}
// 持久化 Bean
/**
* 持久化 Bean
*/
public static SaTokenDao dao;
public static SaTokenDao getDao() {
if (dao == null) {
@@ -52,7 +59,9 @@ public class SaTokenManager {
}
// 权限认证 Bean
/**
* 权限认证 Bean
*/
public static StpInterface stp;
public static StpInterface getStp() {
if (stp == null) {

View File

@@ -1,30 +0,0 @@
package cn.dev33.satoken;
/**
* sa-token 工具类
*/
public class SaTokenUtil {
// sa-token 版本号
public static final String version = "v1.0.3";
// sa-token 开源地址
public static final String github_url = "https://github.com/click33/sa-token";
// 打印 sa-token
public static void printSaToken() {
String str =
"____ ____ ___ ____ _ _ ____ _ _ \r\n" +
"[__ |__| __ | | | |_/ |___ |\\ | \r\n" +
"___] | | | |__| | \\_ |___ | \\| \r\n" +
"sa-token" + version + " \r\n" +
"GitHub" + github_url + "\r\n";
System.out.println(str);
}
// 如果token为本次请求新创建的则以此字符串为key存储在当前request中 JUST_CREATED_SAVE_KEY
public static final String JUST_CREATED_SAVE_KEY= "JUST_CREATED_SAVE_KEY_";
}

View File

@@ -11,11 +11,14 @@ import cn.dev33.satoken.stp.StpUtil;
/**
* 注解式鉴权 - 拦截器
* @author kong
*/
public class SaCheckInterceptor implements HandlerInterceptor {
// 底层的 StpLogic 对象
/**
* 底层的 StpLogic 对象
*/
public StpLogic stpLogic = null;
/**
@@ -36,7 +39,9 @@ public class SaCheckInterceptor implements HandlerInterceptor {
// 每次请求之前触发
/**
* 每次请求之前触发
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
@@ -62,7 +67,7 @@ public class SaCheckInterceptor implements HandlerInterceptor {
}
// 开始验证权限
Object[] codeArray = concatABC(scp.value(), scp.valueInt(), scp.valueLong());
Object[] codeArray = concatAbc(scp.value(), scp.valueInt(), scp.valueLong());
if(scp.isAnd()) {
stpLogic.checkPermissionAnd(codeArray); // 必须全部都有
} else {
@@ -76,8 +81,14 @@ public class SaCheckInterceptor implements HandlerInterceptor {
// 合并三个数组
private Object[] concatABC(String[] a, int[] b, long[] c) {
/**
* 合并三个数组
* @param a .
* @param b .
* @param c .
* @return .
*/
private Object[] concatAbc(String[] a, int[] b, long[] c) {
// 循环赋值
Object[] d = new Object[a.length + b.length + c.length];
for (int i = 0; i < a.length; i++) {

View File

@@ -7,6 +7,8 @@ import java.lang.annotation.Target;
/**
* 标注一个路由方法,当前会话必须已登录才能通过
* @author kong
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })

View File

@@ -6,7 +6,9 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 标注一个路由方法,当前会话必须具有指定权限才可以通过
* 标注一个路由方法,当前会话必须具有指定权限才可以通过
* @author kong
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})

View File

@@ -2,14 +2,17 @@ package cn.dev33.satoken.config;
/**
* sa-token 总配置类
* @author kong
*
*/
public class SaTokenConfig {
private String tokenName = "satoken"; // token名称同时也是cookie名称
private long timeout = 30 * 24 * 60 * 60; // token有效期单位s 默认30天
private Boolean isShare = true; // 在多人登录同一账号时,是否共享会话为true时共用一个为false时新登录挤掉旧登录
private Boolean isReadHead = true; // 是否在cookie读取不到token时继续从请求header里继续尝试读取
private Boolean isReadBody = true; // 是否header读取不到token时,继续从请求题参数里继续尝试读取
private String tokenName = "satoken"; // token名称 (同时也是cookie名称)
private long timeout = 30 * 24 * 60 * 60; // token有效期单位s 默认30天
private Boolean isShare = true; // 在多人登录同一账号时,是否共享会话 (为true时共用一个为false时新登录挤掉旧登录)
private Boolean isReadBody = true; // 是否尝试从请求体里读取token
private Boolean isReadHead = true; // 是否尝试从header读取token
private Boolean isReadCookie = true; // 是否尝试从cookie里读取token
private Boolean isV = true; // 是否在初始化配置时打印版本字符画
@@ -58,6 +61,20 @@ public class SaTokenConfig {
this.isShare = isShare;
}
/**
* @return isReadCookie
*/
public Boolean getIsReadCookie() {
return isReadCookie;
}
/**
* @param isReadCookie 要设置的 isReadCookie
*/
public void setIsReadCookie(Boolean isReadCookie) {
this.isReadCookie = isReadCookie;
}
/**
* @return isReadHead
*/
@@ -100,14 +117,18 @@ public class SaTokenConfig {
this.isV = isV;
}
/* (非 Javadoc
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "SaTokenConfig [tokenName=" + tokenName + ", timeout=" + timeout + ", isShare=" + isShare
+ ", isReadHead=" + isReadHead + ", isReadBody=" + isReadBody + ", isV=" + isV + "]";
+ ", isReadBody=" + isReadBody + ", isReadHead=" + isReadHead + ", isReadCookie=" + isReadCookie
+ ", isV=" + isV + "]";
}

View File

@@ -8,12 +8,17 @@ import java.util.Map;
import java.util.Properties;
/**
创建一个配置文件
* 创建一个配置文件
* @author kong
*
*/
public class SaTokenConfigFactory {
public static String configPath = "sa-token.properties"; // 默认配置文件地址
/**
* 默认配置文件地址
*/
public static String configPath = "sa-token.properties";
/**
* 根据指定路径获取配置信息
@@ -97,7 +102,7 @@ public class SaTokenConfigFactory {
* 将字符串转化为指定数据类型
* @param str 值
* @param cs 要转换的类型
* @return
* @return .
*/
@SuppressWarnings("unchecked")
private static <T>T getObjectByClass(String str, Class<T> cs){

View File

@@ -4,6 +4,8 @@ import cn.dev33.satoken.session.SaSession;
/**
* sa-token持久层的接口
* @author kong
*
*/
public interface SaTokenDao {
@@ -11,7 +13,7 @@ public interface SaTokenDao {
/**
* 根据key获取value ,如果没有,则返回空
* @param key 键名称
* @return
* @return value
*/
public String getValue(String key);
@@ -25,7 +27,7 @@ public interface SaTokenDao {
/**
* 删除一个指定的key
* @param key
* @param key 键名称
*/
public void delKey(String key);
@@ -34,7 +36,7 @@ public interface SaTokenDao {
/**
* 根据指定key的session如果没有则返回空
* @param sessionId 键名称
* @return
* @return SaSession
*/
public SaSession getSaSession(String sessionId);

View File

@@ -7,10 +7,14 @@ import cn.dev33.satoken.session.SaSession;
/**
* sa-token持久层默认的实现类 , 基于内存Map
* @author kong
*
*/
public class SaTokenDaoDefault implements SaTokenDao {
// 所有数据集合
/**
* 所有数据集合
*/
Map<String, Object> dataMap = new HashMap<String, Object>();

View File

@@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil;
/**
* 没有登陆抛出的异常
* @author kong
*
*/
public class NotLoginException extends RuntimeException {
@@ -16,13 +18,13 @@ public class NotLoginException extends RuntimeException {
/**
* login_key
*/
private String login_key;
private String loginKey;
/**
* 获得login_key
* @return login_key
*/
public String getLoginKey() {
return login_key;
return loginKey;
}
@@ -30,16 +32,17 @@ public class NotLoginException extends RuntimeException {
* 创建一个
*/
public NotLoginException() {
this(StpUtil.stpLogic.login_key);
this(StpUtil.stpLogic.loginKey);
}
/**
* 创建一个
* @param login_key login_key
* @param loginKey login_key
*/
public NotLoginException(String login_key) {
super("当前会话未登录"); // 这里到底要不要拼接上login_key呢纠结
this.login_key = login_key;
public NotLoginException(String loginKey) {
// 这里到底要不要拼接上login_key呢纠结
super("当前会话未登录");
this.loginKey = loginKey;
}
}

View File

@@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil;
/**
* 没有指定权限码,抛出的异常
* @author kong
*
*/
public class NotPermissionException extends RuntimeException {
@@ -26,23 +28,24 @@ public class NotPermissionException extends RuntimeException {
/**
* login_key
*/
private String login_key;
private String loginKey;
/**
* 获得login_key
* @return login_key
*/
public String getLoginKey() {
return login_key;
return loginKey;
}
public NotPermissionException(Object code) {
this(code, StpUtil.stpLogic.login_key);
this(code, StpUtil.stpLogic.loginKey);
}
public NotPermissionException(Object code, String login_key) {
super("无此权限:" + code); // 这里到底要不要拼接上login_key呢纠结
public NotPermissionException(Object code, String loginKey) {
// 这里到底要不要拼接上login_key呢纠结
super("无此权限:" + code);
this.code = code;
this.login_key = login_key;
this.loginKey = loginKey;
}

View File

@@ -17,9 +17,18 @@ public class SaSession implements Serializable {
private static final long serialVersionUID = 1L;
private String id; // 会话id
private long createTime; // 当前会话创建时间
private Map<String, Object> dataMap; // 当前会话键值对
/**
* 会话id
*/
private String id;
/**
* 当前会话创建时间
*/
private long createTime;
/**
* 当前会话键值对
*/
private Map<String, Object> dataMap;
/**
@@ -34,7 +43,7 @@ public class SaSession implements Serializable {
/**
* 获取会话id
* @return
* @return id
*/
public String getId() {
return id;
@@ -70,15 +79,15 @@ public class SaSession implements Serializable {
/**
* 取值,并指定取不到值时的默认值
* @param key 名称
* @param default_value 取不到值的时候返回的默认值
* @return
* @param defaultValue 取不到值的时候返回的默认值
* @return value
*/
public Object getAttribute(String key, Object default_value) {
public Object getAttribute(String key, Object defaultValue) {
Object value = getAttribute(key);
if(value != null) {
return value;
}
return default_value;
return defaultValue;
}

View File

@@ -9,7 +9,9 @@ import cn.dev33.satoken.SaTokenManager;
*/
public class SaSessionCustomUtil {
// 添加上指定前缀防止恶意伪造session
/**
* 添加上指定前缀防止恶意伪造session
*/
public static String session_key = "custom";
public static String getSessionKey(String sessionId) {
return SaTokenManager.getConfig().getTokenName() + ":" + session_key + ":session:" + sessionId;
@@ -27,12 +29,12 @@ public class SaSessionCustomUtil {
/**
* 获取指定key的session
* @param sessionId key
* @param is_create 如果没有,是否新建并返回
* @param isCreate 如果没有,是否新建并返回
* @return
*/
public static SaSession getSessionById(String sessionId, boolean is_create) {
public static SaSession getSessionById(String sessionId, boolean isCreate) {
SaSession session = SaTokenManager.getDao().getSaSession(getSessionKey(sessionId));
if(session == null && is_create) {
if(session == null && isCreate) {
session = new SaSession(getSessionKey(sessionId));
SaTokenManager.getDao().saveSaSession(session, SaTokenManager.getConfig().getTimeout());
}

View File

@@ -10,6 +10,8 @@ import org.springframework.context.annotation.Import;
/**
* 将此注解加到springboot启动类上即可完成sa-token与springboot的集成
* @author kong
*
*/
@Documented
@Target({java.lang.annotation.ElementType.TYPE})

View File

@@ -12,33 +12,45 @@ import cn.dev33.satoken.stp.StpInterface;
/**
* 与SpringBoot集成, 保证此类被扫描即可完成sa-token与SpringBoot的集成
* @author kongyongshun
* @author kong
*
*/
@Component
public class SpringSaToken {
// 获取配置Bean
/**
* 获取配置Bean
* @return
*/
@Bean
@ConfigurationProperties(prefix="spring.sa-token")
public SaTokenConfig getSaTokenConfig() {
return new SaTokenConfig();
}
// 注入配置Bean
/**
* 注入配置Bean
* @param saTokenConfig .
*/
@Autowired
public void setConfig(SaTokenConfig saTokenConfig){
SaTokenManager.setConfig(saTokenConfig);
}
// 注入持久化Bean
/**
* 注入持久化Bean
* @param dao .
*/
@Autowired(required = false)
public void setDao(SaTokenDao dao){
SaTokenManager.setDao(dao);
}
// 注入权限认证Bean
/**
* 注入权限认证Bean
* @param stp .
*/
@Autowired(required = false)
public void setStp(StpInterface stp){
SaTokenManager.setStp(stp);

View File

@@ -3,17 +3,18 @@ package cn.dev33.satoken.stp;
import java.util.List;
/**
* 开放权限验证接口,方便重写
* 开放权限验证接口,方便重写
* @author kong
*/
public interface StpInterface {
/**
* 返回指定login_id所拥有的权限码集合
* @param login_id 账号id
* @param login_key 具体的stp标识
* @param loginId 账号id
* @param loginKey 具体的stp标识
* @return
*/
public List<Object> getPermissionCodeList(Object login_id, String login_key);
public List<Object> getPermissionCodeList(Object loginId, String loginKey);
}

View File

@@ -4,12 +4,13 @@ import java.util.ArrayList;
import java.util.List;
/**
* 权限验证接口 ,默认实现
* 权限验证接口 ,默认实现
* @author kong
*/
public class StpInterfaceDefaultImpl implements StpInterface {
@Override
public List<Object> getPermissionCodeList(Object login_id, String login_key) {
public List<Object> getPermissionCodeList(Object loginId, String loginKey) {
return new ArrayList<Object>();
}

View File

@@ -9,30 +9,37 @@ import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import cn.dev33.satoken.SaTokenManager;
import cn.dev33.satoken.SaTokenUtil;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.util.SaCookieUtil;
import cn.dev33.satoken.util.SpringMVCUtil;
import cn.dev33.satoken.util.SaTokenInsideUtil;
import cn.dev33.satoken.util.SpringMvcUtil;
/**
* sa-token 权限验证,逻辑 实现类
* <p>
* (stp = sa-token-permission 的缩写 )
*
* @author kong
*/
public class StpLogic {
/**
* 持久化的key前缀多账号体系时以此值区分比如login、user、admin
*/
public String loginKey = "";
public String login_key = ""; // 持久化的key前缀多账号体系时以此值区分比如login、user、admin
public StpLogic(String login_key) {
this.login_key = login_key;
/**
* 初始化StpLogic, 并制定loginKey
* @param loginKey .
*/
public StpLogic(String loginKey) {
this.loginKey = loginKey;
}
// =================== 获取token 相关 ===================
@@ -50,51 +57,49 @@ public class StpLogic {
*/
public String getTokenValue(){
// 0、获取相应对象
HttpServletRequest request = SpringMVCUtil.getRequest();
HttpServletRequest request = SpringMvcUtil.getRequest();
SaTokenConfig config = SaTokenManager.getConfig();
String key_tokenName = getKey_tokenName();
String keyTokenName = getKeyTokenName();
// 1、尝试从request里读取
if(request.getAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY) != null) {
return String.valueOf(request.getAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY));
if(request.getAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY) != null) {
return String.valueOf(request.getAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY));
}
// 2、尝试从cookie里读取
Cookie cookie = SaCookieUtil.getCookie(request, key_tokenName);
if(cookie != null){
String tokenValue = cookie.getValue();
// 2、尝试从请求体里面读取
if(config.getIsReadBody() == true){
String tokenValue = request.getParameter(keyTokenName);
if(tokenValue != null) {
return tokenValue;
}
}
// 3、尝试从header力读取
if(config.getIsReadHead() == true){
String tokenValue = request.getHeader(key_tokenName);
String tokenValue = request.getHeader(keyTokenName);
if(tokenValue != null) {
return tokenValue;
}
}
// 4、尝试从请求体里面读取
if(config.getIsReadBody() == true){
String tokenValue = request.getParameter(key_tokenName);
if(tokenValue != null) {
return tokenValue;
// 4、尝试从cookie里读取
if(config.getIsReadCookie() == true){
Cookie cookie = SaCookieUtil.getCookie(request, keyTokenName);
if(cookie != null){
String tokenValue = cookie.getValue();
if(tokenValue != null) {
return tokenValue;
}
}
}
// 5、都读取不到那算了吧还是
return null;
}
/**
* 获取指定id的tokenValue
* @param login_id
* @param loginId .
* @return
*/
public String getTokenValueByLoginId(Object login_id) {
return SaTokenManager.getDao().getValue(getKey_LoginId(login_id));
public String getTokenValueByLoginId(Object loginId) {
return SaTokenManager.getDao().getValue(getKeyLoginId(loginId));
}
/**
@@ -103,7 +108,7 @@ public class StpLogic {
*/
public Map<String, String> getTokenInfo() {
Map<String, String> map = new HashMap<String, String>();
map.put("tokenName", getKey_tokenName());
map.put("tokenName", getKeyTokenName());
map.put("tokenValue", getTokenValue());
return map;
}
@@ -113,61 +118,66 @@ public class StpLogic {
/**
* 在当前会话上登录id
* @param login_id 登录id 建议的类型long | int | String
* @param loginId 登录id 建议的类型long | int | String
*/
public void setLoginId(Object login_id) {
public void setLoginId(Object loginId) {
// 1、获取相应对象
HttpServletRequest request = SpringMVCUtil.getRequest();
HttpServletRequest request = SpringMvcUtil.getRequest();
SaTokenConfig config = SaTokenManager.getConfig();
SaTokenDao dao = SaTokenManager.getDao();
// 2、获取tokenValue
String tokenValue = getTokenValueByLoginId(login_id); // 获取旧tokenValue
String tokenValue = getTokenValueByLoginId(loginId); // 获取旧tokenValue
if(tokenValue == null){ // 为null则创建一个新的
tokenValue = randomTokenValue();
} else {
// 不为null, 并且配置不共享,则删掉原来,并且创建新的
if(config.getIsShare() == false){
dao.delKey(getKey_TokenValue(tokenValue));
dao.delKey(getKeyTokenValue(tokenValue));
tokenValue = randomTokenValue();
}
}
// 3、持久化
dao.setValue(getKey_TokenValue(tokenValue), String.valueOf(login_id), config.getTimeout()); // token -> uid
dao.setValue(getKey_LoginId(login_id), tokenValue, config.getTimeout()); // uid -> token
request.setAttribute(SaTokenUtil.JUST_CREATED_SAVE_KEY, tokenValue); // 保存到本次request里
SaCookieUtil.addCookie(SpringMVCUtil.getResponse(), getKey_tokenName(), tokenValue, "/", (int)config.getTimeout()); // cookie注入
dao.setValue(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout()); // token -> uid
dao.setValue(getKeyLoginId(loginId), tokenValue, config.getTimeout()); // uid -> token
request.setAttribute(SaTokenInsideUtil.JUST_CREATED_SAVE_KEY, tokenValue); // 保存到本次request里
if(config.getIsReadCookie() == true){
SaCookieUtil.addCookie(SpringMvcUtil.getResponse(), getKeyTokenName(), tokenValue, "/", (int)config.getTimeout()); // cookie注入
}
}
/**
* 当前会话注销登录
*/
public void logout() {
Object login_id = getLoginId_defaultNull();
if(login_id != null) {
logoutByLoginId(login_id);
SaCookieUtil.delCookie(SpringMVCUtil.getRequest(), SpringMVCUtil.getResponse(), getKey_tokenName()); // 清除cookie
Object loginId = getLoginIdDefaultNull();
if(loginId != null) {
logoutByLoginId(loginId);
// 清除cookie
if(SaTokenManager.getConfig().getIsReadCookie() == true){
SaCookieUtil.delCookie(SpringMvcUtil.getRequest(), SpringMvcUtil.getResponse(), getKeyTokenName());
}
}
}
/**
* 指定login_id的会话注销登录踢人下线
* @param login_id 账号id
* 指定loginId的会话注销登录踢人下线
* @param loginId 账号id
*/
public void logoutByLoginId(Object login_id) {
public void logoutByLoginId(Object loginId) {
// 获取相应tokenValue
String tokenValue = getTokenValueByLoginId(login_id);
String tokenValue = getTokenValueByLoginId(loginId);
if(tokenValue == null) {
return;
}
// 清除相关数据
SaTokenManager.getDao().delKey(getKey_TokenValue(tokenValue)); // 清除token-id键值对
SaTokenManager.getDao().delKey(getKey_LoginId(login_id)); // 清除id-token键值对
SaTokenManager.getDao().delKey(getKey_session(login_id)); // 清除其session
SaTokenManager.getDao().delKey(getKeyTokenValue(tokenValue)); // 清除token-id键值对
SaTokenManager.getDao().delKey(getKeyLoginId(loginId)); // 清除id-token键值对
SaTokenManager.getDao().delKey(getKeySession(loginId)); // 清除其session
// SaCookieUtil.delCookie(SpringMVCUtil.getRequest(), SpringMVCUtil.getResponse(), getKey_tokenName()); // 清除cookie
}
@@ -178,7 +188,7 @@ public class StpLogic {
* @return 是否已登录
*/
public boolean isLogin() {
return getLoginId_defaultNull() != null;
return getLoginIdDefaultNull() != null;
}
/**
@@ -190,49 +200,49 @@ public class StpLogic {
/**
* 获取当前会话登录id, 如果未登录,则抛出异常
* @return
* @return .
*/
public Object getLoginId() {
Object login_id = getLoginId_defaultNull();
if(login_id == null) {
throw new NotLoginException(this.login_key);
Object loginId = getLoginIdDefaultNull();
if(loginId == null) {
throw new NotLoginException(this.loginKey);
}
return login_id;
return loginId;
}
/**
* 获取当前会话登录id, 如果未登录,则返回默认值
* @param default_value
* @param defaultValue .
* @return
*/
@SuppressWarnings("unchecked")
public <T>T getLoginId(T default_value) {
Object login_id = getLoginId_defaultNull();
if(login_id == null) {
return default_value;
public <T>T getLoginId(T defaultValue) {
Object loginId = getLoginIdDefaultNull();
if(loginId == null) {
return defaultValue;
}
if(default_value instanceof Integer) {
return (T)Integer.valueOf(login_id.toString());
if(defaultValue instanceof Integer) {
return (T)Integer.valueOf(loginId.toString());
}
if(default_value instanceof Long) {
return (T)Long.valueOf(login_id.toString());
if(defaultValue instanceof Long) {
return (T)Long.valueOf(loginId.toString());
}
if(default_value instanceof String) {
return (T)login_id.toString();
if(defaultValue instanceof String) {
return (T)loginId.toString();
}
return (T)login_id;
return (T)loginId;
}
/**
* 获取当前会话登录id, 如果未登录则返回null
* @return
*/
public Object getLoginId_defaultNull() {
public Object getLoginIdDefaultNull() {
String tokenValue = getTokenValue();
if(tokenValue != null) {
Object login_id = SaTokenManager.getDao().getValue(getKey_TokenValue(tokenValue));
if(login_id != null) {
return login_id;
Object loginId = SaTokenManager.getDao().getValue(getKeyTokenValue(tokenValue));
if(loginId != null) {
return loginId;
}
}
return null;
@@ -242,7 +252,7 @@ public class StpLogic {
* 获取当前会话登录id, 并转换为String
* @return
*/
public String getLoginId_asString() {
public String getLoginIdAsString() {
return String.valueOf(getLoginId());
}
@@ -250,10 +260,10 @@ public class StpLogic {
* 获取当前会话登录id, 并转换为int
* @return
*/
public int getLoginId_asInt() {
// Object login_id = getLoginId();
// if(login_id instanceof Integer) {
// return (Integer)login_id;
public int getLoginIdAsInt() {
// Object loginId = getLoginId();
// if(loginId instanceof Integer) {
// return (Integer)loginId;
// }
return Integer.valueOf(String.valueOf(getLoginId()));
}
@@ -262,23 +272,23 @@ public class StpLogic {
* 获取当前会话登录id, 并转换为long
* @return
*/
public long getLoginId_asLong() {
// Object login_id = getLoginId();
// if(login_id instanceof Long) {
// return (Long)login_id;
public long getLoginIdAsLong() {
// Object loginId = getLoginId();
// if(loginId instanceof Long) {
// return (Long)loginId;
// }
return Long.valueOf(String.valueOf(getLoginId()));
}
/**
* 获取指定token对应的登录id如果未登录则返回 null
* @return
* @return .
*/
public Object getLoginIdByToken(String tokenValue) {
if(tokenValue != null) {
Object login_id = SaTokenManager.getDao().getValue(getKey_TokenValue(tokenValue));
if(login_id != null) {
return login_id;
Object loginId = SaTokenManager.getDao().getValue(getKeyTokenValue(tokenValue));
if(loginId != null) {
return loginId;
}
}
return null;
@@ -288,14 +298,14 @@ public class StpLogic {
// =================== session相关 ===================
/**
* 获取指定key的session, 如果没有is_create=是否新建并返回
* @param sessionId
* @param is_create
* @return
* 获取指定key的session, 如果没有isCreate=是否新建并返回
* @param sessionId .
* @param isCreate .
* @return .
*/
protected SaSession getSessionBySessionId(String sessionId, boolean is_create) {
protected SaSession getSessionBySessionId(String sessionId, boolean isCreate) {
SaSession session = SaTokenManager.getDao().getSaSession(sessionId);
if(session == null && is_create) {
if(session == null && isCreate) {
session = new SaSession(sessionId);
SaTokenManager.getDao().saveSaSession(session, SaTokenManager.getConfig().getTimeout());
}
@@ -303,20 +313,30 @@ public class StpLogic {
}
/**
* 获取指定login_id的session
* @param login_id
* @return
* 获取指定loginId的session, 如果没有isCreate=是否新建并返回
* @param loginId 登录id
* @param isCreate 是否新建
* @return SaSession
*/
public SaSession getSessionByLoginId(Object login_id) {
return getSessionBySessionId(getKey_session(login_id), false);
public SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
return getSessionBySessionId(getKeySession(loginId), isCreate);
}
/**
* 获取指定loginId的session
* @param loginId .
* @return .
*/
public SaSession getSessionByLoginId(Object loginId) {
return getSessionByLoginId(getKeySession(loginId), false);
}
/**
* 获取当前会话的session
* @return
*/
public SaSession getSession() {
return getSessionBySessionId(getKey_session(getLoginId()), true);
return getSessionBySessionId(getKeySession(getLoginId()), true);
}
@@ -324,20 +344,20 @@ public class StpLogic {
// =================== 权限验证操作 ===================
/**
* 指定login_id是否含有指定权限
* @param login_id
* @param pcode
* @return
* 指定loginId是否含有指定权限
* @param loginId .
* @param pcode .
* @return .
*/
public boolean hasPermission(Object login_id, Object pcode) {
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key);
public boolean hasPermission(Object loginId, Object pcode) {
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey);
return !(pcodeList == null || pcodeList.contains(pcode) == false);
}
/**
* 当前会话是否含有指定权限
* @param pcode
* @return
* @param pcode .
* @return .
*/
public boolean hasPermission(Object pcode) {
return hasPermission(getLoginId(), pcode);
@@ -345,42 +365,42 @@ public class StpLogic {
/**
* 当前账号是否含有指定权限 没有就抛出异常
* @param pcode
* @param pcode .
*/
public void checkPermission(Object pcode) {
if(hasPermission(pcode) == false) {
throw new NotPermissionException(pcode, this.login_key);
throw new NotPermissionException(pcode, this.loginKey);
}
}
/**
* 当前账号是否含有指定权限 【指定多个,必须全都有】
* @param pcodeArray
* @param pcodeArray .
*/
public void checkPermissionAnd(Object... pcodeArray){
Object login_id = getLoginId();
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key);
Object loginId = getLoginId();
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey);
for (Object pcode : pcodeArray) {
if(pcodeList.contains(pcode) == false) {
throw new NotPermissionException(pcode, this.login_key); // 没有权限抛出异常
throw new NotPermissionException(pcode, this.loginKey); // 没有权限抛出异常
}
}
}
/**
* 当前账号是否含有指定权限 【指定多个,有一个就可以了】
* @param pcodeArray
* @param pcodeArray .
*/
public void checkPermissionOr(Object... pcodeArray){
Object login_id = getLoginId();
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(login_id, login_key);
Object loginId = getLoginId();
List<Object> pcodeList = SaTokenManager.getStp().getPermissionCodeList(loginId, loginKey);
for (Object pcode : pcodeArray) {
if(pcodeList.contains(pcode) == true) {
return; // 有的话提前退出
}
}
if(pcodeArray.length > 0) {
throw new NotPermissionException(pcodeArray[0], this.login_key); // 没有权限抛出异常
throw new NotPermissionException(pcodeArray[0], this.loginKey); // 没有权限抛出异常
}
}
@@ -391,32 +411,32 @@ public class StpLogic {
* 获取key客户端 tokenName
* @return
*/
public String getKey_tokenName() {
public String getKeyTokenName() {
return SaTokenManager.getConfig().getTokenName();
}
/**
* 获取key tokenValue 持久化
* @param tokenValue
* @param tokenValue .
* @return
*/
public String getKey_TokenValue(String tokenValue) {
return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":token:" + tokenValue;
public String getKeyTokenValue(String tokenValue) {
return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":token:" + tokenValue;
}
/**
* 获取key id 持久化
* @param login_id
* @param loginId .
* @return
*/
public String getKey_LoginId(Object login_id) {
return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":id:" + login_id;
public String getKeyLoginId(Object loginId) {
return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":id:" + loginId;
}
/**
* 获取key session 持久化
* @param login_id
* @return
* @param loginId .
* @return .
*/
public String getKey_session(Object login_id) {
return SaTokenManager.getConfig().getTokenName() + ":" + login_key + ":session:" + login_id;
public String getKeySession(Object loginId) {
return SaTokenManager.getConfig().getTokenName() + ":" + loginKey + ":session:" + loginId;
}

View File

@@ -8,11 +8,14 @@ import cn.dev33.satoken.session.SaSession;
/**
* 一个默认的实现
* @author kong
*/
@Service
public class StpUtil {
// 底层的 StpLogic 对象
/**
* 底层的 StpLogic 对象
*/
public static StpLogic stpLogic = new StpLogic("login");
@@ -29,11 +32,11 @@ public class StpUtil {
/**
* 获取指定id的tokenValue
* @param login_id
* @param loginId .
* @return
*/
public static String getTokenValueByLoginId(Object login_id) {
return stpLogic.getTokenValueByLoginId(login_id);
public static String getTokenValueByLoginId(Object loginId) {
return stpLogic.getTokenValueByLoginId(loginId);
}
/**
@@ -48,10 +51,10 @@ public class StpUtil {
/**
* 在当前会话上登录id
* @param login_id 登录id 建议的类型long | int | String
* @param loginId 登录id 建议的类型long | int | String
*/
public static void setLoginId(Object login_id) {
stpLogic.setLoginId(login_id);
public static void setLoginId(Object loginId) {
stpLogic.setLoginId(loginId);
}
/**
@@ -62,11 +65,11 @@ public class StpUtil {
}
/**
* 指定login_id的会话注销登录踢人下线
* @param login_id 账号id
* 指定loginId的会话注销登录踢人下线
* @param loginId 账号id
*/
public static void logoutByLoginId(Object login_id) {
stpLogic.logoutByLoginId(login_id);
public static void logoutByLoginId(Object loginId) {
stpLogic.logoutByLoginId(loginId);
}
// 查询相关
@@ -88,7 +91,7 @@ public class StpUtil {
/**
* 获取当前会话登录id, 如果未登录,则抛出异常
* @return
* @return .
*/
public static Object getLoginId() {
return stpLogic.getLoginId();
@@ -96,48 +99,48 @@ public class StpUtil {
/**
* 获取当前会话登录id, 如果未登录,则返回默认值
* @param default_value
* @return
* @param defaultValue .
* @return .
*/
public static <T> T getLoginId(T default_value) {
return stpLogic.getLoginId(default_value);
public static <T> T getLoginId(T defaultValue) {
return stpLogic.getLoginId(defaultValue);
}
/**
* 获取当前会话登录id, 如果未登录则返回null
* @return
*/
public static Object getLoginId_defaultNull() {
return stpLogic.getLoginId_defaultNull();
public static Object getLoginIdDefaultNull() {
return stpLogic.getLoginIdDefaultNull();
}
/**
* 获取当前会话登录id, 并转换为String
* @return
*/
public static String getLoginId_asString() {
return stpLogic.getLoginId_asString();
public static String getLoginIdAsString() {
return stpLogic.getLoginIdAsString();
}
/**
* 获取当前会话登录id, 并转换为int
* @return
*/
public static int getLoginId_asInt() {
return stpLogic.getLoginId_asInt();
public static int getLoginIdAsInt() {
return stpLogic.getLoginIdAsInt();
}
/**
* 获取当前会话登录id, 并转换为long
* @return
*/
public static long getLoginId_asLong() {
return stpLogic.getLoginId_asLong();
public static long getLoginIdAsLong() {
return stpLogic.getLoginIdAsLong();
}
/**
* 获取指定token对应的登录id如果未登录则返回 null
* @return
* @return .
*/
public static Object getLoginIdByToken(String tokenValue) {
return stpLogic.getLoginIdByToken(tokenValue);
@@ -146,14 +149,24 @@ public class StpUtil {
// =================== session相关 ===================
/**
* 获取指定login_id的session
* @param login_id
* @return
* 获取指定loginId的session, 如果没有isCreate=是否新建并返回
* @param loginId 登录id
* @param isCreate 是否新建
* @return SaSession
*/
public static SaSession getSessionByLoginId(Object login_id) {
return stpLogic.getSessionByLoginId(login_id);
public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
return stpLogic.getSessionByLoginId(loginId, isCreate);
}
/**
* 获取指定loginId的session
* @param loginId .
* @return .
*/
public static SaSession getSessionByLoginId(Object loginId) {
return stpLogic.getSessionByLoginId(loginId);
}
/**
* 获取当前会话的session
* @return
@@ -165,19 +178,19 @@ public class StpUtil {
// =================== 权限验证操作 ===================
/**
* 指定login_id是否含有指定权限
* @param login_id
* @param pcode
* @return
* 指定loginId是否含有指定权限
* @param loginId .
* @param pcode .
* @return .
*/
public static boolean hasPermission(Object login_id, Object pcode) {
return stpLogic.hasPermission(login_id, pcode);
public static boolean hasPermission(Object loginId, Object pcode) {
return stpLogic.hasPermission(loginId, pcode);
}
/**
* 当前会话是否含有指定权限
* @param pcode
* @return
* @param pcode .
* @return .
*/
public static boolean hasPermission(Object pcode) {
return stpLogic.hasPermission(pcode);
@@ -185,7 +198,7 @@ public class StpUtil {
/**
* 当前账号是否含有指定权限 没有就抛出异常
* @param pcode
* @param pcode .
*/
public static void checkPermission(Object pcode) {
stpLogic.checkPermission(pcode);
@@ -193,7 +206,7 @@ public class StpUtil {
/**
* 当前账号是否含有指定权限 【指定多个,必须全都有】
* @param pcodeArray
* @param pcodeArray .
*/
public static void checkPermissionAnd(Object... pcodeArray) {
stpLogic.checkPermissionAnd(pcodeArray);
@@ -201,7 +214,7 @@ public class StpUtil {
/**
* 当前账号是否含有指定权限 【指定多个,有一个就可以了】
* @param pcodeArray
* @param pcodeArray .
*/
public static void checkPermissionOr(Object... pcodeArray) {
stpLogic.checkPermissionOr(pcodeArray);

View File

@@ -14,10 +14,10 @@ public class SaCookieUtil {
/**
* 获取指定cookie
* @param request
* @param cookieName
* @return
* 获取指定cookie .
* @param request .
* @param cookieName .
* @return .
*/
public static Cookie getCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
@@ -35,11 +35,11 @@ public class SaCookieUtil {
/**
* 添加cookie
* @param response
* @param name
* @param value
* @param path
* @param timeout
* @param response .
* @param name .
* @param value .
* @param path .
* @param timeout .
*/
public static void addCookie(HttpServletResponse response,String name,String value,String path,int timeout) {
Cookie cookie = new Cookie(name, value);
@@ -53,10 +53,10 @@ public class SaCookieUtil {
/**
* 删除cookie
* @param request
* @param response
* @param name
* 删除cookie .
* @param request .
* @param response .
* @param name .
*/
public static void delCookie(HttpServletRequest request,HttpServletResponse response,String name) {
Cookie[] cookies = request.getCookies();
@@ -73,10 +73,10 @@ public class SaCookieUtil {
/**
* 修改cookie的value值
* @param request
* @param response
* @param name
* @param value
* @param request .
* @param response .
* @param name .
* @param value .
*/
public static void updateCookie(HttpServletRequest request,HttpServletResponse response,String name,String value) {
Cookie[] cookies = request.getCookies();

View File

@@ -0,0 +1,40 @@
package cn.dev33.satoken.util;
/**
* sa-token 工具类
* @author kong
*
*/
public class SaTokenInsideUtil {
/**
* sa-token 版本号
*/
public static final String VERSION_NO = "v1.4.0";
/**
* sa-token 开源地址
*/
public static final String GITHUB_URL= "https://github.com/click33/sa-token";
/**
* 打印 sa-token
*/
public static void printSaToken() {
String str =
"____ ____ ___ ____ _ _ ____ _ _ \r\n" +
"[__ |__| __ | | | |_/ |___ |\\ | \r\n" +
"___] | | | |__| | \\_ |___ | \\| \r\n" +
"sa-token" + VERSION_NO + " \r\n" +
"GitHub" + GITHUB_URL; // + "\r\n";
System.out.println(str);
}
/**
* 如果token为本次请求新创建的则以此字符串为key存储在当前request中 JUST_CREATED_SAVE_KEY
*/
public static final String JUST_CREATED_SAVE_KEY = "JUST_CREATED_SAVE_KEY_";
}

View File

@@ -11,7 +11,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
* @author kong
*
*/
public class SpringMVCUtil {
public class SpringMvcUtil {
/**
* 获取当前会话的 request
@@ -37,4 +37,7 @@ public class SpringMVCUtil {
return servletRequestAttributes.getResponse();
}
}