权限码限定必须为String类型

This commit is contained in:
shengzhang
2020-12-28 01:14:34 +08:00
parent d3792ad286
commit 43308bf593
8 changed files with 184 additions and 131 deletions

View File

@@ -14,7 +14,7 @@ public interface StpInterface {
* @param loginKey 具体的stp标识 * @param loginKey 具体的stp标识
* @return 该账号id具有的权限码集合 * @return 该账号id具有的权限码集合
*/ */
public List<Object> getPermissionCodeList(Object loginId, String loginKey); public List<String> getPermissionCodeList(Object loginId, String loginKey);
} }

View File

@@ -10,8 +10,8 @@ import java.util.List;
public class StpInterfaceDefaultImpl implements StpInterface { public class StpInterfaceDefaultImpl implements StpInterface {
@Override @Override
public List<Object> getPermissionCodeList(Object loginId, String loginKey) { public List<String> getPermissionCodeList(Object loginId, String loginKey) {
return new ArrayList<Object>(); return new ArrayList<String>();
} }
} }

View File

@@ -678,9 +678,9 @@ public class StpLogic {
* @param permissionCode 权限码 * @param permissionCode 权限码
* @return 是否含有指定权限 * @return 是否含有指定权限
*/ */
public boolean hasPermission(Object loginId, Object permissionCode) { public boolean hasPermission(Object loginId, String permissionCode) {
List<Object> pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); List<String> permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey);
return !(pcodeList == null || pcodeList.contains(permissionCode) == false); return !(permissionCodeList == null || permissionCodeList.contains(permissionCode) == false);
} }
/** /**
@@ -688,7 +688,7 @@ public class StpLogic {
* @param permissionCode 权限码 * @param permissionCode 权限码
* @return 是否含有指定权限 * @return 是否含有指定权限
*/ */
public boolean hasPermission(Object permissionCode) { public boolean hasPermission(String permissionCode) {
return hasPermission(getLoginId(), permissionCode); return hasPermission(getLoginId(), permissionCode);
} }
@@ -696,7 +696,7 @@ public class StpLogic {
* 当前账号是否含有指定权限, 没有就抛出异常 * 当前账号是否含有指定权限, 没有就抛出异常
* @param permissionCode 权限码 * @param permissionCode 权限码
*/ */
public void checkPermission(Object permissionCode) { public void checkPermission(String permissionCode) {
if(hasPermission(permissionCode) == false) { if(hasPermission(permissionCode) == false) {
throw new NotPermissionException(permissionCode, this.loginKey); throw new NotPermissionException(permissionCode, this.loginKey);
} }
@@ -706,11 +706,11 @@ public class StpLogic {
* 当前账号是否含有指定权限, [指定多个,必须全都有] * 当前账号是否含有指定权限, [指定多个,必须全都有]
* @param permissionCodeArray 权限码数组 * @param permissionCodeArray 权限码数组
*/ */
public void checkPermissionAnd(Object... permissionCodeArray){ public void checkPermissionAnd(String... permissionCodeArray){
Object loginId = getLoginId(); Object loginId = getLoginId();
List<Object> pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); List<String> permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey);
for (Object pcode : permissionCodeArray) { for (String pcode : permissionCodeArray) {
if(pcodeList.contains(pcode) == false) { if(permissionCodeList.contains(pcode) == false) {
throw new NotPermissionException(pcode, this.loginKey); // 没有权限抛出异常 throw new NotPermissionException(pcode, this.loginKey); // 没有权限抛出异常
} }
} }
@@ -720,11 +720,11 @@ public class StpLogic {
* 当前账号是否含有指定权限, [指定多个,有一个就可以通过] * 当前账号是否含有指定权限, [指定多个,有一个就可以通过]
* @param permissionCodeArray 权限码数组 * @param permissionCodeArray 权限码数组
*/ */
public void checkPermissionOr(Object... permissionCodeArray){ public void checkPermissionOr(String... permissionCodeArray){
Object loginId = getLoginId(); Object loginId = getLoginId();
List<Object> pcodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey); List<String> permissionCodeList = SaTokenManager.getStpInterface().getPermissionCodeList(loginId, loginKey);
for (Object pcode : permissionCodeArray) { for (String permissionCode : permissionCodeArray) {
if(pcodeList.contains(pcode) == true) { if(permissionCodeList.contains(permissionCode) == true) {
return; // 有的话提前退出 return; // 有的话提前退出
} }
} }

View File

@@ -311,8 +311,8 @@ public class StpUtil {
* @param permissionCode 权限码 * @param permissionCode 权限码
* @return 是否含有指定权限 * @return 是否含有指定权限
*/ */
public static boolean hasPermission(Object loginId, Object pcode) { public static boolean hasPermission(Object loginId, String permissionCode) {
return stpLogic.hasPermission(loginId, pcode); return stpLogic.hasPermission(loginId, permissionCode);
} }
/** /**
@@ -320,7 +320,7 @@ public class StpUtil {
* @param permissionCode 权限码 * @param permissionCode 权限码
* @return 是否含有指定权限 * @return 是否含有指定权限
*/ */
public static boolean hasPermission(Object permissionCode) { public static boolean hasPermission(String permissionCode) {
return stpLogic.hasPermission(permissionCode); return stpLogic.hasPermission(permissionCode);
} }
@@ -328,7 +328,7 @@ public class StpUtil {
* 当前账号是否含有指定权限, 没有就抛出异常 * 当前账号是否含有指定权限, 没有就抛出异常
* @param permissionCode 权限码 * @param permissionCode 权限码
*/ */
public static void checkPermission(Object permissionCode) { public static void checkPermission(String permissionCode) {
stpLogic.checkPermission(permissionCode); stpLogic.checkPermission(permissionCode);
} }
@@ -336,7 +336,7 @@ public class StpUtil {
* 当前账号是否含有指定权限, [指定多个,必须全都有] * 当前账号是否含有指定权限, [指定多个,必须全都有]
* @param permissionCodeArray 权限码数组 * @param permissionCodeArray 权限码数组
*/ */
public static void checkPermissionAnd(Object... permissionCodeArray) { public static void checkPermissionAnd(String... permissionCodeArray) {
stpLogic.checkPermissionAnd(permissionCodeArray); stpLogic.checkPermissionAnd(permissionCodeArray);
} }
@@ -344,7 +344,7 @@ public class StpUtil {
* 当前账号是否含有指定权限, [指定多个,有一个就可以通过] * 当前账号是否含有指定权限, [指定多个,有一个就可以通过]
* @param permissionCodeArray 权限码数组 * @param permissionCodeArray 权限码数组
*/ */
public static void checkPermissionOr(Object... permissionCodeArray) { public static void checkPermissionOr(String... permissionCodeArray) {
stpLogic.checkPermissionOr(permissionCodeArray); stpLogic.checkPermissionOr(permissionCodeArray);
} }

View File

@@ -15,8 +15,8 @@ public class StpInterfaceImpl implements StpInterface {
// 返回一个账号所拥有的权限码集合 // 返回一个账号所拥有的权限码集合
@Override @Override
public List<Object> getPermissionCodeList(Object login_id, String login_key) { public List<String> getPermissionCodeList(Object login_id, String login_key) {
List<Object> list = new ArrayList<Object>(); // 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限 List<String> list = new ArrayList<String>(); // 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限
list.add("101"); list.add("101");
list.add("user-add"); list.add("user-add");
list.add("user-delete"); list.add("user-delete");

View File

@@ -5,7 +5,7 @@ import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpLogic;
/** /**
* 一个默认的实现 * user认证实现
* @author kong * @author kong
*/ */
public class StpUserUtil { public class StpUserUtil {
@@ -35,9 +35,9 @@ public class StpUserUtil {
} }
/** /**
* 获取指定id的tokenValue * 获取指定loginId的tokenValue
* @param loginId . * @param loginId 账号id
* @return * @return token值
*/ */
public static String getTokenValueByLoginId(Object loginId) { public static String getTokenValueByLoginId(Object loginId) {
return stpLogic.getTokenValueByLoginId(loginId); return stpLogic.getTokenValueByLoginId(loginId);
@@ -59,6 +59,7 @@ public class StpUserUtil {
return stpLogic.getTokenInfo(); return stpLogic.getTokenInfo();
} }
// =================== 登录相关操作 =================== // =================== 登录相关操作 ===================
/** /**
@@ -77,7 +78,7 @@ public class StpUserUtil {
} }
/** /**
* 指定loginId的会话注销登录清退下线) * 指定loginId的会话注销登录正常注销下线)
* @param loginId 账号id * @param loginId 账号id
*/ */
public static void logoutByLoginId(Object loginId) { public static void logoutByLoginId(Object loginId) {
@@ -106,12 +107,12 @@ public class StpUserUtil {
* 检验当前会话是否已经登录,如未登录,则抛出异常 * 检验当前会话是否已经登录,如未登录,则抛出异常
*/ */
public static void checkLogin() { public static void checkLogin() {
getLoginId(); stpLogic.checkLogin();
} }
/** /**
* 获取当前会话登录id, 如果未登录,则抛出异常 * 获取当前会话账号id, 如果未登录,则抛出异常
* @return . * @return 账号id
*/ */
public static Object getLoginId() { public static Object getLoginId() {
return stpLogic.getLoginId(); return stpLogic.getLoginId();
@@ -119,8 +120,9 @@ public class StpUserUtil {
/** /**
* 获取当前会话登录id, 如果未登录,则返回默认值 * 获取当前会话登录id, 如果未登录,则返回默认值
* @param defaultValue . * @param <T> 返回类型
* @return . * @param defaultValue 默认值
* @return 登录id
*/ */
public static <T> T getLoginId(T defaultValue) { public static <T> T getLoginId(T defaultValue) {
return stpLogic.getLoginId(defaultValue); return stpLogic.getLoginId(defaultValue);
@@ -128,7 +130,7 @@ public class StpUserUtil {
/** /**
* 获取当前会话登录id, 如果未登录则返回null * 获取当前会话登录id, 如果未登录则返回null
* @return * @return 账号id
*/ */
public static Object getLoginIdDefaultNull() { public static Object getLoginIdDefaultNull() {
return stpLogic.getLoginIdDefaultNull(); return stpLogic.getLoginIdDefaultNull();
@@ -136,7 +138,7 @@ public class StpUserUtil {
/** /**
* 获取当前会话登录id, 并转换为String * 获取当前会话登录id, 并转换为String
* @return * @return 账号id
*/ */
public static String getLoginIdAsString() { public static String getLoginIdAsString() {
return stpLogic.getLoginIdAsString(); return stpLogic.getLoginIdAsString();
@@ -144,7 +146,7 @@ public class StpUserUtil {
/** /**
* 获取当前会话登录id, 并转换为int * 获取当前会话登录id, 并转换为int
* @return * @return 账号id
*/ */
public static int getLoginIdAsInt() { public static int getLoginIdAsInt() {
return stpLogic.getLoginIdAsInt(); return stpLogic.getLoginIdAsInt();
@@ -152,7 +154,7 @@ public class StpUserUtil {
/** /**
* 获取当前会话登录id, 并转换为long * 获取当前会话登录id, 并转换为long
* @return * @return 账号id
*/ */
public static long getLoginIdAsLong() { public static long getLoginIdAsLong() {
return stpLogic.getLoginIdAsLong(); return stpLogic.getLoginIdAsLong();
@@ -160,7 +162,8 @@ public class StpUserUtil {
/** /**
* 获取指定token对应的登录id如果未登录则返回 null * 获取指定token对应的登录id如果未登录则返回 null
* @return . * @param tokenValue token
* @return 登录id
*/ */
public static Object getLoginIdByToken(String tokenValue) { public static Object getLoginIdByToken(String tokenValue) {
return stpLogic.getLoginIdByToken(tokenValue); return stpLogic.getLoginIdByToken(tokenValue);
@@ -170,8 +173,8 @@ public class StpUserUtil {
// =================== session相关 =================== // =================== session相关 ===================
/** /**
* 获取指定loginId的session, 如果没有isCreate=是否新建并返回 * 获取指定loginId的session, 如果session尚未创建isCreate=是否新建并返回
* @param loginId 登录id * @param loginId 账号id
* @param isCreate 是否新建 * @param isCreate 是否新建
* @return SaSession * @return SaSession
*/ */
@@ -180,23 +183,72 @@ public class StpUserUtil {
} }
/** /**
* 获取指定loginId的session * 获取指定loginId的session, 如果session尚未创建isCreate=是否新建并返回
* @param loginId . * @param loginId 账号id
* @return . * @param isCreate 是否新建
* @return SaSession
*/ */
public static SaSession getSessionByLoginId(Object loginId) { public static SaSession getSessionByLoginId(Object loginId) {
return stpLogic.getSessionByLoginId(loginId); return stpLogic.getSessionByLoginId(loginId);
} }
/** /**
* 获取当前会话的session * 获取当前会话的session, 如果session尚未创建isCreate=是否新建并返回
* @return * @param isCreate 是否新建
* @return 当前会话的session
*/
public static SaSession getSession(boolean isCreate) {
return stpLogic.getSession(isCreate);
}
/**
* 获取当前会话的session如果session尚未创建则新建并返回
* @return 当前会话的session
*/ */
public static SaSession getSession() { public static SaSession getSession() {
return stpLogic.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尚未创建则新建并返回
* <p> 只有当前会话属于登录状态才可调用
* @return session会话
*/
public static SaSession getTokenSession() {
return stpLogic.getTokenSession();
}
// =================== [临时过期] 验证相关 ===================
/**
* 检查当前token 是否已经[临时过期],如果已经过期则抛出异常
*/
public static void checkActivityTimeout() {
stpLogic.checkActivityTimeout();
}
/**
* 续签当前token(将 [最后操作时间] 更新为当前时间戳)
* <h1>请注意: 即时token已经 [临时过期] 也可续签成功,
* 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可 </h1>
*/
public static void updateLastActivityToNow() {
stpLogic.updateLastActivityToNow();
}
// =================== 过期时间相关 =================== // =================== 过期时间相关 ===================
@@ -204,7 +256,7 @@ public class StpUserUtil {
* 获取当前登录者的token剩余有效时间 (单位: 秒) * 获取当前登录者的token剩余有效时间 (单位: 秒)
* @return token剩余有效时间 * @return token剩余有效时间
*/ */
public long getTimeout() { public static long getTimeout() {
return stpLogic.getTokenTimeout(); return stpLogic.getTokenTimeout();
} }
@@ -213,7 +265,7 @@ public class StpUserUtil {
* @param loginId 指定loginId * @param loginId 指定loginId
* @return token剩余有效时间 * @return token剩余有效时间
*/ */
public long getTimeoutByLoginId(Object loginId) { public static long getTimeoutByLoginId(Object loginId) {
return stpLogic.getTokenTimeoutByLoginId(loginId); return stpLogic.getTokenTimeoutByLoginId(loginId);
} }
@@ -221,7 +273,7 @@ public class StpUserUtil {
* 获取当前登录者的Session剩余有效时间 (单位: 秒) * 获取当前登录者的Session剩余有效时间 (单位: 秒)
* @return token剩余有效时间 * @return token剩余有效时间
*/ */
public long getSessionTimeout() { public static long getSessionTimeout() {
return stpLogic.getSessionTimeout(); return stpLogic.getSessionTimeout();
} }
@@ -230,55 +282,72 @@ public class StpUserUtil {
* @param loginId 指定loginId * @param loginId 指定loginId
* @return token剩余有效时间 * @return token剩余有效时间
*/ */
public long getSessionTimeoutByLoginId(Object loginId) { public static long getSessionTimeoutByLoginId(Object loginId) {
return stpLogic.getSessionTimeoutByLoginId(loginId); return stpLogic.getSessionTimeoutByLoginId(loginId);
} }
/**
* 获取当前token[临时过期]剩余有效时间 (单位: 秒)
* @return token[临时过期]剩余有效时间
*/
public static long getTokenActivityTimeout() {
return stpLogic.getTokenActivityTimeout();
}
/**
* 获取指定token[临时过期]剩余有效时间 (单位: 秒)
* @param tokenValue 指定token
* @return token[临时过期]剩余有效时间
*/
public static long getTokenActivityTimeoutByToken(String tokenValue) {
return stpLogic.getTokenActivityTimeoutByToken(tokenValue);
}
// =================== 权限验证操作 =================== // =================== 权限验证操作 ===================
/** /**
* 指定loginId是否含有指定权限 * 指定账号id是否含有指定权限
* @param loginId . * @param loginId 账号id
* @param pcode . * @param permissionCode 权限码
* @return . * @return 是否含有指定权限
*/ */
public static boolean hasPermission(Object loginId, Object pcode) { public static boolean hasPermission(Object loginId, String permissionCode) {
return stpLogic.hasPermission(loginId, pcode); return stpLogic.hasPermission(loginId, permissionCode);
} }
/** /**
* 当前会话是否含有指定权限 * 当前账号id是否含有指定权限
* @param pcode . * @param permissionCode 权限码
* @return . * @return 是否含有指定权限
*/ */
public static boolean hasPermission(Object pcode) { public static boolean hasPermission(String permissionCode) {
return stpLogic.hasPermission(pcode); return stpLogic.hasPermission(permissionCode);
} }
/** /**
* 当前账号是否含有指定权限, 没有就抛出异常 * 当前账号是否含有指定权限, 没有就抛出异常
* @param pcode . * @param permissionCode 权限码
*/ */
public static void checkPermission(Object pcode) { public static void checkPermission(String permissionCode) {
stpLogic.checkPermission(pcode); stpLogic.checkPermission(permissionCode);
} }
/** /**
* 当前账号是否含有指定权限 指定多个,必须全都有 * 当前账号是否含有指定权限, [指定多个,必须全都有]
* @param pcodeArray . * @param permissionCodeArray 权限码数组
*/ */
public static void checkPermissionAnd(Object... pcodeArray) { public static void checkPermissionAnd(String... permissionCodeArray) {
stpLogic.checkPermissionAnd(pcodeArray); stpLogic.checkPermissionAnd(permissionCodeArray);
} }
/** /**
* 当前账号是否含有指定权限 指定多个,有一个就可以了】 * 当前账号是否含有指定权限, [指定多个,有一个就可以通过]
* @param pcodeArray . * @param permissionCodeArray 权限码数组
*/ */
public static void checkPermissionOr(Object... pcodeArray) { public static void checkPermissionOr(String... permissionCodeArray) {
stpLogic.checkPermissionOr(pcodeArray); stpLogic.checkPermissionOr(permissionCodeArray);
} }

View File

@@ -51,7 +51,7 @@ public class TestController {
public AjaxJson jur() { public AjaxJson jur() {
System.out.println("======================= 进入方法,测试权限接口 ========================= "); System.out.println("======================= 进入方法,测试权限接口 ========================= ");
System.out.println("是否具有权限101" + StpUtil.hasPermission(101)); System.out.println("是否具有权限101" + StpUtil.hasPermission("101"));
System.out.println("是否具有权限user-add" + StpUtil.hasPermission("user-add")); System.out.println("是否具有权限user-add" + StpUtil.hasPermission("user-add"));
System.out.println("是否具有权限article-get" + StpUtil.hasPermission("article-get")); System.out.println("是否具有权限article-get" + StpUtil.hasPermission("article-get"));

View File

@@ -52,53 +52,37 @@ public class SaCheckInterceptor implements HandlerInterceptor {
} }
HandlerMethod method = (HandlerMethod ) handler; HandlerMethod method = (HandlerMethod ) handler;
// 验证登录 // ----------- 验证登录
if(method.hasMethodAnnotation(SaCheckLogin.class) || method.getBeanType().isAnnotationPresent(SaCheckLogin.class)) { if(method.hasMethodAnnotation(SaCheckLogin.class) || method.getBeanType().isAnnotationPresent(SaCheckLogin.class)) {
stpLogic.checkLogin(); stpLogic.checkLogin();
} }
// 获取权限注解 // ----------- 验证权限
// 验证方法上的
SaCheckPermission scp = method.getMethodAnnotation(SaCheckPermission.class); SaCheckPermission scp = method.getMethodAnnotation(SaCheckPermission.class);
if(scp == null) { if(scp != null) {
scp = method.getBeanType().getAnnotation(SaCheckPermission.class); String[] permissionCodeArray = scp.value();
}
if(scp == null) {
return true;
}
// 开始验证权限
Object[] codeArray = concatAbc(scp.value(), scp.valueInt(), scp.valueLong());
if(scp.isAnd()) { if(scp.isAnd()) {
stpLogic.checkPermissionAnd(codeArray); // 必须全部都有 stpLogic.checkPermissionAnd(permissionCodeArray); // 必须全部都有
} else { } else {
stpLogic.checkPermissionOr(codeArray); // 有一个就行了 stpLogic.checkPermissionOr(permissionCodeArray); // 有一个就行了
}
}
// 验证类上的
scp = method.getBeanType().getAnnotation(SaCheckPermission.class);
if(scp != null) {
String[] permissionCodeArray = scp.value();
if(scp.isAnd()) {
stpLogic.checkPermissionAnd(permissionCodeArray); // 必须全部都有
} else {
stpLogic.checkPermissionOr(permissionCodeArray); // 有一个就行了
}
} }
// 通过验证
return true; return true;
} }
/**
* 合并三个数组
* @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++) {
d[i] = a[i];
}
for (int i = 0; i < b.length; i++) {
d[a.length + i] = b[i];
}
for (int i = 0; i < c.length; i++) {
d[a.length + b.length + i] = c[i];
}
return d;
}