Skip to content

Commit a69e41b

Browse files
committed
多账号体系下就不能再一个stpLogic里面鉴别所有权限了
抽离最小鉴定单位并在外部统一鉴权
1 parent 2d4267b commit a69e41b

File tree

5 files changed

+222
-62
lines changed

5 files changed

+222
-62
lines changed

sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,13 @@
2626
* @return 验证模式
2727
*/
2828
SaMode mode() default SaMode.AND;
29-
29+
30+
/**
31+
* 多账号下哪些需要校验
32+
* 每个StpUtil都有一个stpLogic属性
33+
* 初始化StpLogic时,指定的LoginKey字符串放入这里
34+
* 可以放多个,所以类型为数组
35+
* @return LoginKey字符串数组
36+
*/
37+
String [] loginKeys() default {};
3038
}

sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckRole.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,14 @@
2626
* @return 验证模式
2727
*/
2828
SaMode mode() default SaMode.AND;
29+
30+
/**
31+
* 多账号下哪些需要校验
32+
* 每个StpUtil都有一个stpLogic属性
33+
* 初始化StpLogic时,指定的LoginKey字符串放入这里
34+
* 可以放多个,所以类型为数组
35+
* @return LoginKey字符串数组
36+
*/
37+
String [] loginKeys() default {};
2938

3039
}

sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java

