NotLoginException 增加新场景值 -7: 未按照指定前缀提交 token

This commit is contained in:
click33 2023-05-18 18:08:33 +08:00
parent 46dd4be560
commit 8cb8016fb4
4 changed files with 70 additions and 68 deletions

View File

@ -91,7 +91,10 @@ public interface SaErrorCode {
/** Token已被冻结 */
int CODE_11016 = 11016;
/** 前端未按照指定的前缀提交 token */
int CODE_11017 = 11017;
/** 在未集成 sa-token-jwt 插件时调用 getExtra() 抛出异常 */
int CODE_11031 = 11031;

View File

@ -15,11 +15,11 @@
*/
package cn.dev33.satoken.exception;
import cn.dev33.satoken.util.SaFoxUtil;
import java.util.Arrays;
import java.util.List;
import cn.dev33.satoken.util.SaFoxUtil;
/**
* 一个异常代表会话未能通过登录认证校验
*
@ -65,6 +65,10 @@ public class NotLoginException extends SaTokenException {
public static final String TOKEN_FREEZE = "-6";
public static final String TOKEN_FREEZE_MESSAGE = "token 已被冻结";
/** 表示 未按照指定前缀提交 token */
public static final String NO_PREFIX = "-7";
public static final String NO_PREFIX_MESSAGE = "未按照指定前缀提交 token";
/** 默认的提示语 */
public static final String DEFAULT_MESSAGE = "当前会话未登录";
@ -72,7 +76,8 @@ public class NotLoginException extends SaTokenException {
/**
* 代表异常 token 的标志集合
*/
public static final List<String> ABNORMAL_LIST = Arrays.asList(NOT_TOKEN, INVALID_TOKEN, TOKEN_TIMEOUT, BE_REPLACED, KICK_OUT, TOKEN_FREEZE);
public static final List<String> ABNORMAL_LIST =
Arrays.asList(NOT_TOKEN, INVALID_TOKEN, TOKEN_TIMEOUT, BE_REPLACED, KICK_OUT, TOKEN_FREEZE, NO_PREFIX);
/**
@ -101,61 +106,29 @@ public class NotLoginException extends SaTokenException {
public String getLoginType() {
return loginType;
}
/**
* 构造方法创建一个
* @param message 异常消息
* 构造方法创建一个
* @param message 异常消息
* @param loginType 账号类型
* @param type 类型
* @param type 类型
*/
public NotLoginException(String message, String loginType, String type) {
super(message);
super(message);
this.loginType = loginType;
this.type = type;
}
/**
* 静态方法构建一个NotLoginException
* @param loginType 账号类型
* @param type 账号类型
* @return 构建完毕的异常对象
*/
public static NotLoginException newInstance(String loginType, String type) {
return newInstance(loginType, type, null);
}
/**
* 静态方法构建一个NotLoginException
* 静态方法构建一个 NotLoginException
* @param loginType 账号类型
* @param type 账号类型
* @param token 引起异常的Token值
* @return 构建完毕的异常对象
* @param type 未登录场景值
* @param message 异常描述信息
* @param token 引起异常的 token 可不填如果填了会拼接到异常描述信息后面
* @return 构建完毕的异常对象
*/
public static NotLoginException newInstance(String loginType, String type, String token) {
String message;
if(NOT_TOKEN.equals(type)) {
message = NOT_TOKEN_MESSAGE;
}
else if(INVALID_TOKEN.equals(type)) {
message = INVALID_TOKEN_MESSAGE;
}
else if(TOKEN_TIMEOUT.equals(type)) {
message = TOKEN_TIMEOUT_MESSAGE;
}
else if(BE_REPLACED.equals(type)) {
message = BE_REPLACED_MESSAGE;
}
else if(KICK_OUT.equals(type)) {
message = KICK_OUT_MESSAGE;
}
else if(TOKEN_FREEZE.equals(type)) {
message = TOKEN_FREEZE_MESSAGE;
}
else {
message = DEFAULT_MESSAGE;
}
if( ! SaFoxUtil.isEmpty(token)) {
public static NotLoginException newInstance(String loginType, String type, String message, String token) {
if(SaFoxUtil.isNotEmpty(token)) {
message = message + "" + token;
}
return new NotLoginException(message, loginType, type);

View File

@ -41,6 +41,9 @@ import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import static cn.dev33.satoken.exception.NotLoginException.*;
/**
* Sa-Token 权限认证逻辑实现类
*
@ -230,25 +233,48 @@ public class StpLogic {
* @return 当前tokenValue
*/
public String getTokenValue(){
// 1. 获取
return getTokenValue(false);
}
/**
* 获取当前请求的 token
*
* @param noPrefixThrowException 如果提交的 token 不带有指定的前缀是否抛出异常
* @return 当前tokenValue
*/
public String getTokenValue(boolean noPrefixThrowException){
// 1获取前端提交的 token 包含前缀值
String tokenValue = getTokenValueNotCut();
// 2. 如果打开了前缀模式则裁剪掉它
// 2如果全局配置打开了前缀模式则二次处理一下
String tokenPrefix = getConfig().getTokenPrefix();
if(SaFoxUtil.isNotEmpty(tokenPrefix)) {
// 如果 token 并没有按照指定的前缀开头则视为未提供token
if(SaFoxUtil.isEmpty(tokenValue) || ! tokenValue.startsWith(tokenPrefix + SaTokenConsts.TOKEN_CONNECTOR_CHAT)) {
// 情况2.1如果提交的 token 为空则转为 null
if(SaFoxUtil.isEmpty(tokenValue)) {
tokenValue = null;
} else {
// 裁剪掉前缀
}
// 情况2.2如果 token 有值但是并不是以指定的前缀开头
else if(! tokenValue.startsWith(tokenPrefix + SaTokenConsts.TOKEN_CONNECTOR_CHAT)) {
if(noPrefixThrowException) {
throw NotLoginException.newInstance(loginType, NO_PREFIX, NO_PREFIX_MESSAGE + "prefix=" + tokenPrefix, null).setCode(SaErrorCode.CODE_11017);
} else {
tokenValue = null;
}
}
// 情况2.3代码至此说明 token 有值且是以指定的前缀开头的现在裁剪掉前缀
else {
tokenValue = tokenValue.substring(tokenPrefix.length() + SaTokenConsts.TOKEN_CONNECTOR_CHAT.length());
}
}
// 3. 返回
// 3返回
return tokenValue;
}
/**
* 获取当前请求的 token 不裁剪前缀
*
@ -290,9 +316,9 @@ public class StpLogic {
* @return /
*/
public String getTokenValueNotNull(){
String tokenValue = getTokenValue();
String tokenValue = getTokenValue(true);
if(SaFoxUtil.isEmpty(tokenValue)) {
throw new SaTokenException("未能读取到有效Token").setCode(SaErrorCode.CODE_11001);
throw NotLoginException.newInstance(loginType, NOT_TOKEN, NOT_TOKEN_MESSAGE, null).setCode(SaErrorCode.CODE_11001);
}
return tokenValue;
}
@ -824,30 +850,30 @@ public class StpLogic {
}
// 2如果前端没有提交 token则抛出异常: 未能读取到有效 token
String tokenValue = getTokenValue();
String tokenValue = getTokenValue(true);
if(SaFoxUtil.isEmpty(tokenValue)) {
throw NotLoginException.newInstance(loginType, NotLoginException.NOT_TOKEN).setCode(SaErrorCode.CODE_11011);
throw NotLoginException.newInstance(loginType, NOT_TOKEN, NOT_TOKEN_MESSAGE, null).setCode(SaErrorCode.CODE_11011);
}
// 3查找此 token 对应的 loginId如果找不到则抛出token 无效
String loginId = getLoginIdNotHandle(tokenValue);
if(SaFoxUtil.isEmpty(loginId)) {
throw NotLoginException.newInstance(loginType, NotLoginException.INVALID_TOKEN, tokenValue).setCode(SaErrorCode.CODE_11012);
throw NotLoginException.newInstance(loginType, INVALID_TOKEN, INVALID_TOKEN_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11012);
}
// 4如果这个 token 指向的是值是过期标记则抛出token 已过期
if(loginId.equals(NotLoginException.TOKEN_TIMEOUT)) {
throw NotLoginException.newInstance(loginType, NotLoginException.TOKEN_TIMEOUT, tokenValue).setCode(SaErrorCode.CODE_11013);
throw NotLoginException.newInstance(loginType, TOKEN_TIMEOUT, TOKEN_TIMEOUT_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11013);
}
// 5如果这个 token 指向的是值是被顶替标记则抛出token 已被顶下线
if(loginId.equals(NotLoginException.BE_REPLACED)) {
throw NotLoginException.newInstance(loginType, NotLoginException.BE_REPLACED, tokenValue).setCode(SaErrorCode.CODE_11014);
throw NotLoginException.newInstance(loginType, BE_REPLACED, BE_REPLACED_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11014);
}
// 6如果这个 token 指向的是值是被踢下线标记则抛出token 已被踢下线
if(loginId.equals(NotLoginException.KICK_OUT)) {
throw NotLoginException.newInstance(loginType, NotLoginException.KICK_OUT, tokenValue).setCode(SaErrorCode.CODE_11015);
throw NotLoginException.newInstance(loginType, KICK_OUT, KICK_OUT_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11015);
}
// 7检查此 token 的最后活跃时间是否已经超过了 activity-timeout 的限制
@ -1347,7 +1373,7 @@ public class StpLogic {
// 3值为 -2 代表已被冻结此时需要抛出异常
if(timeout == SaTokenDao.NOT_VALUE_EXPIRE) {
throw NotLoginException.newInstance(loginType, NotLoginException.TOKEN_FREEZE, tokenValue).setCode(SaErrorCode.CODE_11016);
throw NotLoginException.newInstance(loginType, TOKEN_FREEZE, TOKEN_FREEZE_MESSAGE, tokenValue).setCode(SaErrorCode.CODE_11016);
}
// --- 至此验证已通过

View File

@ -25,7 +25,7 @@ public class GlobalException {
// 打印堆栈以供调试
System.out.println("全局异常---------------");
e.printStackTrace();
e.printStackTrace();
// 不同异常返回不同状态码
AjaxJson aj = null;