This commit is contained in:
shengzhang 2021-05-24 23:03:23 +08:00
parent a54a8cc455
commit e9ab375854
6 changed files with 52 additions and 34 deletions

View File

@ -4,7 +4,6 @@ import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckLogin;
@ -73,11 +72,21 @@ public class SaTokenActionDefaultImpl implements SaTokenAction {
if(list == null || list.size() == 0) {
return false;
}
// 先尝试一下简单匹配如果可以匹配成功则无需继续模糊匹配
if (list.contains(element)) {
return true;
}else{
return list.stream().anyMatch(patt-> Pattern.matches(patt.replaceAll("\\*", ".*"), element));
}
// 开始模糊匹配
for (String patt : list) {
if(SaFoxUtil.vagueMatch(patt, element)) {
return true;
}
}
// 走出for循环说明没有一个元素可以匹配成功
return false;
}
/**
@ -86,21 +95,26 @@ public class SaTokenActionDefaultImpl implements SaTokenAction {
@Override
public void checkMethodAnnotation(Method method) {
// 获取这个 Method 所属的 Class
Class<?> clazz = method.getDeclaringClass();
validateAnnotation(clazz);
// 先校验 Method 所属 Class 上的注解
validateAnnotation(method.getDeclaringClass());
// 再校验 Method 上的注解
validateAnnotation(method);
}
private void validateAnnotation(AnnotatedElement target) {
// 校验 @SaCheckLogin 注解
/**
* 从指定元素校验注解
* @param target see note
*/
protected void validateAnnotation(AnnotatedElement target) {
// 校验 @SaCheckLogin 注解
if(target.isAnnotationPresent(SaCheckLogin.class)) {
SaCheckLogin at = target.getAnnotation(SaCheckLogin.class);
SaManager.getStpLogic(at.key()).checkByAnnotation(at);
}
// 校验 @SaCheckRole 注解
// 校验 @SaCheckRole 注解
if(target.isAnnotationPresent(SaCheckRole.class)) {
SaCheckRole at = target.getAnnotation(SaCheckRole.class);
SaManager.getStpLogic(at.key()).checkByAnnotation(at);

View File

@ -115,7 +115,7 @@ public class SaTokenConfig {
/**
* @return 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
*/
public Boolean isAllowConcurrentLogin() {
public Boolean getAllowConcurrentLogin() {
return allowConcurrentLogin;
}
@ -131,7 +131,7 @@ public class SaTokenConfig {
/**
* @return 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
*/
public Boolean isShareToken() {
public Boolean getIsShare() {
return isShare;
}
@ -179,7 +179,7 @@ public class SaTokenConfig {
/**
* @return 是否尝试从cookie里读取token
*/
public Boolean isReadCookie() {
public Boolean getIsReadCookie() {
return isReadCookie;
}

View File

@ -111,7 +111,9 @@ public class SaTokenConfigFactory {
@SuppressWarnings("unchecked")
private static <T> T getObjectByClass(String str, Class<T> cs) {
Object value;
if (cs.equals(String.class)) {
if (str == null) {
value = null;
} else if (cs.equals(String.class)) {
value = str;
} else if (cs.equals(int.class) || cs.equals(Integer.class)) {
value = Integer.valueOf(str);

View File

@ -1,7 +1,6 @@
package cn.dev33.satoken.stp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@ -107,7 +106,7 @@ public class StpLogic {
}
// 注入Cookie
if(config.isReadCookie()){
if(config.getIsReadCookie()){
SaResponse response = SaHolder.getResponse();
response.addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), cookieTimeout);
}
@ -138,7 +137,7 @@ public class StpLogic {
tokenValue = request.getHeader(keyTokenName);
}
// 4. 尝试从cookie里读取
if(tokenValue == null && config.isReadCookie()){
if(tokenValue == null && config.getIsReadCookie()){
tokenValue = request.getCookieValue(keyTokenName);
}
@ -227,9 +226,9 @@ public class StpLogic {
// ------ 2生成一个token
String tokenValue = null;
// --- 如果允许并发登录
if(config.isAllowConcurrentLogin()) {
if(config.getAllowConcurrentLogin()) {
// 如果配置为共享token, 则尝试从Session签名记录里取出token
if(config.isShareToken()) {
if(config.getIsShare()) {
tokenValue = getTokenValueByLoginId(loginId, loginModel.getDevice());
}
} else {
@ -291,7 +290,7 @@ public class StpLogic {
return;
}
// 如果打开了cookie模式第一步先把cookie清除掉
if(getConfig().isReadCookie()){
if(getConfig().getIsReadCookie()){
SaHolder.getResponse().deleteCookie(getTokenName());
}
logoutByTokenValue(tokenValue);

View File

@ -129,5 +129,22 @@ public class SaFoxUtil {
}
return list2;
}
/**
* 字符串模糊匹配
* <p>example:
* <p> user* user-add -- true
* <p> user* art-add -- false
* @param patt 表达式
* @param str 待匹配的字符串
* @return 是否可以匹配
*/
public static boolean vagueMatch(String patt, String str) {
// 如果表达式不带有*则只需简单equals即可 (速度提升200倍)
if(patt.indexOf("*") == -1) {
return patt.equals(str);
}
return Pattern.matches(patt.replaceAll("\\*", ".*"), str);
}
}

View File

@ -241,20 +241,6 @@ public class TestController {
@RequestMapping("test")
public AjaxJson test() {
System.out.println("进来了");
// System.out.println(StpUtil.getTokenInfo());
StpUtil.setLoginId(10001);
String ss = StpUtil.getSession().get("name", () -> {
System.out.println("-=------进入方法");
return "zhangsan";
});
ss = StpUtil.getSession().get("name", () -> {
System.out.println("-=------进入方法2");
return "zhangsan2";
});
StpUtil.getSession().delete("name");
System.out.println(ss);
return AjaxJson.getSuccess("访问成功");
}