Lines changed: 21 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,65 +1217,32 @@ public SaTokenConfig getConfig() {
12171217

12181218

12191219
// =================== 其它方法 ===================
1220-
1220+
12211221
/**
1222-
* 对一个Method对象进行注解检查(注解鉴权内部实现)
1223-
* @param method Method对象
1222+
* 检查当前登录体系是否拥有给定角色
1223+
* @param roleArray 角色字符串数组
1224+
* @param saMode SaMode.AND, SaMode.OR
12241225
*/
1225-
public void checkMethodAnnotation(Method method) {
1226-
1227-
// ----------- 验证登录
1228-
if(method.isAnnotationPresent(SaCheckLogin.class) || method.getDeclaringClass().isAnnotationPresent(SaCheckLogin.class)) {
1229-
this.checkLogin();
1230-
}
1231-
1232-
// ----------- 验证角色
1233-
// 验证方法上的
1234-
SaCheckRole scr = method.getAnnotation(SaCheckRole.class);
1235-
if(scr != null) {
1236-
String[] roleArray = scr.value();
1237-
if(scr.mode() == SaMode.AND) {
1238-
this.checkRoleAnd(roleArray);
1239-
} else {
1240-
this.checkRoleOr(roleArray);
1241-
}
1242-
}
1243-
// 验证类上的
1244-
scr = method.getDeclaringClass().getAnnotation(SaCheckRole.class);
1245-
if(scr != null) {
1246-
String[] roleArray = scr.value();
1247-
if(scr.mode() == SaMode.AND) {
1248-
this.checkRoleAnd(roleArray);
1249-
} else {
1250-
this.checkRoleOr(roleArray);
1251-
}
1252-
}
1253-
1254-
// ----------- 验证权限
1255-
// 验证方法上的
1256-
SaCheckPermission scp = method.getAnnotation(SaCheckPermission.class);
1257-
if(scp != null) {
1258-
String[] permissionArray = scp.value();
1259-
if(scp.mode() == SaMode.AND) {
1260-
this.checkPermissionAnd(permissionArray);
1261-
} else {
1262-
this.checkPermissionOr(permissionArray);
1263-
}
1264-
}
1265-
// 验证类上的
1266-
scp = method.getDeclaringClass().getAnnotation(SaCheckPermission.class);
1267-
if(scp != null) {
1268-
String[] permissionArray = scp.value();
1269-
if(scp.mode() == SaMode.AND) {
1270-
this.checkPermissionAnd(permissionArray);
1271-
} else {
1272-
this.checkPermissionOr(permissionArray);
1273-
}
1226+
public void checkHasRoles(String[] roleArray, SaMode saMode) {
1227+
if(saMode == SaMode.AND) {
1228+
this.checkRoleAnd(roleArray);
1229+
} else {
1230+
this.checkRoleOr(roleArray);
12741231
}
1275-
1276-
// 验证通过
12771232
}
12781233

1234+
/**
1235+
* 检查当前登录体系是否拥有给定权限
1236+
* @param permissionArray 权限字符串数组
1237+
* @param saMode SaMode.AND, SaMode.OR
1238+
*/
1239+
public void checkHasPermissions(String[] permissionArray, SaMode saMode) {
1240+
if(saMode == SaMode.AND) {
1241+
this.checkPermissionAnd(permissionArray);
1242+
} else {
1243+
this.checkPermissionOr(permissionArray);
1244+
}
1245+
}
12791246

12801247
// =================== 身份切换 ===================
12811248

sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java

Lines changed: 83 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import cn.dev33.satoken.SaManager;
44
import cn.dev33.satoken.annotation.SaCheckLogin;
5+
import cn.dev33.satoken.annotation.SaCheckPermission;
6+
import cn.dev33.satoken.annotation.SaCheckRole;
7+
import cn.dev33.satoken.exception.UnrecognizedLoginKeyException;
58
import org.aspectj.lang.ProceedingJoinPoint;
69
import org.aspectj.lang.annotation.Around;
710
import org.aspectj.lang.annotation.Aspect;
@@ -15,6 +18,7 @@
1518
import cn.dev33.satoken.util.SaTokenConsts;
1619

1720
import java.lang.reflect.Method;
21+
import java.util.Map;
1822

1923
/**
2024
* sa-token 基于 Spring Aop 的注解鉴权
@@ -63,31 +67,104 @@ public void pointcut() {
6367
@Around("pointcut()")
6468
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
6569

66-
67-
6870
// 注解鉴权
6971
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
7072
Method method = signature.getMethod();
73+
Map<String, StpLogic> stpLogicMap = SaManager.stpLogicMap;
74+
7175
// ----------- 验证登录
7276
if(method.isAnnotationPresent(SaCheckLogin.class) || method.getDeclaringClass().isAnnotationPresent(SaCheckLogin.class)) {
7377
SaCheckLogin checkLogin = method.getAnnotation(SaCheckLogin.class);
7478
if(checkLogin.loginKeys().length == 0) {
7579
getStpLogic().checkLogin();
7680
} else {
7781
for(String loginKey : checkLogin.loginKeys()) {
78-
if (SaManager.stpLogicMap.containsKey(loginKey)) {
79-
StpLogic stpLogic = SaManager.stpLogicMap.get(loginKey);
82+
if (stpLogicMap.containsKey(loginKey)) {
83+
StpLogic stpLogic = stpLogicMap.get(loginKey);
8084
stpLogic.checkLogin();
8185
} else {
82-
86+
throw new UnrecognizedLoginKeyException(loginKey);
8387
}
88+
}
89+
}
90+
}
8491

92+
// ----------- 验证角色
93+
// 验证方法上的
94+
SaCheckRole scr = method.getAnnotation(SaCheckRole.class);
95+
if(scr != null) {
96+
if (scr.loginKeys().length == 0) {
97+
String[] roleArray = scr.value();
98+
getStpLogic().checkHasRoles(roleArray, scr.mode());
99+
} else {
100+
for(String loginKey : scr.loginKeys()) {
101+
if (stpLogicMap.containsKey(loginKey)) {
102+
StpLogic stpLogic = stpLogicMap.get(loginKey);
103+
String[] roleArray = scr.value();
104+
stpLogic.checkHasRoles(roleArray, scr.mode());
105+
} else {
106+
throw new UnrecognizedLoginKeyException(loginKey);
107+
}
108+
}
109+
}
110+
}
111+
// 验证类上的
112+
scr = method.getDeclaringClass().getAnnotation(SaCheckRole.class);
113+
if(scr != null) {
114+
if (scr.loginKeys().length == 0) {
115+
String[] roleArray = scr.value();
116+
getStpLogic().checkHasRoles(roleArray, scr.mode());
117+
} else {
118+
for(String loginKey : scr.loginKeys()) {
119+
if (stpLogicMap.containsKey(loginKey)) {
120+
StpLogic stpLogic = stpLogicMap.get(loginKey);
121+
String[] roleArray = scr.value();
122+
stpLogic.checkHasRoles(roleArray, scr.mode());
123+
} else {
124+
throw new UnrecognizedLoginKeyException(loginKey);
125+
}
85126
}
86127
}
87128
}
88129

130+
// ----------- 验证权限
131+
// 验证方法上的
132+
SaCheckPermission scp = method.getAnnotation(SaCheckPermission.class);
133+
if(scp != null) {
134+
if (scr.loginKeys().length == 0) {
135+
String[] permissionArray = scp.value();
136+
getStpLogic().checkHasPermissions(permissionArray, scp.mode());
137+
} else {
138+
for(String loginKey : scr.loginKeys()) {
139+
if (stpLogicMap.containsKey(loginKey)) {
140+
StpLogic stpLogic = stpLogicMap.get(loginKey);
141+
String[] permissionArray = scp.value();
142+
stpLogic.checkHasPermissions(permissionArray, scp.mode());
143+
} else {
144+
throw new UnrecognizedLoginKeyException(loginKey);
145+
}
146+
}
147+
}
148+
}
149+
// 验证类上的
150+
scp = method.getDeclaringClass().getAnnotation(SaCheckPermission.class);
151+
if(scp != null) {
152+
if (scr.loginKeys().length == 0) {
153+
String[] permissionArray = scp.value();
154+
getStpLogic().checkHasPermissions(permissionArray, scp.mode());
155+
} else {
156+
for(String loginKey : scr.loginKeys()) {
157+
if (stpLogicMap.containsKey(loginKey)) {
158+
StpLogic stpLogic = stpLogicMap.get(loginKey);
159+
String[] permissionArray = scp.value();
160+
stpLogic.checkHasPermissions(permissionArray, scp.mode());
161+
} else {
162+
throw new UnrecognizedLoginKeyException(loginKey);
163+
}
164+
}
165+
}
166+
}
89167

90-
getStpLogic().checkMethodAnnotation(signature.getMethod());
91168
try {
92169
// 执行原有逻辑
93170
Object obj = joinPoint.proceed();

sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package cn.dev33.satoken.interceptor;
22

33
import java.lang.reflect.Method;
4+
import java.util.Map;
45

56
import javax.servlet.http.HttpServletRequest;
67
import javax.servlet.http.HttpServletResponse;
78

9+
import cn.dev33.satoken.SaManager;
10+
import cn.dev33.satoken.annotation.SaCheckLogin;
11+
import cn.dev33.satoken.annotation.SaCheckPermission;
12+
import cn.dev33.satoken.annotation.SaCheckRole;
13+
import cn.dev33.satoken.exception.UnrecognizedLoginKeyException;
814
import org.springframework.web.method.HandlerMethod;
915
import org.springframework.web.servlet.HandlerInterceptor;
1016

@@ -62,7 +68,100 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
6268
Method method = ((HandlerMethod) handler).getMethod();
6369

6470
// 进行验证
65-
getStpLogic().checkMethodAnnotation(method);
71+
Map<String, StpLogic> stpLogicMap = SaManager.stpLogicMap;
72+
73+
// ----------- 验证登录
74+
if(method.isAnnotationPresent(SaCheckLogin.class) || method.getDeclaringClass().isAnnotationPresent(SaCheckLogin.class)) {
75+
SaCheckLogin checkLogin = method.getAnnotation(SaCheckLogin.class);
76+
if(checkLogin.loginKeys().length == 0) {
77+
getStpLogic().checkLogin();
78+
} else {
79+
for(String loginKey : checkLogin.loginKeys()) {
80+
if (stpLogicMap.containsKey(loginKey)) {
81+
StpLogic stpLogic = stpLogicMap.get(loginKey);
82+
stpLogic.checkLogin();
83+
} else {
84+
throw new UnrecognizedLoginKeyException(loginKey);
85+
}
86+
}
87+
}
88+
}
89+
90+
// ----------- 验证角色
91+
// 验证方法上的
92+
SaCheckRole scr = method.getAnnotation(SaCheckRole.class);
93+
if(scr != null) {
94+
if (scr.loginKeys().length == 0) {
95+
String[] roleArray = scr.value();
96+
getStpLogic().checkHasRoles(roleArray, scr.mode());
97+
} else {
98+
for(String loginKey : scr.loginKeys()) {
99+
if (stpLogicMap.containsKey(loginKey)) {
100+
StpLogic stpLogic = stpLogicMap.get(loginKey);
101+
String[] roleArray = scr.value();
102+
stpLogic.checkHasRoles(roleArray, scr.mode());
103+
} else {
104+
throw new UnrecognizedLoginKeyException(loginKey);
105+
}
106+
}
107+
}
108+
}
109+
// 验证类上的
110+
scr = method.getDeclaringClass().getAnnotation(SaCheckRole.class);
111+
if(scr != null) {
112+
if (scr.loginKeys().length == 0) {
113+
String[] roleArray = scr.value();
114+
getStpLogic().checkHasRoles(roleArray, scr.mode());
115+
} else {
116+
for(String loginKey : scr.loginKeys()) {
117+
if (stpLogicMap.containsKey(loginKey)) {
118+
StpLogic stpLogic = stpLogicMap.get(loginKey);
119+
String[] roleArray = scr.value();
120+
stpLogic.checkHasRoles(roleArray, scr.mode());
121+
} else {
122+
throw new UnrecognizedLoginKeyException(loginKey);
123+
}
124+
}
125+
}
126+
}
127+
128+
// ----------- 验证权限
129+
// 验证方法上的
130+
SaCheckPermission scp = method.getAnnotation(SaCheckPermission.class);
131+
if(scp != null) {
132+
if (scr.loginKeys().length == 0) {
133+
String[] permissionArray = scp.value();
134+
getStpLogic().checkHasPermissions(permissionArray, scp.mode());
135+
} else {
136+
for(String loginKey : scr.loginKeys()) {
137+
if (stpLogicMap.containsKey(loginKey)) {
138+
StpLogic stpLogic = stpLogicMap.get(loginKey);
139+
String[] permissionArray = scp.value();
140+
stpLogic.checkHasPermissions(permissionArray, scp.mode());
141+
} else {
142+
throw new UnrecognizedLoginKeyException(loginKey);
143+
}
144+
}
145+
}
146+
}
147+
// 验证类上的
148+
scp = method.getDeclaringClass().getAnnotation(SaCheckPermission.class);
149+
if(scp != null) {
150+
if (scr.loginKeys().length == 0) {
151+
String[] permissionArray = scp.value();
152+
getStpLogic().checkHasPermissions(permissionArray, scp.mode());
153+
} else {
154+
for(String loginKey : scr.loginKeys()) {
155+
if (stpLogicMap.containsKey(loginKey)) {
156+
StpLogic stpLogic = stpLogicMap.get(loginKey);
157+
String[] permissionArray = scp.value();
158+
stpLogic.checkHasPermissions(permissionArray, scp.mode());
159+
} else {
160+
throw new UnrecognizedLoginKeyException(loginKey);
161+
}
162+
}
163+
}
164+
}
66165

67166
// 通过验证
68167
return true;

0 commit comments

Comments
 (0)