!212 sa-token-solon-plugin 升级 solon 为 1.12.2

Merge pull request !212 from 西东/dev
This commit is contained in:
孔明 2023-01-13 01:18:13 +00:00 committed by Gitee
commit 31926cc6bc
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
7 changed files with 445 additions and 8 deletions

View File

@ -22,9 +22,9 @@ public class SaTokenConfigure {
/**
* 注册 [sa-token全局过滤器]
*/
@Bean
public void tokenPathFilter() {
Solon.app().before(new SaTokenPathInterceptor()
@Bean(index = -100)
public SaTokenInterceptor tokenPathFilter() {
return new SaTokenInterceptor()
// 指定 [拦截路由] [放行路由]
.addInclude("/**").addExclude("/favicon.ico")
@ -55,7 +55,6 @@ public class SaTokenConfigure {
// 禁用浏览器内容嗅探
.setHeader("X-Content-Type-Options", "nosniff")
;
})
);
});
}
}

View File

@ -23,7 +23,7 @@
<servlet-api.version>3.1.0</servlet-api.version>
<jakarta-servlet-api.version>6.0.0</jakarta-servlet-api.version>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<solon.version>1.12.0</solon.version>
<solon.version>1.12.2</solon.version>
<noear-redisx.version>1.4.4</noear-redisx.version>
<jfinal.version>4.9.17</jfinal.version>
<jboot.version>3.14.4</jboot.version>

View File

@ -107,8 +107,8 @@ public class XPluginImp implements Plugin {
SaManager.setSaSignTemplate(bean);
});
// 自定义 StpLogic 对象可以有多个
context.subBeansOfType(StpLogic.class, bean -> {
// 自定义 StpLogic 对象 //容器层面只能有一个要多个得自己在Util上处理
context.getBeanAsync(StpLogic.class, bean -> {
StpUtil.setStpLogic(bean);
});
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -28,6 +28,7 @@ import cn.dev33.satoken.strategy.SaStrategy;
* @author noear
* @since 1.10
*/
@Deprecated
public class SaTokenPathFilter implements Filter {
/**
* 是否打开注解鉴权

View File

@ -24,6 +24,7 @@ import java.util.List;
* @author noear
* @since 1.10
*/
@Deprecated
public class SaTokenPathInterceptor implements Handler {
/**
* 是否打开注解鉴权