mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-05-06 13:47:56 +08:00
sa-token-solon-plugin 增加新的拦截适配方式,旧的标为弃用。
This commit is contained in:
parent
27ea84c5a6
commit
7d9c556e2d
@ -107,8 +107,8 @@ public class XPluginImp implements Plugin {
|
|||||||
SaManager.setSaSignTemplate(bean);
|
SaManager.setSaSignTemplate(bean);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 自定义 StpLogic 对象(可以有多个)
|
// 自定义 StpLogic 对象 //容器层面只能有一个;要多个得自己在Util上处理
|
||||||
context.subBeansOfType(StpLogic.class, bean -> {
|
context.getBeanAsync(StpLogic.class, bean -> {
|
||||||
StpUtil.setStpLogic(bean);
|
StpUtil.setStpLogic(bean);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,219 @@
|
|||||||
|
package cn.dev33.satoken.solon.integration;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.dev33.satoken.exception.BackResultException;
|
||||||
|
import cn.dev33.satoken.exception.SaTokenException;
|
||||||
|
import cn.dev33.satoken.exception.StopMatchException;
|
||||||
|
import cn.dev33.satoken.filter.SaFilterAuthStrategy;
|
||||||
|
import cn.dev33.satoken.filter.SaFilterErrorStrategy;
|
||||||
|
import cn.dev33.satoken.router.SaRouter;
|
||||||
|
import cn.dev33.satoken.strategy.SaStrategy;
|
||||||
|
import org.noear.solon.Solon;
|
||||||
|
import org.noear.solon.core.handle.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sa-token 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些
|
||||||
|
*
|
||||||
|
* 对静态文件有处理效果
|
||||||
|
*
|
||||||
|
* order: -100 (SaTokenInterceptor 和 SaTokenFilter 二选一;不要同时用)
|
||||||
|
*
|
||||||
|
* @author noear
|
||||||
|
* @since 1.10
|
||||||
|
*/
|
||||||
|
public class SaTokenFilter implements Filter { //之所以改名,为了跟 SaTokenInterceptor 形成一对
|
||||||
|
/**
|
||||||
|
* 是否打开注解鉴权
|
||||||
|
*/
|
||||||
|
public boolean isAnnotation = true;
|
||||||
|
|
||||||
|
// ------------------------ 设置此过滤器 拦截 & 放行 的路由
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拦截路由
|
||||||
|
*/
|
||||||
|
protected List<String> includeList = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 放行路由
|
||||||
|
*/
|
||||||
|
protected List<String> excludeList = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加 [拦截路由]
|
||||||
|
*
|
||||||
|
* @param paths 路由
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter addInclude(String... paths) {
|
||||||
|
includeList.addAll(Arrays.asList(paths));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加 [放行路由]
|
||||||
|
*
|
||||||
|
* @param paths 路由
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter addExclude(String... paths) {
|
||||||
|
excludeList.addAll(Arrays.asList(paths));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入 [拦截路由] 集合
|
||||||
|
*
|
||||||
|
* @param pathList 路由集合
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter setIncludeList(List<String> pathList) {
|
||||||
|
includeList = pathList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入 [放行路由] 集合
|
||||||
|
*
|
||||||
|
* @param pathList 路由集合
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter setExcludeList(List<String> pathList) {
|
||||||
|
excludeList = pathList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 [拦截路由] 集合
|
||||||
|
*
|
||||||
|
* @return see note
|
||||||
|
*/
|
||||||
|
public List<String> getIncludeList() {
|
||||||
|
return includeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 [放行路由] 集合
|
||||||
|
*
|
||||||
|
* @return see note
|
||||||
|
*/
|
||||||
|
public List<String> getExcludeList() {
|
||||||
|
return excludeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------ 钩子函数
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证函数:每次请求执行
|
||||||
|
*/
|
||||||
|
protected SaFilterAuthStrategy auth = r -> {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常处理函数:每次[认证函数]发生异常时执行此函数
|
||||||
|
*/
|
||||||
|
protected SaFilterErrorStrategy error = e -> {
|
||||||
|
if (e instanceof SaTokenException) {
|
||||||
|
throw (SaTokenException) e;
|
||||||
|
} else {
|
||||||
|
throw new SaTokenException(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前置函数:在每次[认证函数]之前执行
|
||||||
|
*/
|
||||||
|
protected SaFilterAuthStrategy beforeAuth = r -> {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[认证函数]: 每次请求执行
|
||||||
|
*
|
||||||
|
* @param auth see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter setAuth(SaFilterAuthStrategy auth) {
|
||||||
|
this.auth = auth;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[异常处理函数]:每次[认证函数]发生异常时执行此函数
|
||||||
|
*
|
||||||
|
* @param error see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter setError(SaFilterErrorStrategy error) {
|
||||||
|
this.error = error;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[前置函数]:在每次[认证函数]之前执行
|
||||||
|
*
|
||||||
|
* @param beforeAuth see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
|
||||||
|
this.beforeAuth = beforeAuth;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
|
||||||
|
try {
|
||||||
|
//查找当前主处理
|
||||||
|
Handler mainHandler = Solon.app().router().matchMain(ctx);
|
||||||
|
|
||||||
|
//如果是静态文件,则不处理(静态文件,不在路由中)
|
||||||
|
if (mainHandler != null) {
|
||||||
|
Action action = (mainHandler instanceof Action ? (Action) mainHandler : null);
|
||||||
|
|
||||||
|
if (isAnnotation && action != null) {
|
||||||
|
// 获取此请求对应的 Method 处理函数
|
||||||
|
Method method = action.method().getMethod();
|
||||||
|
|
||||||
|
// 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权
|
||||||
|
if (SaStrategy.me.isAnnotationPresent.apply(method, SaIgnore.class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注解校验
|
||||||
|
SaStrategy.me.checkMethodAnnotation.accept(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
//路径规则处理
|
||||||
|
SaRouter.match(includeList).notMatch(excludeList).check(r -> {
|
||||||
|
beforeAuth.run(mainHandler);
|
||||||
|
auth.run(mainHandler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (StopMatchException e) {
|
||||||
|
|
||||||
|
} catch (SaTokenException e) {
|
||||||
|
// 1. 获取异常处理策略结果
|
||||||
|
Object result;
|
||||||
|
if (e instanceof BackResultException) {
|
||||||
|
result = e.getMessage();
|
||||||
|
} else {
|
||||||
|
result = error.run(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 写入输出流
|
||||||
|
if (result != null) {
|
||||||
|
ctx.render(result);
|
||||||
|
}
|
||||||
|
ctx.setHandled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chain.doFilter(ctx);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,217 @@
|
|||||||
|
package cn.dev33.satoken.solon.integration;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaIgnore;
|
||||||
|
import cn.dev33.satoken.exception.BackResultException;
|
||||||
|
import cn.dev33.satoken.exception.SaTokenException;
|
||||||
|
import cn.dev33.satoken.exception.StopMatchException;
|
||||||
|
import cn.dev33.satoken.filter.SaFilterAuthStrategy;
|
||||||
|
import cn.dev33.satoken.filter.SaFilterErrorStrategy;
|
||||||
|
import cn.dev33.satoken.router.SaRouter;
|
||||||
|
import cn.dev33.satoken.strategy.SaStrategy;
|
||||||
|
import org.noear.solon.core.handle.*;
|
||||||
|
import org.noear.solon.core.route.RouterInterceptor;
|
||||||
|
import org.noear.solon.core.route.RouterInterceptorChain;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sa-token 基于路由的过滤式鉴权(增加了注解的处理);使用优先级要低些
|
||||||
|
*
|
||||||
|
* 对静态文件无处理效果
|
||||||
|
*
|
||||||
|
* order: -100 (SaTokenInterceptor 和 SaTokenFilter 二选一;不要同时用)
|
||||||
|
*
|
||||||
|
* @author noear
|
||||||
|
* @since 1.12
|
||||||
|
*/
|
||||||
|
public class SaTokenInterceptor implements RouterInterceptor {
|
||||||
|
/**
|
||||||
|
* 是否打开注解鉴权
|
||||||
|
*/
|
||||||
|
public boolean isAnnotation = true;
|
||||||
|
|
||||||
|
// ------------------------ 设置此过滤器 拦截 & 放行 的路由
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拦截路由
|
||||||
|
*/
|
||||||
|
protected List<String> includeList = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 放行路由
|
||||||
|
*/
|
||||||
|
protected List<String> excludeList = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加 [拦截路由]
|
||||||
|
*
|
||||||
|
* @param paths 路由
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor addInclude(String... paths) {
|
||||||
|
includeList.addAll(Arrays.asList(paths));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加 [放行路由]
|
||||||
|
*
|
||||||
|
* @param paths 路由
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor addExclude(String... paths) {
|
||||||
|
excludeList.addAll(Arrays.asList(paths));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入 [拦截路由] 集合
|
||||||
|
*
|
||||||
|
* @param pathList 路由集合
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor setIncludeList(List<String> pathList) {
|
||||||
|
includeList = pathList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入 [放行路由] 集合
|
||||||
|
*
|
||||||
|
* @param pathList 路由集合
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor setExcludeList(List<String> pathList) {
|
||||||
|
excludeList = pathList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 [拦截路由] 集合
|
||||||
|
*
|
||||||
|
* @return see note
|
||||||
|
*/
|
||||||
|
public List<String> getIncludeList() {
|
||||||
|
return includeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 [放行路由] 集合
|
||||||
|
*
|
||||||
|
* @return see note
|
||||||
|
*/
|
||||||
|
public List<String> getExcludeList() {
|
||||||
|
return excludeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------ 钩子函数
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证函数:每次请求执行
|
||||||
|
*/
|
||||||
|
protected SaFilterAuthStrategy auth = r -> {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常处理函数:每次[认证函数]发生异常时执行此函数
|
||||||
|
*/
|
||||||
|
protected SaFilterErrorStrategy error = e -> {
|
||||||
|
if (e instanceof SaTokenException) {
|
||||||
|
throw (SaTokenException) e;
|
||||||
|
} else {
|
||||||
|
throw new SaTokenException(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前置函数:在每次[认证函数]之前执行
|
||||||
|
*/
|
||||||
|
protected SaFilterAuthStrategy beforeAuth = r -> {
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[认证函数]: 每次请求执行
|
||||||
|
*
|
||||||
|
* @param auth see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor setAuth(SaFilterAuthStrategy auth) {
|
||||||
|
this.auth = auth;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[异常处理函数]:每次[认证函数]发生异常时执行此函数
|
||||||
|
*
|
||||||
|
* @param error see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor setError(SaFilterErrorStrategy error) {
|
||||||
|
this.error = error;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 写入[前置函数]:在每次[认证函数]之前执行
|
||||||
|
*
|
||||||
|
* @param beforeAuth see note
|
||||||
|
* @return 对象自身
|
||||||
|
*/
|
||||||
|
public SaTokenInterceptor setBeforeAuth(SaFilterAuthStrategy beforeAuth) {
|
||||||
|
this.beforeAuth = beforeAuth;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
|
||||||
|
try {
|
||||||
|
//如果是静态文件,则不处理(静态文件,不在路由中)
|
||||||
|
if (mainHandler != null) {
|
||||||
|
Action action = (mainHandler instanceof Action ? (Action) mainHandler : null);
|
||||||
|
|
||||||
|
if (isAnnotation && action != null) {
|
||||||
|
// 获取此请求对应的 Method 处理函数
|
||||||
|
Method method = action.method().getMethod();
|
||||||
|
|
||||||
|
// 如果此 Method 或其所属 Class 标注了 @SaIgnore,则忽略掉鉴权
|
||||||
|
if (SaStrategy.me.isAnnotationPresent.apply(method, SaIgnore.class)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注解校验
|
||||||
|
SaStrategy.me.checkMethodAnnotation.accept(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
//路径规则处理
|
||||||
|
SaRouter.match(includeList).notMatch(excludeList).check(r -> {
|
||||||
|
beforeAuth.run(mainHandler);
|
||||||
|
auth.run(mainHandler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (StopMatchException e) {
|
||||||
|
|
||||||
|
} catch (SaTokenException e) {
|
||||||
|
// 1. 获取异常处理策略结果
|
||||||
|
Object result;
|
||||||
|
if (e instanceof BackResultException) {
|
||||||
|
result = e.getMessage();
|
||||||
|
} else {
|
||||||
|
result = error.run(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 写入输出流
|
||||||
|
if (result != null) {
|
||||||
|
ctx.render(result);
|
||||||
|
}
|
||||||
|
ctx.setHandled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chain.doIntercept(ctx, mainHandler);
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,7 @@ import cn.dev33.satoken.strategy.SaStrategy;
|
|||||||
* @author noear
|
* @author noear
|
||||||
* @since 1.10
|
* @since 1.10
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class SaTokenPathFilter implements Filter {
|
public class SaTokenPathFilter implements Filter {
|
||||||
/**
|
/**
|
||||||
* 是否打开注解鉴权
|
* 是否打开注解鉴权
|
||||||
|
@ -24,6 +24,7 @@ import java.util.List;
|
|||||||
* @author noear
|
* @author noear
|
||||||
* @since 1.10
|
* @since 1.10
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public class SaTokenPathInterceptor implements Handler {
|
public class SaTokenPathInterceptor implements Handler {
|
||||||
/**
|
/**
|
||||||
* 是否打开注解鉴权
|
* 是否打开注解鉴权
|
||||||
|
Loading…
Reference in New Issue
Block a user