From fd829c34b9783c065961f8d0737e634fec5d0ba1 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Oct 2022 06:14:58 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=A4=9A=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E4=BD=93=E7=B3=BB=E6=B7=B7=E5=90=88=E9=89=B4=E6=9D=83?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/pj/satoken/StpUserUtil.java | 1032 +++++++++++++++++ sa-token-doc/up/many-account.md | 38 + 2 files changed, 1070 insertions(+) create mode 100644 sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java new file mode 100644 index 00000000..198e2225 --- /dev/null +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java @@ -0,0 +1,1032 @@ +package com.pj.satoken; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.session.SaSession; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpLogic; + +/** + * Sa-Token 权限认证工具类 (User版) + * @author kong + */ +@Component +public class StpUserUtil { + + private StpUserUtil() {} + + /** + * 账号类型标识 + */ + public static final String TYPE = "user"; + + /** + * 底层的 StpLogic 对象 + */ + public static StpLogic stpLogic = new StpLogic(TYPE); + + /** + * 获取当前 StpLogic 的账号类型 + * @return See Note + */ + public static String getLoginType(){ + return stpLogic.getLoginType(); + } + + /** + * 重置 StpLogic 对象 + *
1、更改此账户的 StpLogic 对象 + *
2、put 到全局 StpLogic 集合中 + * + * @param newStpLogic / + */ + public static void setStpLogic(StpLogic newStpLogic) { + // 重置此账户的 StpLogic 对象 + stpLogic = newStpLogic; + + // 添加到全局 StpLogic 集合中 + // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic + SaManager.putStpLogic(newStpLogic); + } + + /** + * 获取 StpLogic 对象 + * @return / + */ + public static StpLogic getStpLogic() { + return stpLogic; + } + + + // ------------------- 获取token 相关 ------------------- + + /** + * 返回token名称 + * @return 此StpLogic的token名称 + */ + public static String getTokenName() { + return stpLogic.getTokenName(); + } + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + */ + public static void setTokenValue(String tokenValue){ + stpLogic.setTokenValue(tokenValue); + } + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + * @param cookieTimeout Cookie存活时间(秒) + */ + public static void setTokenValue(String tokenValue, int cookieTimeout){ + stpLogic.setTokenValue(tokenValue, cookieTimeout); + } + + /** + * 获取当前TokenValue + * @return 当前tokenValue + */ + public static String getTokenValue() { + return stpLogic.getTokenValue(); + } + + /** + * 获取当前TokenValue (不裁剪前缀) + * @return / + */ + public static String getTokenValueNotCut(){ + return stpLogic.getTokenValueNotCut(); + } + + /** + * 获取当前会话的Token信息 + * @return token信息 + */ + public static SaTokenInfo getTokenInfo() { + return stpLogic.getTokenInfo(); + } + + + // ------------------- 登录相关操作 ------------------- + + // --- 登录 + + /** + * 会话登录 + * @param id 账号id,建议的类型:(long | int | String) + */ + public static void login(Object id) { + stpLogic.login(id); + } + + /** + * 会话登录,并指定登录设备类型 + * @param id 账号id,建议的类型:(long | int | String) + * @param device 设备类型 + */ + public static void login(Object id, String device) { + stpLogic.login(id, device); + } + + /** + * 会话登录,并指定是否 [记住我] + * + * @param id 账号id,建议的类型:(long | int | String) + * @param isLastingCookie 是否为持久Cookie + */ + public static void login(Object id, boolean isLastingCookie) { + stpLogic.login(id, isLastingCookie); + } + + /** + * 会话登录,并指定此次登录token的有效期, 单位:秒 + * + * @param id 账号id,建议的类型:(long | int | String) + * @param timeout 此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) + */ + public static void login(Object id, long timeout) { + stpLogic.login(id, timeout); + } + + /** + * 会话登录,并指定所有登录参数Model + * + * @param id 登录id,建议的类型:(long | int | String) + * @param loginModel 此次登录的参数Model + */ + public static void login(Object id, SaLoginModel loginModel) { + stpLogic.login(id, loginModel); + } + + /** + * 创建指定账号id的登录会话 + * @param id 登录id,建议的类型:(long | int | String) + * @return 返回会话令牌 + */ + public static String createLoginSession(Object id) { + return stpLogic.createLoginSession(id); + } + + /** + * 创建指定账号id的登录会话 + * @param id 登录id,建议的类型:(long | int | String) + * @param loginModel 此次登录的参数Model + * @return 返回会话令牌 + */ + public static String createLoginSession(Object id, SaLoginModel loginModel) { + return stpLogic.createLoginSession(id, loginModel); + } + + // --- 注销 + + /** + * 会话注销 + */ + public static void logout() { + stpLogic.logout(); + } + + /** + * 会话注销,根据账号id + * @param loginId 账号id + */ + public static void logout(Object loginId) { + stpLogic.logout(loginId); + } + + /** + * 会话注销,根据账号id 和 设备类型 + * + * @param loginId 账号id + * @param device 设备类型 (填null代表注销所有设备类型) + */ + public static void logout(Object loginId, String device) { + stpLogic.logout(loginId, device); + } + + /** + * 会话注销,根据指定 Token + * + * @param tokenValue 指定token + */ + public static void logoutByTokenValue(String tokenValue) { + stpLogic.logoutByTokenValue(tokenValue); + } + + /** + * 踢人下线,根据账号id + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param loginId 账号id + */ + public static void kickout(Object loginId) { + stpLogic.kickout(loginId); + } + + /** + * 踢人下线,根据账号id 和 设备类型 + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param loginId 账号id + * @param device 设备类型 (填null代表踢出所有设备类型) + */ + public static void kickout(Object loginId, String device) { + stpLogic.kickout(loginId, device); + } + + /** + * 踢人下线,根据指定 Token + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-5

+ * + * @param tokenValue 指定token + */ + public static void kickoutByTokenValue(String tokenValue) { + stpLogic.kickoutByTokenValue(tokenValue); + } + + /** + * 顶人下线,根据账号id 和 设备类型 + *

当对方再次访问系统时,会抛出NotLoginException异常,场景值=-4

+ * + * @param loginId 账号id + * @param device 设备类型 (填null代表顶替所有设备类型) + */ + public static void replaced(Object loginId, String device) { + stpLogic.replaced(loginId, device); + } + + + // 查询相关 + + /** + * 当前会话是否已经登录 + * @return 是否已登录 + */ + public static boolean isLogin() { + return stpLogic.isLogin(); + } + + /** + * 检验当前会话是否已经登录,如未登录,则抛出异常 + */ + public static void checkLogin() { + stpLogic.checkLogin(); + } + + /** + * 获取当前会话账号id, 如果未登录,则抛出异常 + * @return 账号id + */ + public static Object getLoginId() { + return stpLogic.getLoginId(); + } + + /** + * 获取当前会话账号id, 如果未登录,则返回默认值 + * @param 返回类型 + * @param defaultValue 默认值 + * @return 登录id + */ + public static T getLoginId(T defaultValue) { + return stpLogic.getLoginId(defaultValue); + } + + /** + * 获取当前会话账号id, 如果未登录,则返回null + * @return 账号id + */ + public static Object getLoginIdDefaultNull() { + return stpLogic.getLoginIdDefaultNull(); + } + + /** + * 获取当前会话账号id, 并转换为String类型 + * @return 账号id + */ + public static String getLoginIdAsString() { + return stpLogic.getLoginIdAsString(); + } + + /** + * 获取当前会话账号id, 并转换为int类型 + * @return 账号id + */ + public static int getLoginIdAsInt() { + return stpLogic.getLoginIdAsInt(); + } + + /** + * 获取当前会话账号id, 并转换为long类型 + * @return 账号id + */ + public static long getLoginIdAsLong() { + return stpLogic.getLoginIdAsLong(); + } + + /** + * 获取指定Token对应的账号id,如果未登录,则返回 null + * @param tokenValue token + * @return 账号id + */ + public static Object getLoginIdByToken(String tokenValue) { + return stpLogic.getLoginIdByToken(tokenValue); + } + + /** + * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效) + * @param key 键值 + * @return 对应的扩展数据 + */ + public static Object getExtra(String key) { + return stpLogic.getExtra(key); + } + + /** + * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效) + * @param tokenValue 指定的 Token 值 + * @param key 键值 + * @return 对应的扩展数据 + */ + public static Object getExtra(String tokenValue, String key) { + return stpLogic.getExtra(tokenValue, key); + } + + + // ------------------- User-Session 相关 ------------------- + + /** + * 获取指定账号id的Session, 如果Session尚未创建,isCreate=是否新建并返回 + * @param loginId 账号id + * @param isCreate 是否新建 + * @return Session对象 + */ + public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) { + return stpLogic.getSessionByLoginId(loginId, isCreate); + } + + /** + * 获取指定key的Session, 如果Session尚未创建,则返回null + * @param sessionId SessionId + * @return Session对象 + */ + public static SaSession getSessionBySessionId(String sessionId) { + return stpLogic.getSessionBySessionId(sessionId); + } + + /** + * 获取指定账号id的Session,如果Session尚未创建,则新建并返回 + * @param loginId 账号id + * @return Session对象 + */ + public static SaSession getSessionByLoginId(Object loginId) { + return stpLogic.getSessionByLoginId(loginId); + } + + /** + * 获取当前会话的Session, 如果Session尚未创建,isCreate=是否新建并返回 + * @param isCreate 是否新建 + * @return Session对象 + */ + public static SaSession getSession(boolean isCreate) { + return stpLogic.getSession(isCreate); + } + + /** + * 获取当前会话的Session,如果Session尚未创建,则新建并返回 + * @return Session对象 + */ + public static SaSession 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尚未创建,则新建并返回 + * @return Session对象 + */ + public static SaSession getTokenSession() { + return stpLogic.getTokenSession(); + } + + /** + * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session) + * @return Token-Session 对象 + */ + public static SaSession getAnonTokenSession() { + return stpLogic.getAnonTokenSession(); + } + + + // ------------------- [临时有效期] 验证相关 ------------------- + + /** + * 检查当前token 是否已经[临时过期],如果已经过期则抛出异常 + */ + public static void checkActivityTimeout() { + stpLogic.checkActivityTimeout(); + } + + /** + * 续签当前token:(将 [最后操作时间] 更新为当前时间戳) + *

请注意: 即使token已经 [临时过期] 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可

+ */ + public static void updateLastActivityToNow() { + stpLogic.updateLastActivityToNow(); + } + + + // ------------------- 过期时间相关 ------------------- + + /** + * 获取当前登录者的 token 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getTokenTimeout() { + return stpLogic.getTokenTimeout(); + } + + /** + * 获取当前登录者的 User-Session 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getSessionTimeout() { + return stpLogic.getSessionTimeout(); + } + + /** + * 获取当前 Token-Session 剩余有效时间 (单位: 秒) + * @return token剩余有效时间 + */ + public static long getTokenSessionTimeout() { + return stpLogic.getTokenSessionTimeout(); + } + + /** + * 获取当前 token [临时过期] 剩余有效时间 (单位: 秒) + * @return token [临时过期] 剩余有效时间 + */ + public static long getTokenActivityTimeout() { + return stpLogic.getTokenActivityTimeout(); + } + + /** + * 对当前 Token 的 timeout 值进行续期 + * @param timeout 要修改成为的有效时间 (单位: 秒) + */ + public static void renewTimeout(long timeout) { + stpLogic.renewTimeout(timeout); + } + + /** + * 对指定 Token 的 timeout 值进行续期 + * @param tokenValue 指定token + * @param timeout 要修改成为的有效时间 (单位: 秒) + */ + public static void renewTimeout(String tokenValue, long timeout) { + stpLogic.renewTimeout(tokenValue, timeout); + } + + + // ------------------- 角色验证操作 ------------------- + + /** + * 获取:当前账号的角色集合 + * @return / + */ + public static List getRoleList() { + return stpLogic.getRoleList(); + } + + /** + * 获取:指定账号的角色集合 + * @param loginId 指定账号id + * @return / + */ + public static List getRoleList(Object loginId) { + return stpLogic.getRoleList(loginId); + } + + /** + * 判断:当前账号是否拥有指定角色, 返回true或false + * @param role 角色标识 + * @return 是否含有指定角色标识 + */ + public static boolean hasRole(String role) { + return stpLogic.hasRole(role); + } + + /** + * 判断:指定账号是否含有指定角色标识, 返回true或false + * @param loginId 账号id + * @param role 角色标识 + * @return 是否含有指定角色标识 + */ + public static boolean hasRole(Object loginId, String role) { + return stpLogic.hasRole(loginId, role); + } + + /** + * 判断:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] + * @param roleArray 角色标识数组 + * @return true或false + */ + public static boolean hasRoleAnd(String... roleArray){ + return stpLogic.hasRoleAnd(roleArray); + } + + /** + * 判断:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] + * @param roleArray 角色标识数组 + * @return true或false + */ + public static boolean hasRoleOr(String... roleArray){ + return stpLogic.hasRoleOr(roleArray); + } + + /** + * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException + * @param role 角色标识 + */ + public static void checkRole(String role) { + stpLogic.checkRole(role); + } + + /** + * 校验:当前账号是否含有指定角色标识 [指定多个,必须全部验证通过] + * @param roleArray 角色标识数组 + */ + public static void checkRoleAnd(String... roleArray){ + stpLogic.checkRoleAnd(roleArray); + } + + /** + * 校验:当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可] + * @param roleArray 角色标识数组 + */ + public static void checkRoleOr(String... roleArray){ + stpLogic.checkRoleOr(roleArray); + } + + + // ------------------- 权限验证操作 ------------------- + + /** + * 获取:当前账号的权限码集合 + * @return / + */ + public static List getPermissionList() { + return stpLogic.getPermissionList(); + } + + /** + * 获取:指定账号的权限码集合 + * @param loginId 指定账号id + * @return / + */ + public static List getPermissionList(Object loginId) { + return stpLogic.getPermissionList(loginId); + } + + /** + * 判断:当前账号是否含有指定权限, 返回true或false + * @param permission 权限码 + * @return 是否含有指定权限 + */ + public static boolean hasPermission(String permission) { + return stpLogic.hasPermission(permission); + } + + /** + * 判断:指定账号id是否含有指定权限, 返回true或false + * @param loginId 账号id + * @param permission 权限码 + * @return 是否含有指定权限 + */ + public static boolean hasPermission(Object loginId, String permission) { + return stpLogic.hasPermission(loginId, permission); + } + + /** + * 判断:当前账号是否含有指定权限, [指定多个,必须全部具有] + * @param permissionArray 权限码数组 + * @return true 或 false + */ + public static boolean hasPermissionAnd(String... permissionArray){ + return stpLogic.hasPermissionAnd(permissionArray); + } + + /** + * 判断:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] + * @param permissionArray 权限码数组 + * @return true 或 false + */ + public static boolean hasPermissionOr(String... permissionArray){ + return stpLogic.hasPermissionOr(permissionArray); + } + + /** + * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException + * @param permission 权限码 + */ + public static void checkPermission(String permission) { + stpLogic.checkPermission(permission); + } + + /** + * 校验:当前账号是否含有指定权限 [指定多个,必须全部验证通过] + * @param permissionArray 权限码数组 + */ + public static void checkPermissionAnd(String... permissionArray) { + stpLogic.checkPermissionAnd(permissionArray); + } + + /** + * 校验:当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] + * @param permissionArray 权限码数组 + */ + public static void checkPermissionOr(String... permissionArray) { + stpLogic.checkPermissionOr(permissionArray); + } + + + // ------------------- id 反查token 相关操作 ------------------- + + /** + * 获取指定账号id的tokenValue + *

在配置为允许并发登录时,此方法只会返回队列的最后一个token, + * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * @param loginId 账号id + * @return token值 + */ + public static String getTokenValueByLoginId(Object loginId) { + return stpLogic.getTokenValueByLoginId(loginId); + } + + /** + * 获取指定账号id指定设备类型端的tokenValue + *

在配置为允许并发登录时,此方法只会返回队列的最后一个token, + * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId + * @param loginId 账号id + * @param device 设备类型 + * @return token值 + */ + public static String getTokenValueByLoginId(Object loginId, String device) { + return stpLogic.getTokenValueByLoginId(loginId, device); + } + + /** + * 获取指定账号id的tokenValue集合 + * @param loginId 账号id + * @return 此loginId的所有相关token + */ + public static List getTokenValueListByLoginId(Object loginId) { + return stpLogic.getTokenValueListByLoginId(loginId); + } + + /** + * 获取指定账号id指定设备类型端的tokenValue 集合 + * @param loginId 账号id + * @param device 设备类型 + * @return 此loginId的所有相关token + */ + public static List getTokenValueListByLoginId(Object loginId, String device) { + return stpLogic.getTokenValueListByLoginId(loginId, device); + } + + /** + * 返回当前会话的登录设备类型 + * @return 当前令牌的登录设备类型 + */ + public static String getLoginDevice() { + return stpLogic.getLoginDevice(); + } + + + // ------------------- 会话管理 ------------------- + + /** + * 根据条件查询Token + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @param sortType 排序类型(true=正序,false=反序) + * + * @return token集合 + */ + public static List searchTokenValue(String keyword, int start, int size, boolean sortType) { + return stpLogic.searchTokenValue(keyword, start, size, sortType); + } + + /** + * 根据条件查询SessionId + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @param sortType 排序类型(true=正序,false=反序) + * + * @return sessionId集合 + */ + public static List searchSessionId(String keyword, int start, int size, boolean sortType) { + return stpLogic.searchSessionId(keyword, start, size, sortType); + } + + /** + * 根据条件查询Token专属Session的Id + * @param keyword 关键字 + * @param start 开始处索引 (-1代表查询所有) + * @param size 获取数量 + * @param sortType 排序类型(true=正序,false=反序) + * + * @return sessionId集合 + */ + public static List searchTokenSessionId(String keyword, int start, int size, boolean sortType) { + return stpLogic.searchTokenSessionId(keyword, start, size, sortType); + } + + + // ------------------- 账号封禁 ------------------- + + /** + * 封禁:指定账号 + *

此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) + * + * @param loginId 指定账号id + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disable(Object loginId, long time) { + stpLogic.disable(loginId, time); + } + + /** + * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) + * + * @param loginId 账号id + * @return / + */ + public static boolean isDisable(Object loginId) { + return stpLogic.isDisable(loginId); + } + + /** + * 校验:指定账号是否已被封禁,如果被封禁则抛出异常 + * @param loginId 账号id + */ + public static void checkDisable(Object loginId) { + stpLogic.checkDisable(loginId); + } + + /** + * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * @param loginId 账号id + * @return / + */ + public static long getDisableTime(Object loginId) { + return stpLogic.getDisableTime(loginId); + } + + /** + * 解封:指定账号 + * @param loginId 账号id + */ + public static void untieDisable(Object loginId) { + stpLogic.untieDisable(loginId); + } + + + // ------------------- 分类封禁 ------------------- + + /** + * 封禁:指定账号的指定服务 + *

此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id) + * @param loginId 指定账号id + * @param service 指定服务 + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disable(Object loginId, String service, long time) { + stpLogic.disable(loginId, service, time); + } + + /** + * 判断:指定账号的指定服务 是否已被封禁 (true=已被封禁, false=未被封禁) + * @param loginId 账号id + * @param service 指定服务 + * @return / + */ + public static boolean isDisable(Object loginId, String service) { + return stpLogic.isDisable(loginId, service); + } + + /** + * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常 + * @param loginId 账号id + * @param services 指定服务,可以指定多个 + */ + public static void checkDisable(Object loginId, String... services) { + stpLogic.checkDisable(loginId, services); + } + + /** + * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) + * @param loginId 账号id + * @param service 指定服务 + * @return see note + */ + public static long getDisableTime(Object loginId, String service) { + return stpLogic.getDisableTime(loginId, service); + } + + /** + * 解封:指定账号、指定服务 + * @param loginId 账号id + * @param services 指定服务,可以指定多个 + */ + public static void untieDisable(Object loginId, String... services) { + stpLogic.untieDisable(loginId, services); + } + + + // ------------------- 阶梯封禁 ------------------- + + /** + * 封禁:指定账号,并指定封禁等级 + * @param loginId 指定账号id + * @param level 指定封禁等级 + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disableLevel(Object loginId, int level, long time) { + stpLogic.disableLevel(loginId, level, time); + } + + /** + * 封禁:指定账号的指定服务,并指定封禁等级 + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @param level 指定封禁等级 + * @param time 封禁时间, 单位: 秒 (-1=永久封禁) + */ + public static void disableLevel(Object loginId, String service, int level, long time) { + stpLogic.disableLevel(loginId, service, level, time); + } + + /** + * 判断:指定账号是否已被封禁到指定等级 + * + * @param loginId 指定账号id + * @param level 指定封禁等级 + * @return / + */ + public static boolean isDisableLevel(Object loginId, int level) { + return stpLogic.isDisableLevel(loginId, level); + } + + /** + * 判断:指定账号的指定服务,是否已被封禁到指定等级 + * + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @param level 指定封禁等级 + * @return / + */ + public static boolean isDisableLevel(Object loginId, String service, int level) { + return stpLogic.isDisableLevel(loginId, service, level); + } + + /** + * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常) + * + * @param loginId 指定账号id + * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) + */ + public static void checkDisableLevel(Object loginId, int level) { + stpLogic.checkDisableLevel(loginId, level); + } + + /** + * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常) + * + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常) + */ + public static void checkDisableLevel(Object loginId, String service, int level) { + stpLogic.checkDisableLevel(loginId, service, level); + } + + /** + * 获取:指定账号被封禁的等级,如果未被封禁则返回-2 + * + * @param loginId 指定账号id + * @return / + */ + public static int getDisableLevel(Object loginId) { + return stpLogic.getDisableLevel(loginId); + } + + /** + * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2 + * + * @param loginId 指定账号id + * @param service 指定封禁服务 + * @return / + */ + public static int getDisableLevel(Object loginId, String service) { + return stpLogic.getDisableLevel(loginId, service); + } + + + // ------------------- 身份切换 ------------------- + + /** + * 临时切换身份为指定账号id + * @param loginId 指定loginId + */ + public static void switchTo(Object loginId) { + stpLogic.switchTo(loginId); + } + + /** + * 结束临时切换身份 + */ + public static void endSwitch() { + stpLogic.endSwitch(); + } + + /** + * 当前是否正处于[身份临时切换]中 + * @return 是否正处于[身份临时切换]中 + */ + public static boolean isSwitch() { + return stpLogic.isSwitch(); + } + + /** + * 在一个代码段里方法内,临时切换身份为指定账号id + * @param loginId 指定账号id + * @param function 要执行的方法 + */ + public static void switchTo(Object loginId, SaFunction function) { + stpLogic.switchTo(loginId, function); + } + + + // ------------------- 二级认证 ------------------- + + /** + * 在当前会话 开启二级认证 + * @param safeTime 维持时间 (单位: 秒) + */ + public static void openSafe(long safeTime) { + stpLogic.openSafe(safeTime); + } + + /** + * 当前会话 是否处于二级认证时间内 + * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时 + */ + public static boolean isSafe() { + return stpLogic.isSafe(); + } + + /** + * 检查当前会话是否已通过二级认证,如未通过则抛出异常 + */ + public static void checkSafe() { + stpLogic.checkSafe(); + } + + /** + * 获取当前会话的二级认证剩余有效时间 (单位: 秒, 返回-2代表尚未通过二级认证) + * @return 剩余有效时间 + */ + public static long getSafeTime() { + return stpLogic.getSafeTime(); + } + + /** + * 在当前会话 结束二级认证 + */ + public static void closeSafe() { + stpLogic.closeSafe(); + } + +} diff --git a/sa-token-doc/up/many-account.md b/sa-token-doc/up/many-account.md index e69c2b5b..12cb3022 100644 --- a/sa-token-doc/up/many-account.md +++ b/sa-token-doc/up/many-account.md @@ -188,6 +188,44 @@ public class StpUserUtil { } ``` +### 9、多账号体系混合鉴权 +QQ群中经常有小伙伴提问:在多账号体系下,怎么在 SaInterceptor 拦截器中给一个接口登录鉴权? + +其实这个问题,主要是靠你的业务需求来决定,以后台 Admin 账号和前台 User 账号为例: + +``` java +// 注册 Sa-Token 拦截器 +@Override +public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new SaInterceptor(handle -> { + + // 如果这个接口,要求客户端登录了后台 Admin 账号才能访问: + SaRouter.match("/art/getInfo").check(r -> StpUtil.checkLogin()); + + // 如果这个接口,要求客户端登录了前台 User 账号才能访问: + SaRouter.match("/art/getInfo").check(r -> StpUserUtil.checkLogin()); + + // 如果这个接口,要求客户端同时登录 Admin 和 User 账号,才能访问: + SaRouter.match("/art/getInfo").check(r -> { + StpUtil.checkLogin(); + StpUserUtil.checkLogin(); + }); + + // 如果这个接口,要求客户端登录 Admin 和 User 账号任意一个,就能访问: + SaRouter.match("/art/getInfo").check(r -> { + if(StpUtil.isLogin() == false && StpUserUtil.isLogin() == false) { + throw new SaTokenException("请登录后再访问接口"); + } + }); + + })).addPathPatterns("/**"); +} +``` + + + + + --- Date: Thu, 20 Oct 2022 06:16:02 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20`sa-token-quick-logi?= =?UTF-8?q?n`=20=E6=8F=92=E4=BB=B6=E6=8C=87=E5=AE=9A=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E6=8E=92=E9=99=A4=E8=B7=AF=E7=94=B1=E4=B8=8D=E7=94=9F=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/pj/test/TestController.java | 2 +- .../src/main/resources/application.yml | 2 +- .../dev33/satoken/quick/SaQuickRegister.java | 23 +++++++++++-------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java index 29fd21ba..5ad5cedb 100644 --- a/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-quick-login/src/main/java/com/pj/test/TestController.java @@ -21,7 +21,7 @@ public class TestController { + "

资源页 (登录后才可进入本页面)

" + "
" + "

Sa-Token " + SaTokenConsts.VERSION_NO + "

"; - return str; + return str; } } diff --git a/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml index da460501..8b111db3 100644 --- a/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-quick-login/src/main/resources/application.yml @@ -19,7 +19,7 @@ sa: # 指定拦截路径 # include: /** # 指定排除路径 - # exclude: /sss,/fff + # exclude: /1.jpg # 将本地磁盘的某个路径作为静态资源开放 # dir: file:E:\static diff --git a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java index 337e3ab3..83f92840 100644 --- a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java +++ b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickRegister.java @@ -41,17 +41,22 @@ public class SaQuickRegister { @Order(SaTokenConsts.ASSEMBLY_ORDER - 1) public SaServletFilter getSaServletFilter() { return new SaServletFilter() - // 拦截路由 & 放行路由 - .addInclude(SaQuickManager.getConfig().getInclude().split(",")) - .addExclude(SaQuickManager.getConfig().getExclude().split(",")) + // 拦截路由 + .addInclude("/**") + // 排除掉登录相关接口,不需要鉴权的 .addExclude("/favicon.ico", "/saLogin", "/doLogin", "/sa-res/**"). // 认证函数: 每次请求执行 - setAuth(r -> { - // 未登录时直接转发到login.html页面 - if (SaQuickManager.getConfig().getAuth() && StpUtil.isLogin() == false) { - SaHolder.getRequest().forward("/saLogin"); - SaRouter.back(); - } + setAuth(obj -> { + SaRouter + .match(SaQuickManager.getConfig().getInclude().split(",")) + .notMatch(SaQuickManager.getConfig().getExclude().split(",")) + .check(r -> { + // 未登录时直接转发到login.html页面 + if (SaQuickManager.getConfig().getAuth() && StpUtil.isLogin() == false) { + SaHolder.getRequest().forward("/saLogin"); + SaRouter.back(); + } + }); }). // 异常处理函数:每次认证函数发生异常时执行此函数 From aa22fe84ee89122f75e81b7b9a73943a0e8ce33f Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Oct 2022 06:41:35 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20`sa-token-alone-redi?= =?UTF-8?q?s`=20+=20`sa-token-dao-redis-fastson`=20=E6=97=B6=20Redis=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=88=86=E7=A6=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-plugin/sa-token-alone-redis/pom.xml | 12 ++++++++++ .../satoken/dao/alone/SaAloneRedisInject.java | 24 +++++++++++++++++-- .../satoken/dao/SaTokenDaoRedisFastjson.java | 2 +- .../satoken/dao/SaTokenDaoRedisFastjson2.java | 2 +- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/sa-token-plugin/sa-token-alone-redis/pom.xml b/sa-token-plugin/sa-token-alone-redis/pom.xml index 09c3c65f..a586ba3f 100644 --- a/sa-token-plugin/sa-token-alone-redis/pom.xml +++ b/sa-token-plugin/sa-token-alone-redis/pom.xml @@ -29,6 +29,18 @@ sa-token-dao-redis-jackson ${revision} true + + + cn.dev33 + sa-token-dao-redis-fastjson + ${revision} + true + + + cn.dev33 + sa-token-dao-redis-fastjson2 + ${revision} + true diff --git a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java index 69dc94c6..a5e2a2b8 100644 --- a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java +++ b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java @@ -18,6 +18,8 @@ import org.springframework.data.redis.connection.lettuce.LettucePoolingClientCon import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl; import cn.dev33.satoken.dao.SaTokenDaoRedis; +import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson; +import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson2; import cn.dev33.satoken.dao.SaTokenDaoRedisJackson; /** @@ -95,7 +97,7 @@ public class SaAloneRedisInject implements EnvironmentAware{ factory.afterPropertiesSet(); // 3. 开始初始化 SaTokenDao - // 如果是SaTokenDaoRedis + // 如果开发者引入的是:sa-token-dao-redis try { Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedis"); SaTokenDaoRedis dao = (SaTokenDaoRedis)saTokenDao; @@ -104,7 +106,7 @@ public class SaAloneRedisInject implements EnvironmentAware{ return; } catch (ClassNotFoundException e) { } - // 如果是SaTokenDaoRedisJackson + // 如果开发者引入的是:sa-token-dao-redis-jackson try { Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisJackson"); SaTokenDaoRedisJackson dao = (SaTokenDaoRedisJackson)saTokenDao; @@ -113,6 +115,24 @@ public class SaAloneRedisInject implements EnvironmentAware{ return; } catch (ClassNotFoundException e) { } + // 如果开发者引入的是:sa-token-dao-redis-fastjson + try { + Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisFastjson"); + SaTokenDaoRedisFastjson dao = (SaTokenDaoRedisFastjson)saTokenDao; + dao.isInit = false; + dao.init(factory); + return; + } catch (ClassNotFoundException e) { + } + // 如果开发者引入的是:sa-token-dao-redis-fastjson2 + try { + Class.forName("cn.dev33.satoken.dao.SaTokenDaoRedisFastjson2"); + SaTokenDaoRedisFastjson2 dao = (SaTokenDaoRedisFastjson2)saTokenDao; + dao.isInit = false; + dao.init(factory); + return; + } catch (ClassNotFoundException e) { + } } catch (Exception e) { e.printStackTrace(); } diff --git a/sa-token-plugin/sa-token-dao-redis-fastjson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson.java b/sa-token-plugin/sa-token-dao-redis-fastjson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson.java index f61828d8..192405ec 100644 --- a/sa-token-plugin/sa-token-dao-redis-fastjson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson.java +++ b/sa-token-plugin/sa-token-dao-redis-fastjson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson.java @@ -18,7 +18,7 @@ import cn.dev33.satoken.strategy.SaStrategy; import cn.dev33.satoken.util.SaFoxUtil; /** - * Sa-Token持久层接口 [Redis版 (使用JSON字符串进行序列化)] + * Sa-Token 持久层实现 [Redis存储、fastjson序列化] * * @author sikadai * diff --git a/sa-token-plugin/sa-token-dao-redis-fastjson2/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson2.java b/sa-token-plugin/sa-token-dao-redis-fastjson2/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson2.java index 0ae0a8b1..c2dfe0d0 100644 --- a/sa-token-plugin/sa-token-dao-redis-fastjson2/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson2.java +++ b/sa-token-plugin/sa-token-dao-redis-fastjson2/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisFastjson2.java @@ -18,7 +18,7 @@ import cn.dev33.satoken.strategy.SaStrategy; import cn.dev33.satoken.util.SaFoxUtil; /** - * Sa-Token持久层接口 [Redis版 (使用JSON字符串进行序列化)] + * Sa-Token 持久层实现 [Redis存储、fastjson2序列化] * * @author sikadai * From febfdd9037a7b458bb130b9c931ac1fb6ec7ae62 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Oct 2022 06:44:51 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/plugin/alone-redis.md | 7 +++++++ sa-token-doc/plugin/dao-extend.md | 1 + 2 files changed, 8 insertions(+) diff --git a/sa-token-doc/plugin/alone-redis.md b/sa-token-doc/plugin/alone-redis.md index 64e135c9..8e481df0 100644 --- a/sa-token-doc/plugin/alone-redis.md +++ b/sa-token-doc/plugin/alone-redis.md @@ -102,3 +102,10 @@ public class TestController { ![alone-redis](https://oss.dev33.cn/sa-token/doc/alone-redis.png 's-w') 测试完毕! + +### 4、注意点 +目前 Sa-Token-Alone-Redis 仅对以下插件有 Redis 分离效果: +- sa-token-dao-redis +- sa-token-dao-redis-jackson +- sa-token-dao-redis-fastjson +- sa-token-dao-redis-fastjson2 \ No newline at end of file diff --git a/sa-token-doc/plugin/dao-extend.md b/sa-token-doc/plugin/dao-extend.md index 71a88407..0dc0750c 100644 --- a/sa-token-doc/plugin/dao-extend.md +++ b/sa-token-doc/plugin/dao-extend.md @@ -11,6 +11,7 @@ - sa-token-dao-redis-jackson:Redis集成包,使用 jackson 序列化方式。 - sa-token-dao-redisx:Redisx 集成包。 - sa-token-dao-redis-fastjson:Redis集成包,使用 fastjson 序列化方式。 +- sa-token-dao-redis-fastjson2:Redis集成包,使用 fastjson2 序列化方式。 有关 Redis 集成,详细参考:[集成Redis](/up/integ-redis),更多存储方式欢迎提交PR From 20ecd050c667b46f4e82b213453fe934ca3f2723 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Oct 2022 13:06:36 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Gradle=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E6=96=B9=E5=BC=8F=E5=92=8C=20properties=20=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 6 +- .../src/main/resources/application.yml | 4 +- sa-token-doc/doc.html | 8 +- sa-token-doc/fun/curr-domain.md | 11 +- sa-token-doc/fun/plugin-dev.md | 4 +- sa-token-doc/fun/sa-token-context.md | 11 +- sa-token-doc/fun/token-timeout.md | 13 ++- sa-token-doc/micro/dcs-session.md | 19 +++- sa-token-doc/micro/gateway-auth.md | 29 +++-- sa-token-doc/micro/id-token.md | 46 ++++++-- sa-token-doc/micro/import-intro.md | 59 +++++++--- sa-token-doc/oauth2/oauth2-server.md | 13 +++ sa-token-doc/plugin/alone-redis.md | 57 +++++++++- sa-token-doc/plugin/aop-at.md | 10 +- sa-token-doc/plugin/dubbo-extend.md | 21 +++- sa-token-doc/plugin/grpc-extend.md | 23 +++- sa-token-doc/plugin/jwt-extend.md | 26 ++++- sa-token-doc/plugin/quick-login.md | 43 ++++++- sa-token-doc/plugin/temp-token.md | 8 ++ sa-token-doc/plugin/thymeleaf-extend.md | 11 +- sa-token-doc/sso/sso-check-domain.md | 18 ++- sa-token-doc/sso/sso-h5.md | 15 ++- sa-token-doc/sso/sso-server.md | 77 ++++++++++++- sa-token-doc/sso/sso-type1.md | 78 +++++++++++-- sa-token-doc/sso/sso-type2.md | 106 +++++++++++++----- sa-token-doc/sso/sso-type3.md | 61 ++++++++-- sa-token-doc/start/download.md | 16 +-- sa-token-doc/start/example.md | 22 +++- sa-token-doc/start/webflux-example.md | 16 ++- sa-token-doc/static/doc.css | 20 ++-- sa-token-doc/static/prism/prism-gradle.min.js | 1 + sa-token-doc/static/prism/prism-java.min.js | 1 + .../static/prism/prism-properties.min.js | 1 + sa-token-doc/static/prism/prism-yaml.min.js | 1 + sa-token-doc/up/global-filter.md | 6 +- sa-token-doc/up/integ-redis.md | 62 +++++++++- sa-token-doc/up/token-prefix.md | 12 +- sa-token-doc/up/token-style.md | 2 +- sa-token-doc/use/config.md | 50 ++++++--- sa-token-doc/use/route-check.md | 2 +- 40 files changed, 821 insertions(+), 168 deletions(-) create mode 100644 sa-token-doc/static/prism/prism-gradle.min.js create mode 100644 sa-token-doc/static/prism/prism-java.min.js create mode 100644 sa-token-doc/static/prism/prism-properties.min.js create mode 100644 sa-token-doc/static/prism/prism-yaml.min.js diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml index babc1766..4d405497 100644 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/application.yml @@ -4,9 +4,9 @@ server: # Sa-Token 配置 sa-token: - # -------------- SSO-模式一相关配置 (非模式一不需要配置) + # ------- SSO-模式一相关配置 (非模式一不需要配置) # cookie: - # 配置Cookie作用域 + # 配置 Cookie 作用域 # domain: stp.com # ------- SSO-模式二相关配置 @@ -18,7 +18,7 @@ sa-token: # 是否打开单点注销功能 is-slo: true - # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) ------- + # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) # 是否打开模式三 isHttp: true # 接口调用秘钥(用于SSO模式三的单点注销功能) diff --git a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml index 3a07ff28..f01c205d 100644 --- a/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-sso1-client/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 9001 -# sa-token配置 +# Sa-Token 配置 sa-token: # SSO-相关配置 sso: @@ -11,7 +11,7 @@ sa-token: # SSO-Server端-单点注销地址 slo-url: http://sso.stp.com:9000/sso/logout - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) alone-redis: # Redis数据库索引 database: 1 diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index e9fff683..32e5c236 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -185,7 +185,13 @@ - + + + + + + + diff --git a/sa-token-doc/fun/curr-domain.md b/sa-token-doc/fun/curr-domain.md index f7d9382b..1a7c2184 100644 --- a/sa-token-doc/fun/curr-domain.md +++ b/sa-token-doc/fun/curr-domain.md @@ -64,10 +64,19 @@ public class CustomSaTokenContextForSpring extends SaTokenContextForSpring { ### 方案二:直接在yml中配置当前项目的网络访问地址 在 `application.yml` 中增加配置: -``` yml + + + +``` yaml sa-token: # 配置当前项目的网络访问地址 curr-domain: http://local.dev33.cn:8902/api ``` + +``` properties +# 配置当前项目的网络访问地址 +sa-token.curr-domain=http://local.dev33.cn:8902/api +``` + 即可避免路由转发过程中丢失 uri 的问题 diff --git a/sa-token-doc/fun/plugin-dev.md b/sa-token-doc/fun/plugin-dev.md index 650b34fa..98a4d54c 100644 --- a/sa-token-doc/fun/plugin-dev.md +++ b/sa-token-doc/fun/plugin-dev.md @@ -96,8 +96,8 @@ SaTokenContext 是对接不同框架的上下文接口,注入流程和第二 | 插件 | 功能 | 状态 | | :-------- | :-------- | :-------- | -| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 | -| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 待开发 | +| sa-token-solon-starter | Sa-Token 与 Solon 的整合 | 已完成 | +| sa-token-jfinal-starter | Sa-Token 与 JFinal 的整合 | 已完成 | | sa-token-hasor-starter | Sa-Token 与 Hasor 的整合 | 待开发 | ##### 标签方言: diff --git a/sa-token-doc/fun/sa-token-context.md b/sa-token-doc/fun/sa-token-context.md index a16f61e4..ae8803aa 100644 --- a/sa-token-doc/fun/sa-token-context.md +++ b/sa-token-doc/fun/sa-token-context.md @@ -71,7 +71,9 @@ public interface SaTokenContext { 先别着急动手,如果你的 Web 框架是基于 Servlet 规范开发的,那么 Sa-Token 已经为你封装好了三个 Model 接口的实现,你要做的就是引入 `sa-token-servlet`包即可: -``` xml + + +``` xml cn.dev33 @@ -79,6 +81,13 @@ public interface SaTokenContext { ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(ServletAPI 集成包) +implementation 'cn.dev33:sa-token-servlet:${sa.top.version}' +``` + + 如果你的 Web 框架不是基于 Servlet 规范,那么你就需要手动实现这三个 Model 接口,我们可以参考 `sa-token-servlet` 是怎样实现的: [SaRequestForServlet.java](https://gitee.com/dromara/sa-token/blob/master/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaRequestForServlet.java)、 diff --git a/sa-token-doc/fun/token-timeout.md b/sa-token-doc/fun/token-timeout.md index 2cef7d86..9faa9cb2 100644 --- a/sa-token-doc/fun/token-timeout.md +++ b/sa-token-doc/fun/token-timeout.md @@ -4,13 +4,24 @@ Sa-Token 提供两种Token自动过期策略,分别是`timeout`与`activity-timeout`,配置方法如下: -``` yml + + +``` yaml sa-token: # Token 有效期,单位:秒,默认30天, -1代表永不过期 timeout: 2592000 # Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 activity-timeout: -1 ``` + +``` properties +# Token 有效期,单位:秒,默认30天, -1代表永不过期 +sa-token.timeout=2592000 +# Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 +sa-token.activity-timeout=-1 +``` + + 两者的区别,可以通过下面的例子体现: diff --git a/sa-token-doc/micro/dcs-session.md b/sa-token-doc/micro/dcs-session.md index 5851bfce..8dfe5a38 100644 --- a/sa-token-doc/micro/dcs-session.md +++ b/sa-token-doc/micro/dcs-session.md @@ -34,18 +34,27 @@ 集成依赖示例: -``` xml - + + +``` xml + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + 详细参考:[集成 Redis](/up/integ-redis) diff --git a/sa-token-doc/micro/gateway-auth.md b/sa-token-doc/micro/gateway-auth.md index 20689f74..fc2308db 100644 --- a/sa-token-doc/micro/gateway-auth.md +++ b/sa-token-doc/micro/gateway-auth.md @@ -14,24 +14,39 @@ 首先,根据 [依赖引入说明](/micro/import-intro) 引入正确的依赖,以`[SpringCloud Gateway]`为例: -``` xml + + +``` xml cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + + + 注:Redis包是必须的,因为我们需要和各个服务通过Redis来同步数据 ### 2、实现鉴权接口 @@ -78,7 +93,7 @@ public class SaTokenConfigure { public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 拦截地址 - .addInclude("/**") + .addInclude("/**") /* 拦截全部path */ // 开放地址 .addExclude("/favicon.ico") // 鉴权方法:每次访问进入 @@ -92,7 +107,7 @@ public class SaTokenConfigure { SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods")); SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders")); - // ... + // 更多匹配 ... */ }) // 异常处理方法:每次setAuth函数出现异常时进入 .setError(e -> { diff --git a/sa-token-doc/micro/id-token.md b/sa-token-doc/micro/id-token.md index a55f9437..95c0c098 100644 --- a/sa-token-doc/micro/id-token.md +++ b/sa-token-doc/micro/id-token.md @@ -23,44 +23,70 @@ Sa-Token提供两种解决方案: ##### 1、引入依赖 在网关处引入的依赖为(此处以 SpringCloud Gateway 为例): -``` xml + + +``` xml cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + 在子服务引入的依赖为: -``` xml + + +``` xml cn.dev33 sa-token-spring-boot-starter ${sa.top.version} - + + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + ##### 2、网关处添加Id-Token diff --git a/sa-token-doc/micro/import-intro.md b/sa-token-doc/micro/import-intro.md index 8dccf4cd..3de0327c 100644 --- a/sa-token-doc/micro/import-intro.md +++ b/sa-token-doc/micro/import-intro.md @@ -7,25 +7,41 @@ > **在微服务架构中使用Sa-Token时,网关和内部服务要分开引入Sa-Token依赖(不要直接在顶级父pom中引入Sa-Token)** -总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`, +总体来讲,我们需要关注的依赖就是两个:`sa-token-spring-boot-starter` 和 `sa-token-reactor-spring-boot-starter`: -``` xml - + + +``` xml + - cn.dev33 - sa-token-spring-boot-starter - ${sa.top.version} + cn.dev33 + sa-token-spring-boot-starter + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' +``` + -``` xml - + + +``` xml + - cn.dev33 - sa-token-reactor-spring-boot-starter - ${sa.top.version} + cn.dev33 + sa-token-reactor-spring-boot-starter + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' +``` + 至于怎么分辨我们需要引入哪个呢?这个要看你使用的基础框架: @@ -40,18 +56,29 @@ 注:切不可直接在一个项目里同时引入这两个依赖,否则会造成项目无法启动 另外,我们需要引入Redis集成包,因为我们的网关和子服务主要通过Redis来同步数据 -``` xml - + + + +``` xml + - cn.dev33 - sa-token-dao-redis-jackson - ${sa.top.version} + cn.dev33 + sa-token-dao-redis-jackson + ${sa.top.version} org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' +``` + + 详细参考:[集成 Redis](/up/integ-redis) diff --git a/sa-token-doc/oauth2/oauth2-server.md b/sa-token-doc/oauth2/oauth2-server.md index a1e191b2..e4fc2e88 100644 --- a/sa-token-doc/oauth2/oauth2-server.md +++ b/sa-token-doc/oauth2/oauth2-server.md @@ -13,6 +13,8 @@ ### 2、引入依赖 创建SpringBoot项目 `sa-token-demo-oauth2-server`(不会的同学自行百度或参考仓库示例),添加pom依赖: + + ``` xml @@ -28,6 +30,17 @@ ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token-OAuth2.0 模块 +implementation 'cn.dev33:sa-token-oauth2:${sa.top.version}' +``` + + + ### 3、开放服务 1、新建 `SaOAuth2TemplateImpl` diff --git a/sa-token-doc/plugin/alone-redis.md b/sa-token-doc/plugin/alone-redis.md index 8e481df0..4a70d1b9 100644 --- a/sa-token-doc/plugin/alone-redis.md +++ b/sa-token-doc/plugin/alone-redis.md @@ -16,7 +16,9 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起 ### 1、首先引入Alone-Redis依赖 -``` xml + + +``` xml cn.dev33 @@ -24,11 +26,21 @@ Sa-Token默认的Redis集成方式会把权限数据和业务缓存放在一起 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + ### 2、然后在application.yml中增加配置 -``` yml -# Sa-Token配置 + + + + +``` yaml +# Sa-Token 配置 sa-token: # Token名称 token-name: satoken @@ -65,6 +77,45 @@ spring: timeout: 10s ``` + +``` properties +############## Sa-Token 配置 ############## +# Token名称 +sa-token.token-name=satoken +# Token有效期 +sa-token.timeout=2592000 +# Token风格 +sa-token.token-style=uuid + +############## 配置 Sa-Token 单独使用的 Redis 连接 ############## +# Redis数据库索引(默认为0) +sa-token.alone-redis.database=2 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s + +############## 配置业务使用的 Redis 连接 ############## +# Redis数据库索引(默认为0) +spring.redis.database=0 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +# 连接超时时间 +spring.redis.timeout=10s + +``` + + + + 具体可参考示例:[码云:application.yml](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-alone-redis/src/main/resources/application.yml) diff --git a/sa-token-doc/plugin/aop-at.md b/sa-token-doc/plugin/aop-at.md index 26b2339c..c96a1206 100644 --- a/sa-token-doc/plugin/aop-at.md +++ b/sa-token-doc/plugin/aop-at.md @@ -6,14 +6,22 @@ 因此Sa-Token提供AOP插件,你只需在`pom.xml`里添加如下依赖,便可以在任意层级使用注解鉴权 + + ``` xml - + cn.dev33 sa-token-spring-aop ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 SpringAOP 实现注解鉴权 +implementation 'cn.dev33:sa-token-spring-aop:${sa.top.version}' +``` + #### 注意点: diff --git a/sa-token-doc/plugin/dubbo-extend.md b/sa-token-doc/plugin/dubbo-extend.md index 21a0cfa5..b67251fc 100644 --- a/sa-token-doc/plugin/dubbo-extend.md +++ b/sa-token-doc/plugin/dubbo-extend.md @@ -25,7 +25,9 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 在项目已经引入 Dubbo 的基础上,继续添加依赖(Consumer 端和 Provider 端都需要引入): -``` xml + + +``` xml cn.dev33 @@ -33,6 +35,13 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Dubbo +implementation 'cn.dev33:sa-token-context-dubbo:${sa.top.version}' +``` + + 然后我们就可以愉快的做到以下事情: @@ -64,11 +73,19 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 直接在 `application.yml` 配置即可: -``` yml + + +``` yaml sa-token: # 打开 RPC 调用鉴权 check-id-token: true ``` + +``` properties +# 打开 RPC 调用鉴权 +sa-token.check-id-token=true +``` + ##### 方式二、自建 Dubbo 过滤器校验 diff --git a/sa-token-doc/plugin/grpc-extend.md b/sa-token-doc/plugin/grpc-extend.md index 8e3d0e96..84d73506 100644 --- a/sa-token-doc/plugin/grpc-extend.md +++ b/sa-token-doc/plugin/grpc-extend.md @@ -19,7 +19,9 @@ ### 引入插件 需要springboot环境,添加依赖(调用端和被调用端都需要引入): -``` xml + + +``` xml cn.dev33 @@ -27,13 +29,28 @@ ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 grpc +implementation 'cn.dev33:sa-token-context-grpc:${sa.top.version}' +``` + + --- ### 开启id-token校验: 直接在 `application.yml` 配置即可: -``` yml + + +``` yaml sa-token: # 打开 RPC 调用鉴权 check-id-token: true -``` \ No newline at end of file +``` + +``` properties +# 打开 RPC 调用鉴权 +sa-token.check-id-token=true +``` + \ No newline at end of file diff --git a/sa-token-doc/plugin/jwt-extend.md b/sa-token-doc/plugin/jwt-extend.md index acc0b114..3b01727d 100644 --- a/sa-token-doc/plugin/jwt-extend.md +++ b/sa-token-doc/plugin/jwt-extend.md @@ -7,7 +7,9 @@ ### 1、引入依赖 首先在项目已经引入 Sa-Token 的基础上,继续添加: -``` xml + + +``` xml cn.dev33 @@ -15,15 +17,33 @@ ${sa.top.version} ``` -> 注意: sa-token-jwt 显式依赖 hutool-all 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本 + +``` gradle +// Sa-Token 整合 jwt +implementation 'cn.dev33:sa-token-jwt:${sa.top.version}' +``` + + + +> 注意: sa-token-jwt 显式依赖 hutool-jwt 5.7.14 版本,意味着:你的项目中要么不引入 Hutool,要么引入版本 >= 5.7.14 的 Hutool 版本 ### 2、配置秘钥 在 `application.yml` 配置文件中配置 jwt 生成秘钥: -``` yml + + + +``` yaml sa-token: # jwt秘钥 jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk ``` + +``` properties +# jwt秘钥 +sa-token.jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk +``` + + 注:为了安全起见请不要直接复制官网示例这个字符串(随便按几个字符就好了) diff --git a/sa-token-doc/plugin/quick-login.md b/sa-token-doc/plugin/quick-login.md index 0997e814..a2a937ce 100644 --- a/sa-token-doc/plugin/quick-login.md +++ b/sa-token-doc/plugin/quick-login.md @@ -44,6 +44,9 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录 首先我们需要创建一个SpringBoot的demo项目,比如:`sa-token-demo-quick-login` ##### 1、添加pom依赖 + + + ``` xml @@ -52,6 +55,14 @@ Sa-Token-Quick-Login的定位是这样的场景:你的项目需要一个登录 ${sa.top.version} ``` + +``` gradle +// Sa-Token-Quick-Login 插件 +implementation 'cn.dev33:sa-token-quick-login:${sa.top.version}' +``` + + + ##### 2、启动类 ``` java @@ -98,7 +109,11 @@ public class TestController { ### 可配置信息 你可以在yml中添加如下配置 (所有配置都是可选的) -``` java + + + + +``` yaml # Sa-Token-Quick-Login 配置 sa: # 登录账号 @@ -116,9 +131,33 @@ sa: # 指定拦截路径 # include: /** # 指定排除路径 - # exclude: /sss,/fff + # exclude: /1.jpg ``` + +``` properties +####### Sa-Token-Quick-Login 配置 ####### +# 登录账号 +sa.name=sa +# 登录密码 +sa.pwd=123456 +# 是否自动随机生成账号密码 (此项为true时, name与pwd失效) +sa.auto=false +# 是否开启全局认证(关闭后将不再强行拦截) +sa.auth=true +# 登录页标题 +sa.title=Sa-Token 登录 +# 是否显示底部版权信息 +sa.copr=true +# 指定拦截路径 +# sa.include=/** +# 指定排除路径 +# sa.exclude=/1.jpg +``` + + + +
**注:**示例源码在`/sa-token-demo/sa-token-demo-quick-login`目录下,可结合源码查看学习 diff --git a/sa-token-doc/plugin/temp-token.md b/sa-token-doc/plugin/temp-token.md index dd44ba22..13921c97 100644 --- a/sa-token-doc/plugin/temp-token.md +++ b/sa-token-doc/plugin/temp-token.md @@ -59,6 +59,8 @@ SaTempUtil.deleteToken(token); **[sa-token-temp]** 模块允许以JWT作为逻辑内核完成工作,你只需要引入以下依赖,所有上层API保持不变 + + ``` xml cn.dev33 @@ -66,6 +68,12 @@ SaTempUtil.deleteToken(token); ${sa.top.version} ``` + +``` gradle +implementation 'cn.dev33:sa-token-temp-jwt:${sa.top.version}' +``` + + 并在配置文件中配置上jwt秘钥 **`(必填!)`** ``` java diff --git a/sa-token-doc/plugin/thymeleaf-extend.md b/sa-token-doc/plugin/thymeleaf-extend.md index e33a7dd4..ae8f00fd 100644 --- a/sa-token-doc/plugin/thymeleaf-extend.md +++ b/sa-token-doc/plugin/thymeleaf-extend.md @@ -7,7 +7,9 @@ ### 1、引入依赖 首先我们确保项目已经引入 Thymeleaf 依赖,然后在此基础上继续添加: -``` xml + + +``` xml cn.dev33 @@ -15,6 +17,13 @@ ${sa.top.version} ``` + +``` gradle +// 在 thymeleaf 标签中使用 Sa-Token +implementation 'cn.dev33:sa-token-dialect-thymeleaf:${sa.top.version}' +``` + + ### 2、注册标签方言对象 diff --git a/sa-token-doc/sso/sso-check-domain.md b/sa-token-doc/sso/sso-check-domain.md index 686c9bc2..96caff48 100644 --- a/sa-token-doc/sso/sso-check-domain.md +++ b/sa-token-doc/sso/sso-check-domain.md @@ -21,7 +21,23 @@ 造成此漏洞的直接原因就是SSO-Server认证中心没有对 `redirect地址` 进行任何的限制,防范的方法也很简单,就是对`redirect参数`进行校验,如果其不在指定的URL列表中时,拒绝下放ticket -我们将其配置为一个具体的URL:`allow-url=http://sa-sso-client1.com:9001/sso/login`,再次访问上述连接: +我们将其配置为一个具体的URL: + + +``` yaml +sa-token: + sso: + # 配置允许单点登录的 url + allow-url: http://sa-sso-client1.com:9001/sso/login +``` + +``` properties +# 配置允许单点登录的 url +sa-token.sso.allow-url=http://sa-sso-client1.com:9001/sso/login +``` + + +再次访问上述链接: ![sso-feifa-rf](https://oss.dev33.cn/sa-token/doc/sso/sso-feifa-rf.png 's-w-sh') diff --git a/sa-token-doc/sso/sso-h5.md b/sa-token-doc/sso/sso-h5.md index 4b2ca2ee..e779ab7e 100644 --- a/sa-token-doc/sso/sso-h5.md +++ b/sa-token-doc/sso/sso-h5.md @@ -118,12 +118,21 @@ public class H5Controller { 复制上述地址,将其配置到 Client 端的 yml 配置文件中,例如: -``` yml -sa-token: - sso: + + +``` yaml +sa-token: + sso: # SSO-Server端 统一认证地址 auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html ``` + +``` properties +# SSO-Server端 统一认证地址 +sa-token.sso.auth-url=http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html +``` + + 然后我们启动项目 `sa-token-demo-sso-server` 与 `sa-token-demo-sso2-client`,按照之前的测试步骤访问: [http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/),即可以前后端分离模式完成 SSO-Server 端的授权登录。 diff --git a/sa-token-doc/sso/sso-server.md b/sa-token-doc/sso/sso-server.md index b0a91c64..7588c5e9 100644 --- a/sa-token-doc/sso/sso-server.md +++ b/sa-token-doc/sso/sso-server.md @@ -9,8 +9,10 @@ ### 1、添加依赖 创建 SpringBoot 项目 `sa-token-demo-sso-server`,引入依赖: -``` xml - + + +``` xml + cn.dev33 sa-token-spring-boot-starter @@ -48,6 +50,27 @@ 3.1.1 ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// 视图引擎(在前后端不分离模式下提供视图支持) +implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + +// Http请求工具(在模式三的单点注销功能下用到,如不需要可以注释掉) +implementation 'com.ejlchina:okhttps:3.1.1' +``` + + + 除了 `sa-token-spring-boot-starter` 和 `sa-token-sso` 以外,其它包都是可选的: - 在 SSO 模式三时 Redis 相关包是可选的 @@ -133,6 +156,10 @@ public class GlobalExceptionHandler { ### 3、application.yml配置 + + + + ``` yml # 端口 server: @@ -140,9 +167,9 @@ server: # Sa-Token 配置 sa-token: - # -------------- SSO-模式一相关配置 (非模式一不需要配置) + # ------- SSO-模式一相关配置 (非模式一不需要配置) # cookie: - # 配置Cookie作用域 + # 配置 Cookie 作用域 # domain: stp.com # ------- SSO-模式二相关配置 @@ -154,7 +181,7 @@ sa-token: # 是否打开单点注销功能 is-slo: true - # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) ------- + # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) # 是否打开模式三 isHttp: true # 接口调用秘钥(用于SSO模式三的单点注销功能) @@ -173,8 +200,46 @@ spring: # Redis服务器连接密码(默认为空) password: ``` + +``` properties +# 端口 +server.port=9000 -注意点:`allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项) +################## Sa-Token 配置 ################## +# ------- SSO-模式一相关配置 (非模式一不需要配置) +# 配置 Cookie 作用域 +# sa-token.cookie.domain=stp.com + +# ------- SSO-模式二相关配置 +# Ticket有效期 (单位: 秒),默认五分钟 +sa-token.sso.ticket-timeout=300 +# 所有允许的授权回调地址 +sa-token.sso.allow-url=* +# 是否打开单点注销功能 +sa-token.sso.is-slo=true + +# ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开) +# 是否打开模式三 +sa-token.sso.isHttp=true +# 接口调用秘钥(用于SSO模式三的单点注销功能) +sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor + +# ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明) + +################## Redis配置 (SSO模式一和模式二使用Redis来同步会话) ################## +# Redis数据库索引(默认为0) +spring.redis.database=1 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +``` + + + +注意点:`sa-token.sso.allow-url`为了方便测试配置为`*`,线上生产环境一定要配置为详细URL地址 (之后的章节我们会详细阐述此配置项) ### 4、创建启动类 diff --git a/sa-token-doc/sso/sso-type1.md b/sa-token-doc/sso/sso-type1.md index da45b819..441d551f 100644 --- a/sa-token-doc/sso/sso-type1.md +++ b/sa-token-doc/sso/sso-type1.md @@ -41,12 +41,20 @@ OK,所有理论就绪,下面开始实战: ### 3、指定Cookie的作用域 在`sso.stp.com`访问服务器,其Cookie也只能写入到`sso.stp.com`下,为了将Cookie写入到其父级域名`stp.com`下,我们需要更改 SSO-Server 端的 yml 配置: -``` yml -sa-token: - cookie: - # 配置Cookie作用域 - domain: stp.com + + +``` yaml +sa-token: + cookie: + # 配置 Cookie 作用域 + domain: stp.com ``` + +``` properties +# 配置 Cookie 作用域 +sa-token.cookie.domain=stp.com +``` + 这个配置原本是被注释掉的,现在将其打开。另外我们格外需要注意: 在SSO模式一测试完毕之后,一定要将这个配置再次注释掉,因为模式一与模式二三使用不同的授权流程,这行配置会影响到我们模式二和模式三的正常运行。 @@ -62,12 +70,14 @@ sa-token: #### 4.1、引入依赖 新建项目 sa-token-demo-sso1-client,并添加以下依赖: -``` xml + + +``` xml cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa.top.version} @@ -80,7 +90,7 @@ sa-token: cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa.top.version} org.apache.commons @@ -91,9 +101,25 @@ sa-token: cn.dev33 sa-token-alone-redis - ${sa-token-version} + ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// Sa-Token插件:权限缓存与业务缓存分离 +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + #### 4.2、新建 Controller 控制器 @@ -130,12 +156,14 @@ public class SsoClientController { #### 4.3、application.yml 配置 -``` yml + + +``` yaml # 端口 server: port: 9001 -# sa-token配置 +# Sa-Token 配置 sa-token: # SSO-相关配置 sso: @@ -144,7 +172,7 @@ sa-token: # SSO-Server端-单点注销地址 slo-url: http://sso.stp.com:9000/sso/logout - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) alone-redis: # Redis数据库索引 database: 1 @@ -157,6 +185,32 @@ sa-token: # 连接超时时间 timeout: 10s ``` + +``` properties +# 端口 +server.port=9001 + +######### Sa-Token 配置 ######### + +# SSO-Server端-单点登录授权地址 +sa-token.sso.auth-url=http://sso.stp.com:9000/sso/auth +# SSO-Server端-单点注销地址 +sa-token.sso.slo-url=http://sso.stp.com:9000/sso/logout + +# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) +# Redis数据库索引 +sa-token.alone-redis.database=1 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s +``` + + #### 4.4、启动类 diff --git a/sa-token-doc/sso/sso-type2.md b/sa-token-doc/sso/sso-type2.md index 32365880..159b9be9 100644 --- a/sa-token-doc/sso/sso-type2.md +++ b/sa-token-doc/sso/sso-type2.md @@ -49,20 +49,29 @@ #### 3.1、去除 SSO-Server 的 Cookie 作用域配置 在SSO模式一章节中我们打开了配置: - -``` yml + + +``` yaml sa-token: - cookie: - # 配置Cookie作用域 - domain: stp.com + cookie: + # 配置 Cookie 作用域 + domain: stp.com ``` + +``` properties +# 配置 Cookie 作用域 +sa-token.cookie.domain=stp.com +``` + -此为模式一专属配置,现在我们将其注释掉,并按照注释提示打开其他相应的注释 +此为模式一专属配置,现在我们将其注释掉 #### 3.2、创建 SSO-Client 端项目 -创建一个 SpringBoot 项目 `sa-token-demo-sso-client`,引入依赖: -``` xml +创建一个 SpringBoot 项目 `sa-token-demo-sso2-client`,引入依赖: + + +``` xml cn.dev33 @@ -94,6 +103,22 @@ sa-token: ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' + +// Sa-Token 插件:整合SSO +implementation 'cn.dev33:sa-token-sso:${sa.top.version}' + +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +implementation 'org.apache.commons:commons-pool2' + +// Sa-Token插件:权限缓存与业务缓存分离 +implementation 'cn.dev33:sa-token-alone-redis:${sa.top.version}' +``` + #### 3.3、创建 SSO-Client 端认证接口 @@ -134,31 +159,62 @@ public class SsoClientController { ##### 3.4、配置SSO认证中心地址 你需要在 `application.yml` 配置如下信息: -``` yml + + + +``` yaml # 端口 server: port: 9001 - + # sa-token配置 sa-token: - # SSO-相关配置 - sso: - # SSO-Server端 统一认证地址 - auth-url: http://sa-sso-server.com:9000/sso/auth + # SSO-相关配置 + sso: + # SSO-Server端 统一认证地址 + auth-url: http://sa-sso-server.com:9000/sso/auth # 是否打开单点注销接口 is-slo: true - - # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) - alone-redis: - # Redis数据库索引 (默认为0) - database: 1 - # Redis服务器地址 - host: 127.0.0.1 - # Redis服务器连接端口 - port: 6379 - # Redis服务器连接密码(默认为空) - password: + + # 配置Sa-Token单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) + alone-redis: + # Redis数据库索引 (默认为0) + database: 1 + # Redis服务器地址 + host: 127.0.0.1 + # Redis服务器连接端口 + port: 6379 + # Redis服务器连接密码(默认为空) + password: + # 连接超时时间 + timeout: 10s ``` + +``` properties +# 端口 +server.port=9001 + +######### Sa-Token 配置 ######### +# SSO-Server端 统一认证地址 +sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth +# 是否打开单点注销接口 +sa-token.sso.is-slo=true + +# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis) +# Redis数据库索引 +sa-token.alone-redis.database=1 +# Redis服务器地址 +sa-token.alone-redis.host=127.0.0.1 +# Redis服务器连接端口 +sa-token.alone-redis.port=6379 +# Redis服务器连接密码(默认为空) +sa-token.alone-redis.password= +# 连接超时时间 +sa-token.alone-redis.timeout=10s +``` + + + 注意点:`sa-token.alone-redis` 的配置需要和SSO-Server端连接同一个Redis(database也要一样) #### 3.5、写启动类 diff --git a/sa-token-doc/sso/sso-type3.md b/sa-token-doc/sso/sso-type3.md index 4ebf827b..cb427b65 100644 --- a/sa-token-doc/sso/sso-type3.md +++ b/sa-token-doc/sso/sso-type3.md @@ -21,6 +21,9 @@ ### 2、在Client 端更改 Ticket 校验方式 #### 2.1、增加 pom.xml 配置 + + + ``` xml @@ -29,6 +32,14 @@ 3.1.1 ``` + +``` gradle +// Http请求工具 +implementation 'com.ejlchina:okhttps:3.1.1' +``` + + + > OkHttps是一个轻量级http请求工具,详情参考:[OkHttps](https://gitee.com/ejlchina-zhxu/okhttps) #### 2.2、配置 http 请求处理器 @@ -48,14 +59,25 @@ private void configSso(SaSsoConfig sso) { ``` #### 2.3、application.yml 新增配置 -``` yml + + + +``` yaml sa-token: - sso: + sso: # 打开模式三(使用Http请求校验ticket) is-http: true - # SSO-Server端 ticket校验地址 - check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket + # SSO-Server端 ticket校验地址 + check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket ``` + +``` properties +# 打开模式三(使用Http请求校验ticket) +sa-token.sso.is-http=true +# SSO-Server端 ticket校验地址 +sa-token.sso.check-ticket-url=http://sa-sso-server.com:9000/sso/checkTicket +``` + #### 2.4、启动项目测试 重启项目,访问测试:[http://sa-sso-client1.com:9001/](http://sa-sso-client1.com:9001/) @@ -87,13 +109,23 @@ public Object userinfo(String loginId) { ``` #### 3.2、在 Client 端调用此接口查询 userinfo -首先在yml中配置接口地址 -``` yml +首先在 application.yml 中配置接口地址: + + +``` yaml sa-token: sso: # SSO-Server端 查询userinfo地址 userinfo-url: http://sa-sso-server.com:9000/sso/userinfo ``` + +``` properties +# SSO-Server端 查询userinfo地址 +sa-token.sso.userinfo-url=http://sa-sso-server.com:9000/sso/userinfo +``` + + + 然后在`SsoClientController`中新增接口 ``` java @@ -181,7 +213,10 @@ public Object myFollowList() { #### 5.1、SSO-Client 端新增配置 在 `application.yml` 增加配置:`API调用秘钥` 和 `单点注销接口URL`。 -``` yml + + + +``` yaml sa-token: sso: # 打开单点注销功能 @@ -191,6 +226,18 @@ sa-token: # 接口调用秘钥 secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor ``` + +``` properties +# 打开单点注销功能 +sa-token.sso.is-slo=true +# 单点注销地址 +sa-token.sso.slo-url=http://sa-sso-server.com:9000/sso/logout +# 接口调用秘钥 +sa-token.sso.secretkey=kQwIOrYvnXmSDkwEiFngrKidMcdrgKor +``` + + + 注意 secretkey 秘钥需要与SSO认证中心的一致 diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md index f885be05..045efb0a 100644 --- a/sa-token-doc/start/download.md +++ b/sa-token-doc/start/download.md @@ -105,42 +105,42 @@ ## Gradle依赖 -``` xml +``` gradle implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-solon-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-jfinal-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-jboot-plugin:${sa.top.version}' ``` -``` xml +``` gradle implementation 'io.quarkiverse.satoken:quarkus-satoken-resteasy:1.30.0' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-servlet:${sa.top.version}' ``` -``` xml +``` gradle implementation 'cn.dev33:sa-token-core:${sa.top.version}' ``` diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index d2f9830f..0059f1b0 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -11,16 +11,26 @@ ### 2、添加依赖 -在 `pom.xml` 中添加依赖: +在项目中添加依赖: + + ``` xml - + cn.dev33 sa-token-spring-boot-starter ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' +``` + + + 更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) @@ -28,10 +38,10 @@ Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev3 ### 3、设置配置文件 你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架: - + -``` java +``` yaml server: # 端口 port: 8081 @@ -55,7 +65,7 @@ sa-token: ``` -``` java +``` properties server: # 端口 port: 8081 @@ -78,7 +88,7 @@ sa-token.token-style=uuid sa-token.is-log=false ``` - + ### 4、创建启动类 diff --git a/sa-token-doc/start/webflux-example.md b/sa-token-doc/start/webflux-example.md index 7ac19e56..0c46033a 100644 --- a/sa-token-doc/start/webflux-example.md +++ b/sa-token-doc/start/webflux-example.md @@ -14,16 +14,26 @@ ### 2、添加依赖 -在 `pom.xml` 中添加依赖: +在项目中添加依赖: + + ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter ${sa.top.version} ``` + +``` gradle +// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' +``` + + + ### 3、创建启动类 @@ -54,7 +64,7 @@ public class SaTokenConfigure { public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 指定 [拦截路由] - .addInclude("/**") + .addInclude("/**") /* 拦截所有path */ // 指定 [放行路由] .addExclude("/favicon.ico") // 指定[认证函数]: 每次请求执行 diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css index 4da3b9d1..2ec73991 100644 --- a/sa-token-doc/static/doc.css +++ b/sa-token-doc/static/doc.css @@ -106,7 +106,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .code-line-box {line-height: inherit !important; background-color: #191919; color: #aaa;font-weight: 400;font-size: 0.85em;text-align: center;} /* xml语言样式优化 */ -.lang-xml .token.comment{color: #CDAB53;} +/* .lang-xml .token.comment{color: #CDAB53;} */ .lang-xml .token.tag *{color: #db2d20;} .lang-xml .token.attr-value{color: #A6E22E;} @@ -123,24 +123,23 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .lang-java .token.keyword{color: #db2d20;} .lang-java .token.namespace,.lang-java .token.namespace *{color: #01A252; opacity: 1;} .lang-java .token.class-name,.lang-java .cm-variable{color: #55b5db; opacity: 1;} -.lang-java .token.comment{color: #CDAB53;} +/* .lang-java .token.comment{color: #CDAB53;} */ .lang-java .token.annotation.punctuation{color: #ddd;} .lang-java .token.punctuation{color: #ddd;} -/* yml语言样式优化 */ -.main-box .lang-yml{color: #01A252 !important; opacity: 1;} +/* cmd语言样式优化 */ +.main-box .lang-cmd{color: #01A252 !important; opacity: 1;} -/* yml语言样式优化 */ +/* url语言样式优化 */ .main-box .lang-url{color: #E96917 !important; opacity: 1;} /* js语言样式优化 */ .main-box .lang-js{color: #01a252 !important;} -.lang-js .token.comment{color: #CDAB53;} +/* .lang-js .token.comment{color: #CDAB53;} */ /* .lang-js .token.string{color: #fded02;} */ .lang-js .token.string{color: #ddd;} .lang-js .token.punctuation{color: #ddd;} -/* .gt-container{padding: 1.5em; padding-bottom: 100px;} */ /* ------- markdown 内容样式优化 ------- */ @@ -162,8 +161,14 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .gzh-table td b{display: block; margin-bottom: 10px; } /* tab选项卡优化 */ +/* .docsify-tabs--classic{background-color: rgba(255, 255, 255, 0.2);} */ .docsify-tabs__tab{outline: 0; cursor: pointer;} .docsify-tabs--classic .docsify-tabs__tab--active{box-shadow: 0 0 0;} +/* tab卡片插件样式优化 */ +.main-box{ + --docsifytabs-border-color: #ddd; + --docsifytabs-tab-color: #777; +} /* 调整表格的响应式 */ @@ -209,6 +214,7 @@ body { #main .toc-box a{border-color: rgba(0,0,0,0); transition: 0s;} #main .toc-box a span{color: inherit;} + /* 加载图片的按钮 */ .show-img{ background-color: #FFF; diff --git a/sa-token-doc/static/prism/prism-gradle.min.js b/sa-token-doc/static/prism/prism-gradle.min.js new file mode 100644 index 00000000..96aae9aa --- /dev/null +++ b/sa-token-doc/static/prism/prism-gradle.min.js @@ -0,0 +1 @@ +!function(e){var n={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.gradle=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("gradle","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:n,string:/[\s\S]+/}}}),e.languages.insertBefore("gradle","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("gradle","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),n.inside.expression.inside=e.languages.gradle}(Prism); \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-java.min.js b/sa-token-doc/static/prism/prism-java.min.js new file mode 100644 index 00000000..9b90cf3c --- /dev/null +++ b/sa-token-doc/static/prism/prism-java.min.js @@ -0,0 +1 @@ +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-properties.min.js b/sa-token-doc/static/prism/prism-properties.min.js new file mode 100644 index 00000000..5976d476 --- /dev/null +++ b/sa-token-doc/static/prism/prism-properties.min.js @@ -0,0 +1 @@ +Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,value:{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,lookbehind:!0,alias:"attr-value"},key:{pattern:/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,alias:"attr-name"},punctuation:/[=:]/}; \ No newline at end of file diff --git a/sa-token-doc/static/prism/prism-yaml.min.js b/sa-token-doc/static/prism/prism-yaml.min.js new file mode 100644 index 00000000..5cd16d3d --- /dev/null +++ b/sa-token-doc/static/prism/prism-yaml.min.js @@ -0,0 +1 @@ +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); \ No newline at end of file diff --git a/sa-token-doc/up/global-filter.md b/sa-token-doc/up/global-filter.md index 816892f4..d305f2bf 100644 --- a/sa-token-doc/up/global-filter.md +++ b/sa-token-doc/up/global-filter.md @@ -23,7 +23,6 @@ Sa-Token同时提供过滤器和拦截器机制,不是为了让谁替代谁, ``` java /** * [Sa-Token 权限认证] 配置类 - * @author kong */ @Configuration public class SaTokenConfigure { @@ -36,7 +35,7 @@ public class SaTokenConfigure { return new SaServletFilter() // 指定 拦截路由 与 放行路由 - .addInclude("/**").addExclude("/favicon.ico") + .addInclude("/**").addExclude("/favicon.ico") /* 排除掉 /favicon.ico */ // 认证函数: 每次请求执行 .setAuth(obj -> { @@ -45,7 +44,7 @@ public class SaTokenConfigure { // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录 SaRouter.match("/**", "/user/doLogin", () -> StpUtil.checkLogin()); - // 更多拦截处理方式,请参考“路由拦截式鉴权”章节 + // 更多拦截处理方式,请参考“路由拦截式鉴权”章节 */ }) // 异常处理函数:每次认证函数发生异常时执行此函数 @@ -97,7 +96,6 @@ JSON 工具类可参考:[Hutool-Json](https://hutool.cn/docs/#/json/JSONUtil) ``` java /** * [Sa-Token 权限认证] 配置类 - * @author kong */ @Configuration public class SaTokenConfigure { diff --git a/sa-token-doc/up/integ-redis.md b/sa-token-doc/up/integ-redis.md index ae942232..43d66bb8 100644 --- a/sa-token-doc/up/integ-redis.md +++ b/sa-token-doc/up/integ-redis.md @@ -14,6 +14,9 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 --- ### 方式1、Sa-Token 整合 Redis (使用 jdk 默认序列化方式) + + + ``` xml @@ -22,10 +25,20 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jdk 默认序列化方式) +implementation 'cn.dev33:sa-token-dao-redis:${sa.top.version}' +``` + + 优点:兼容性好,缺点:Session 序列化后基本不可读,对开发者来讲等同于乱码。 ### 方式2、Sa-Token 整合 Redis(使用 jackson 序列化方式) + + + ``` xml @@ -34,6 +47,13 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 ${sa.top.version} ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'cn.dev33:sa-token-dao-redis-jackson:${sa.top.version}' +``` + + 优点:Session 序列化后可读性强,可灵活手动修改,缺点:兼容性稍差。 @@ -41,18 +61,30 @@ Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且 **1. 无论使用哪种序列化方式,你都必须为项目提供一个 Redis 实例化方案,例如:** -``` xml + + + +``` xml org.apache.commons commons-pool2 ``` + +``` gradle +// Sa-Token 整合 Redis (使用 jackson 序列化方式) +implementation 'org.apache.commons:commons-pool2' +``` + + **2. 引入了依赖,我还需要为 Redis 配置连接信息吗?**
需要!只有项目初始化了正确的 Redis 实例,`Sa-Token`才可以使用 Redis 进行数据持久化,参考以下`yml配置`: -``` java -# 端口 + + + +``` yaml spring: # redis配置 redis: @@ -77,6 +109,30 @@ spring: # 连接池中的最小空闲连接 min-idle: 0 ``` + +``` properties +# Redis数据库索引(默认为0) +spring.redis.database=1 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +# spring.redis.password= +# 连接超时时间 +spring.redis.timeout=10s +# 连接池最大连接数 +spring.redis.lettuce.pool.max-active=200 +# 连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.lettuce.pool.max-wait=-1ms +# 连接池中的最大空闲连接 +spring.redis.lettuce.pool.max-idle=10 +# 连接池中的最小空闲连接 +spring.redis.lettuce.pool.min-idle=0 +``` + + + **3. 集成 Redis 后,是我额外手动保存数据,还是框架自动保存?**
diff --git a/sa-token-doc/up/token-prefix.md b/sa-token-doc/up/token-prefix.md index 7d88a46c..390e4f54 100644 --- a/sa-token-doc/up/token-prefix.md +++ b/sa-token-doc/up/token-prefix.md @@ -13,11 +13,21 @@ 此时后端如果不做任何特殊处理,框架将会把`Bearer `视为token的一部分,无法正常读取token信息,导致鉴权失败。 为此,我们需要在yml中添加如下配置: -``` java + + + +``` yaml sa-token: # token前缀 token-prefix: Bearer ``` + +``` properties +# token前缀 +sa-token.token-prefix: Bearer +``` + + 此时 Sa-Token 便可在读取 Token 时裁剪掉 `Bearer`,成功获取`xxxx-xxxx-xxxx-xxxx`。 diff --git a/sa-token-doc/up/token-style.md b/sa-token-doc/up/token-style.md index 8cbc31da..78f9620a 100644 --- a/sa-token-doc/up/token-style.md +++ b/sa-token-doc/up/token-style.md @@ -59,7 +59,7 @@ public class SaTokenConfigure { ``` 2、再次调用 `StpUtil.login(10001)`方法进行登录,观察其生成的token样式: -``` html +``` java gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH ``` diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index d5455054..40db73b8 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -6,10 +6,10 @@ ### 方式1、在 application.yml 配置 - + - -``` java + +``` yaml ############## Sa-Token 配置 ############## ############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## sa-token: @@ -29,8 +29,8 @@ sa-token: is-log: false ``` - -``` java + +``` properties ############## Sa-Token 配置 ############## ############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## @@ -50,7 +50,7 @@ sa-token.token-style=uuid sa-token.is-log=false ``` - + @@ -181,7 +181,10 @@ Client 端: 配置示例: -``` yml + + + +``` yaml # Sa-Token 配置 sa-token: # SSO-相关配置 @@ -189,6 +192,13 @@ sa-token: # SSO-Server端 单点登录授权地址 auth-url: http://sa-sso-server.com:9000/sso/auth ``` + +``` properties +# SSO-Server端 单点登录授权地址 +sa-token.sso.auth-url=http://sa-sso-server.com:9000/sso/auth +``` + + @@ -207,7 +217,9 @@ sa-token: | pastClientTokenTimeout | long | 7200 | `Past-Client-Token` 保存的时间(单位:秒) ,默认为-1,代表延续 `Client-Token` 的有效时间 | 配置示例: -``` yml + + +``` yaml # Sa-Token 配置 sa-token: token-name: satoken-server @@ -218,6 +230,18 @@ sa-token: is-password: true is-client: true ``` + +``` properties +# Sa-Token 配置 +sa-token.token-name=satoken-server +# OAuth2.0 配置 +sa-token.oauth2.is-code=true +sa-token.oauth2.is-implicit=true +sa-token.oauth2.is-password=true +sa-token.oauth2.is-client=true +``` + + ##### SaClientModel属性定义 | 参数名称 | 类型 | 默认值 | 说明 | @@ -300,30 +324,24 @@ sa-token: 在开发 SSO 模块时,我们需要在 sso-client 配置认证中心的各种地址,特别是在模式三下,一般代码会变成这样: -``` java +``` yaml sa-token: sso: # SSO-Server端 统一认证地址 auth-url: http://sa-sso-server.com:9000/sso/auth - # 使用Http请求校验ticket - is-http: true # SSO-Server端 ticket校验地址 check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket # 单点注销地址 slo-url: http://sa-sso-server.com:9000/sso/logout - # 接口调用秘钥 - secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor # SSO-Server端 查询userinfo地址 userinfo-url: http://sa-sso-server.com:9000/sso/userinfo ``` 一堆 xxx-url 配置比较繁琐,且含有大量重复字符,现在我们可以将其简化为: -``` java +``` yaml sa-token: sso: server-url: http://sa-sso-server.com:9000 - is-http: true - secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor ``` 只要你配置了 `server-url` 地址,Sa-Token 就可以自动拼接出其它四个地址: diff --git a/sa-token-doc/use/route-check.md b/sa-token-doc/use/route-check.md index f515f7d6..2ce32104 100644 --- a/sa-token-doc/use/route-check.md +++ b/sa-token-doc/use/route-check.md @@ -44,7 +44,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { registry.addInterceptor(new SaInterceptor(handler -> { // 指定一条 match 规则 SaRouter - .match("/**") // 拦截的 path 列表,可以写多个 + .match("/**") // 拦截的 path 列表,可以写多个 */ .notMatch("/user/doLogin") // 排除掉的 path 列表,可以写多个 .check(r -> StpUtil.checkLogin()); // 要执行的校验动作,可以写完整的 lambda 表达式 From 7d41430a5f3a12e1d99f8286991b19d562689488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=94=E6=98=8E?= <2393584716@qq.com> Date: Thu, 20 Oct 2022 14:25:34 +0000 Subject: [PATCH 06/16] update sa-token-doc/start/example.md. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 孔明 <2393584716@qq.com> --- sa-token-doc/start/example.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index 0059f1b0..889995b2 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -66,9 +66,8 @@ sa-token: ``` properties -server: - # 端口 - port: 8081 +# 端口 +server.port=8081 ############## Sa-Token 配置 ############## From fe9aebc5cfb7eb99a453c24f1f266a50155b6e18 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Oct 2022 22:38:08 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E9=85=8D=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/static/doc.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sa-token-doc/static/doc.css b/sa-token-doc/static/doc.css index 2ec73991..dca40bfb 100644 --- a/sa-token-doc/static/doc.css +++ b/sa-token-doc/static/doc.css @@ -140,6 +140,9 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu .lang-js .token.string{color: #ddd;} .lang-js .token.punctuation{color: #ddd;} +/* yaml 和 properties 语言优化 */ +.lang-yaml .token.punctuation{color: #eee;} +.lang-properties .token.attr-name{color: #22a2c9;} /* ------- markdown 内容样式优化 ------- */ From 6592b625233efa2e6ecfe7827700d850fbd3145e Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 11:27:29 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.md | 2 +- .github/ISSUE_TEMPLATE.md | 2 +- README.md | 43 +++++---- .../dev33/satoken/config/SaTokenConfig.java | 2 +- .../cn/dev33/satoken/util/SaTokenConsts.java | 2 +- .../sa-token-demo-alone-redis/pom.xml | 2 +- sa-token-demo/sa-token-demo-case/pom.xml | 2 +- sa-token-demo/sa-token-demo-jwt/pom.xml | 2 +- .../sa-token-demo-oauth2-client/pom.xml | 2 +- .../src/main/resources/templates/index.html | 2 +- .../sa-token-demo-oauth2-server/pom.xml | 2 +- .../sa-token-demo-quick-login/pom.xml | 2 +- sa-token-demo/sa-token-demo-solon/pom.xml | 2 +- .../sa-token-demo-springboot-redis/pom.xml | 2 +- .../sa-token-demo-springboot/pom.xml | 2 +- .../sa-token-demo-sso-server-h5/login.js | 2 +- .../sa-token-demo-sso-server/pom.xml | 2 +- .../src/main/resources/static/sa-res/login.js | 2 +- .../sa-token-demo-sso1-client/pom.xml | 2 +- .../sa-token-demo-sso2-client/pom.xml | 2 +- .../sa-token-demo-sso3-client/pom.xml | 2 +- sa-token-demo/sa-token-demo-test/pom.xml | 2 +- .../src/main/resources/application.yml | 2 +- sa-token-demo/sa-token-demo-thymeleaf/pom.xml | 2 +- sa-token-demo/sa-token-demo-webflux/pom.xml | 2 +- .../sa-token-demo-websocket-spring/pom.xml | 2 +- sa-token-demo/sa-token-demo-websocket/pom.xml | 2 +- sa-token-doc/README.md | 88 ++++++++++--------- sa-token-doc/doc.html | 4 +- sa-token-doc/index.html | 8 +- sa-token-doc/micro/gateway-auth.md | 4 +- sa-token-doc/micro/id-token.md | 8 +- sa-token-doc/micro/import-intro.md | 8 +- sa-token-doc/oauth2/oauth2-server.md | 6 +- sa-token-doc/sso/sso-server.md | 4 +- sa-token-doc/sso/sso-type1.md | 4 +- sa-token-doc/sso/sso-type2.md | 4 +- sa-token-doc/start/download.md | 18 ++-- sa-token-doc/start/example.md | 11 ++- sa-token-doc/start/new-version.md | 4 +- sa-token-doc/start/webflux-example.md | 4 +- sa-token-doc/use/config.md | 6 +- .../src/main/resources/static/sa-res/login.js | 2 +- .../core/context/model/SaCookieTest.java | 6 +- .../satoken/core/util/SaFoxUtilTest.java | 42 ++++----- 45 files changed, 167 insertions(+), 159 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE.md b/.gitee/ISSUE_TEMPLATE.md index 17b29a20..8c2f41de 100644 --- a/.gitee/ISSUE_TEMPLATE.md +++ b/.gitee/ISSUE_TEMPLATE.md @@ -1,2 +1,2 @@ 请在以下地址复制 issue 模板进行提交: -https://sa-token.dev33.cn/doc.html#/fun/issue-template +https://sa-token.cc/doc.html#/fun/issue-template diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 17b29a20..8c2f41de 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,2 +1,2 @@ 请在以下地址复制 issue 模板进行提交: -https://sa-token.dev33.cn/doc.html#/fun/issue-template +https://sa-token.cc/doc.html#/fun/issue-template diff --git a/README.md b/README.md index 5ae7d794..f1f2d1f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- logo + logo

Sa-Token v1.31.0

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!

@@ -16,7 +16,7 @@ --- ## 前言: -- [在线文档:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) +- [在线文档:https://sa-token.cc](https://sa-token.cc) - 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。 @@ -27,26 +27,33 @@ **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 -登录认证示例: +Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要: ``` java -// 会话登录:参数指定在当前客户端登录的账号id +// 会话登录,参数填登录人的账号id StpUtil.login(10001); - -// 会话校验:在需要校验登录处调用以下方法,如果会话未登录会抛出 `NotLoginException` 异常 -StpUtil.checkLogin(); - -// 会话注销:在当前客户端退出已登录的会话 -StpUtil.logout(); ``` -踢人下线: +无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。 + +如果一个接口需要登录后才能访问,我们只需调用以下代码: + +``` java +// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常 +StpUtil.checkLogin(); +``` + +在 Sa-Token 中,大多数功能都可以一行代码解决: + +踢人下线示例: + ``` java // 将账号id为 10077 的会话踢下线 StpUtil.kickout(10077); ``` -权限认证示例: +权限认证: + ``` java // 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法 @SaCheckPermission("user:add") @@ -70,6 +77,8 @@ registry.addInterceptor(new SaInterceptor(handler -> { })).addPathPatterns("/**"); ``` +当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! + ## Sa-Token 功能模块一览 @@ -115,13 +124,13 @@ Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO | 系统架构 | 采用模式 | 简介 | 文档链接 | | :-------- | :-------- | :-------- | :-------- | -| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) | -| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) | -| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) | +| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) | +| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) | +| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) | 1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com` -2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](http://sa-token.dev33.cn/doc.html#/plugin/alone-redis) +2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](https://sa-token.cc/doc.html#/plugin/alone-redis) 3. 如果既无法做到前端同域,也无法做到后端同Redis,那么只能走模式三,Http请求获取会话(Sa-Token对SSO提供了完整的封装,你只需要按照示例从文档上复制几段代码便可以轻松集成) ## Sa-Token-OAuth2 授权认证 @@ -134,7 +143,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求 | 密码式(Password) | Client直接拿着用户的账号密码换取授权 Token | | 客户端凭证(Client Credentials)| Server 端针对 Client 级别的 Token,代表应用自身的资源授权 | -详细参考文档:[http://sa-token.dev33.cn/doc.html#/oauth2/readme](http://sa-token.dev33.cn/doc.html#/oauth2/readme) +详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme) ## 使用 Sa-Token 的开源项目 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 48b6ac71..068a4eb2 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -5,7 +5,7 @@ import java.io.Serializable; /** * Sa-Token 配置类 Model *

- * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: http://sa-token.dev33.cn/ + * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: https://sa-token.cc/ * * @author kong * diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java index ad45165d..59af034c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java @@ -30,7 +30,7 @@ public class SaTokenConsts { /** * Sa-Token 开发文档地址 */ - public static final String DEV_DOC_URL = "http://sa-token.dev33.cn"; + public static final String DEV_DOC_URL = "https://sa-token.cc"; // =================== 常量key标记 =================== diff --git a/sa-token-demo/sa-token-demo-alone-redis/pom.xml b/sa-token-demo/sa-token-demo-alone-redis/pom.xml index 4770482a..18112cde 100644 --- a/sa-token-demo/sa-token-demo-alone-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-alone-redis/pom.xml @@ -31,7 +31,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-case/pom.xml b/sa-token-demo/sa-token-demo-case/pom.xml index ed81e8c5..fc713fb2 100644 --- a/sa-token-demo/sa-token-demo-case/pom.xml +++ b/sa-token-demo/sa-token-demo-case/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-jwt/pom.xml b/sa-token-demo/sa-token-demo-jwt/pom.xml index dac7baec..d0b5b6a0 100644 --- a/sa-token-demo/sa-token-demo-jwt/pom.xml +++ b/sa-token-demo/sa-token-demo-jwt/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-oauth2-client/pom.xml b/sa-token-demo/sa-token-demo-oauth2-client/pom.xml index 6aa42c0b..eef67c6e 100644 --- a/sa-token-demo/sa-token-demo-oauth2-client/pom.xml +++ b/sa-token-demo/sa-token-demo-oauth2-client/pom.xml @@ -28,7 +28,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html index 9d5b3121..9bcfde53 100644 --- a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html +++ b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html @@ -91,7 +91,7 @@

更多资料请参考 Sa-Token 官方文档地址: -
http://sa-token.dev33.cn/ + https://sa-token.cc/

diff --git a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml index 0acb237b..a4e8beb9 100644 --- a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml +++ b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml @@ -28,7 +28,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-quick-login/pom.xml b/sa-token-demo/sa-token-demo-quick-login/pom.xml index 2d1a05ac..42e01ad3 100644 --- a/sa-token-demo/sa-token-demo-quick-login/pom.xml +++ b/sa-token-demo/sa-token-demo-quick-login/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml index 970ddb34..26c88b5c 100644 --- a/sa-token-demo/sa-token-demo-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-solon/pom.xml @@ -21,7 +21,7 @@ 1.10.4 - + cn.dev33 sa-token-solon-plugin diff --git a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml index 2fefd3c9..49fa16a4 100644 --- a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-springboot/pom.xml b/sa-token-demo/sa-token-demo-springboot/pom.xml index f52afcb2..b5fdd415 100644 --- a/sa-token-demo/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso-server-h5/login.js b/sa-token-demo/sa-token-demo-sso-server-h5/login.js index 0b87ab7c..e43a4f48 100644 --- a/sa-token-demo/sa-token-demo-sso-server-h5/login.js +++ b/sa-token-demo/sa-token-demo-sso-server-h5/login.js @@ -98,5 +98,5 @@ function getParam(name, defaultValue){ } // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-demo/sa-token-demo-sso-server/pom.xml b/sa-token-demo/sa-token-demo-sso-server/pom.xml index ce7fd481..8f8fcea6 100644 --- a/sa-token-demo/sa-token-demo-sso-server/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-server/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js index f581ee78..e474f430 100644 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js +++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js @@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){ $("[name=name]").focus(); // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-demo/sa-token-demo-sso1-client/pom.xml b/sa-token-demo/sa-token-demo-sso1-client/pom.xml index 3d02ec19..afac6355 100644 --- a/sa-token-demo/sa-token-demo-sso1-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso1-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso2-client/pom.xml b/sa-token-demo/sa-token-demo-sso2-client/pom.xml index 2c0ec337..5aa3882c 100644 --- a/sa-token-demo/sa-token-demo-sso2-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso2-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso3-client/pom.xml b/sa-token-demo/sa-token-demo-sso3-client/pom.xml index dabc819d..365eaa7c 100644 --- a/sa-token-demo/sa-token-demo-sso3-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso3-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-test/pom.xml b/sa-token-demo/sa-token-demo-test/pom.xml index d8db946a..b4c7e569 100644 --- a/sa-token-demo/sa-token-demo-test/pom.xml +++ b/sa-token-demo/sa-token-demo-test/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml index cb63067a..b38fe0af 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 8081 -# sa-token配置 +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken diff --git a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml index e11b5134..de1c725d 100644 --- a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml +++ b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml @@ -37,7 +37,7 @@ spring-boot-starter-thymeleaf - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-webflux/pom.xml b/sa-token-demo/sa-token-demo-webflux/pom.xml index 784bb3e0..e3f7d5ad 100644 --- a/sa-token-demo/sa-token-demo-webflux/pom.xml +++ b/sa-token-demo/sa-token-demo-webflux/pom.xml @@ -31,7 +31,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-reactor-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml index e9f4a5e4..5978ac6b 100644 --- a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml +++ b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml @@ -38,7 +38,7 @@ spring-boot-starter-websocket - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-websocket/pom.xml b/sa-token-demo/sa-token-demo-websocket/pom.xml index f64edcf6..558905e6 100644 --- a/sa-token-demo/sa-token-demo-websocket/pom.xml +++ b/sa-token-demo/sa-token-demo-websocket/pom.xml @@ -38,7 +38,7 @@ spring-boot-starter-websocket - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-doc/README.md b/sa-token-doc/README.md index 83c6b963..a3b1e62a 100644 --- a/sa-token-doc/README.md +++ b/sa-token-doc/README.md @@ -1,5 +1,5 @@

- logo + logo

Sa-Token v1.31.0

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
@@ -16,7 +16,7 @@ --- ## 前言:️️ -为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/), +为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[https://sa-token.cc](https://sa-token.cc), 建议收藏在浏览器书签,如果您已经身处本网站下,则请忽略此条说明。 本文档将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 `Sa-Token` 框架本身,更是绝大多数场景下权限设计的最佳实践。 @@ -27,71 +27,68 @@ **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权** 等一系列权限相关问题。 -Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证为例,你只需要: +Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要: ``` java -// 在登录时写入当前会话的账号id +// 会话登录,参数填登录人的账号id StpUtil.login(10001); +``` -// 然后在需要校验登录处调用以下方法: -// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常 +无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。 + +如果一个接口需要登录后才能访问,我们只需调用以下代码: + +``` java +// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常 StpUtil.checkLogin(); ``` -至此,我们已经借助 Sa-Token 完成登录认证! +在 Sa-Token 中,大多数功能都可以一行代码解决: -此时的你小脑袋可能飘满了问号,就这么简单?自定义 Realm 呢?全局过滤器呢?我不用写各种配置文件吗? +踢人下线示例: -没错,在 Sa-Token 中,登录认证就是如此简单,不需要任何的复杂前置工作,只需这一行简单的API调用,就可以完成会话登录认证! - -当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! - -权限认证示例(只有具备 `user:add` 权限的会话才可以进入请求) ``` java +// 将账号id为 10077 的会话踢下线 +StpUtil.kickout(10077); +``` + +权限认证: + +``` java +// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法 @SaCheckPermission("user:add") -@RequestMapping("/user/insert") public String insert(SysUser user) { - // ... - return "用户增加"; + // ... + return "用户增加"; } ``` -将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常) +路由拦截鉴权: + ``` java -// 将账号id为 10001 的会话踢下线 -StpUtil.kickout(10001); +// 根据路由划分模块,不同模块不同鉴权 +registry.addInterceptor(new SaInterceptor(handler -> { + SaRouter.match("/user/**", r -> StpUtil.checkPermission("user")); + SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin")); + SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods")); + SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders")); + SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice")); + // 更多模块... +})).addPathPatterns("/**"); ``` -在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成: -``` java -StpUtil.login(10001); // 标记当前会话登录的账号id -StpUtil.getLoginId(); // 获取当前会话登录的账号id -StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false -StpUtil.logout(); // 当前会话注销登录 -StpUtil.kickout(10001); // 将账号为10001的会话踢下线 -StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false -StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false -StpUtil.getSession(); // 获取当前账号id的Session -StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session -StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值 -StpUtil.login(10001, "PC"); // 指定设备类型登录,常用于“同端互斥登录” -StpUtil.kickout(10001, "PC"); // 指定账号指定设备类型踢下线 (不同端不受影响) -StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒 -StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常 -StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 -``` - -即使不运行测试,相信您也能意会到绝大多数 API 的用法。 - +当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! ## Sa-Token 功能一览 +Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。 + - **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录 - **权限认证** —— 权限认证、角色认证、会话二级认证 - **Session会话** —— 全端共享Session、单端独享Session、自定义Session - **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线 -- **账号封禁** —— 指定天数封禁、永久封禁、设定解封时间 +- **账号封禁** —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁 - **持久层扩展** —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失 - **分布式会话** —— 提供jwt集成、共享数据中心两种分布式会话方案 - **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证 @@ -100,13 +97,13 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 - **二级认证** —— 在已登录的基础上再次认证,保证安全性 - **Basic认证** —— 一行代码接入 Http Basic 认证 - **独立Redis** —— 将权限缓存与业务缓存分离 -- **临时Token验证** —— 解决短时间的Token授权问题 +- **临时Token认证** —— 解决短时间的Token授权问题 - **模拟他人账号** —— 实时操作任意用户状态数据 - **临时身份切换** —— 将会话身份临时切换为其它账号 - **前后台分离** —— APP、小程序等不支持Cookie的终端 - **同端互斥登录** —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录 - **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权 -- **花式token生成** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀 +- **Token风格定制** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀 - **注解式鉴权** —— 优雅的将鉴权与业务代码分离 - **路由拦截式鉴权** —— 根据路由拦截鉴权,可适配restful模式 - **自动续签** —— 提供两种Token过期策略,灵活搭配使用,还可自动续签 @@ -117,6 +114,10 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 - **开箱即用** —— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用 - **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流 +功能结构图: + +![sa-token-js](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/x/sa-token-js4.png 's-w') + ## 开源仓库 Star 趋势 @@ -133,6 +134,7 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 参考:[Sa-Token 生态](/more/link) + ## 交流群 QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index 32e5c236..6190bbf7 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -246,8 +246,8 @@ diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html index 4f62bf9f..826e9f58 100644 --- a/sa-token-doc/index.html +++ b/sa-token-doc/index.html @@ -360,7 +360,7 @@ - + @@ -533,7 +533,7 @@ @@ -655,8 +655,8 @@ diff --git a/sa-token-doc/micro/gateway-auth.md b/sa-token-doc/micro/gateway-auth.md index fc2308db..aa9c8a01 100644 --- a/sa-token-doc/micro/gateway-auth.md +++ b/sa-token-doc/micro/gateway-auth.md @@ -17,7 +17,7 @@ ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -37,7 +37,7 @@ ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) diff --git a/sa-token-doc/micro/id-token.md b/sa-token-doc/micro/id-token.md index 95c0c098..187e33a9 100644 --- a/sa-token-doc/micro/id-token.md +++ b/sa-token-doc/micro/id-token.md @@ -26,7 +26,7 @@ Sa-Token提供两种解决方案: ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -46,7 +46,7 @@ Sa-Token提供两种解决方案: ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) @@ -59,7 +59,7 @@ implementation 'org.apache.commons:commons-pool2' ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -79,7 +79,7 @@ implementation 'org.apache.commons:commons-pool2' ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) diff --git a/sa-token-doc/micro/import-intro.md b/sa-token-doc/micro/import-intro.md index 3de0327c..72389e39 100644 --- a/sa-token-doc/micro/import-intro.md +++ b/sa-token-doc/micro/import-intro.md @@ -12,7 +12,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -21,7 +21,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` @@ -29,7 +29,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -38,7 +38,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` diff --git a/sa-token-doc/oauth2/oauth2-server.md b/sa-token-doc/oauth2/oauth2-server.md index e4fc2e88..688d656d 100644 --- a/sa-token-doc/oauth2/oauth2-server.md +++ b/sa-token-doc/oauth2/oauth2-server.md @@ -16,7 +16,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -32,7 +32,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token-OAuth2.0 模块 @@ -154,7 +154,7 @@ public class SaOAuth2ServerApplication { 1、由于暂未搭建Client端,我们可以使用Sa-Token官网作为重定向URL进行测试: ``` url -http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-token.dev33.cn/&scope=userinfo +http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=https://sa-token.cc&scope=userinfo ``` 2、由于首次访问,我们在OAuth-Server端暂未登录,会被转发到登录视图 diff --git a/sa-token-doc/sso/sso-server.md b/sa-token-doc/sso/sso-server.md index 7588c5e9..3814b582 100644 --- a/sa-token-doc/sso/sso-server.md +++ b/sa-token-doc/sso/sso-server.md @@ -12,7 +12,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -52,7 +52,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/sso/sso-type1.md b/sa-token-doc/sso/sso-type1.md index 441d551f..87520f57 100644 --- a/sa-token-doc/sso/sso-type1.md +++ b/sa-token-doc/sso/sso-type1.md @@ -73,7 +73,7 @@ sa-token.cookie.domain=stp.com ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -106,7 +106,7 @@ sa-token.cookie.domain=stp.com ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/sso/sso-type2.md b/sa-token-doc/sso/sso-type2.md index 159b9be9..9cbfe3be 100644 --- a/sa-token-doc/sso/sso-type2.md +++ b/sa-token-doc/sso/sso-type2.md @@ -72,7 +72,7 @@ sa-token.cookie.domain=stp.com ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -105,7 +105,7 @@ sa-token.cookie.domain=stp.com ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md index 045efb0a..54b5e19d 100644 --- a/sa-token-doc/start/download.md +++ b/sa-token-doc/start/download.md @@ -12,7 +12,7 @@ 如果你使用的框架基于 ServletAPI 构建( SpringMVC、SpringBoot等 ),请引入此包 ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -23,7 +23,7 @@ 注:如果你使用的框架基于 Reactor 模型构建(Netty、WebFlux、ShenYu、SC Gateway等),请引入此包 ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -34,7 +34,7 @@ 参考:[Solon官网](https://solon.noear.org/) ``` xml - + cn.dev33 sa-token-solon-plugin @@ -45,7 +45,7 @@ 参考:[JFinal官网](https://jfinal.com/) ``` xml - + cn.dev33 sa-token-jfinal-plugin @@ -56,7 +56,7 @@ 参考:[Jboot官网](http://www.jboot.com.cn/) ``` xml - + cn.dev33 sa-token-jboot-plugin @@ -67,7 +67,7 @@ 参考:[quarkus-sa-token](https://github.com/quarkiverse/quarkus-sa-token) ``` xml - + io.quarkiverse.satoken quarkus-satoken-resteasy @@ -78,7 +78,7 @@ 注:如果你的项目没有使用Spring,但是Web框架是基于 ServletAPI 规范的,可以引入此包 ``` xml - + cn.dev33 sa-token-servlet @@ -90,7 +90,7 @@ 注:如果你的项目既没有使用 SpringMVC、WebFlux,也不是基于 ServletAPI 规范,那么可以引入core核心包 ``` xml - + cn.dev33 sa-token-core @@ -152,7 +152,7 @@ implementation 'cn.dev33:sa-token-core:${sa.top.version}' ## 测试版 更多内测版本了解:[Sa-Token 最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) ## jar包下载 [点击下载:sa-token-1.6.0.jar](https://oss.dev33.cn/sa-token/sa-token-1.6.0.jar) diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index 889995b2..ebafc551 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -16,7 +16,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -25,16 +25,15 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) 更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) - ### 3、设置配置文件 你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架: @@ -46,7 +45,7 @@ server: # 端口 port: 8081 -############## Sa-Token 配置 ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken @@ -69,7 +68,7 @@ sa-token: # 端口 server.port=8081 -############## Sa-Token 配置 ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## # token名称 (同时也是cookie名称) sa-token.token-name=satoken diff --git a/sa-token-doc/start/new-version.md b/sa-token-doc/start/new-version.md index 1c4fc906..477e5649 100644 --- a/sa-token-doc/start/new-version.md +++ b/sa-token-doc/start/new-version.md @@ -1,6 +1,6 @@ # Sa-Token 最新版本 -在线文档:[https://sa-token.dev33.cn/](https://sa-token.dev33.cn/) +在线文档:[https://sa-token.cc/](https://sa-token.cc/) --- @@ -16,7 +16,7 @@ v1.31.0 正式版,可上生产: ``` -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) --- diff --git a/sa-token-doc/start/webflux-example.md b/sa-token-doc/start/webflux-example.md index 0c46033a..435c4ec6 100644 --- a/sa-token-doc/start/webflux-example.md +++ b/sa-token-doc/start/webflux-example.md @@ -19,7 +19,7 @@ ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -28,7 +28,7 @@ ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index 40db73b8..4464305f 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -10,8 +10,7 @@ ``` yaml -############## Sa-Token 配置 ############## -############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken @@ -31,8 +30,7 @@ sa-token: ``` properties -############## Sa-Token 配置 ############## -############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## # token名称 (同时也是cookie名称) sa-token.token-name=satoken diff --git a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js index 5e619d17..5d79d67a 100644 --- a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js +++ b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js @@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){ $("[name=name]").focus(); // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java index 8c223cab..207135f1 100644 --- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java +++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java @@ -16,7 +16,7 @@ public class SaCookieTest { @Test public void test() { SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx") - .setDomain("https://sa-token.dev33.cn/") + .setDomain("https://sa-token.cc/") .setMaxAge(-1) .setPath("/") .setSameSite("Lax") @@ -25,13 +25,13 @@ public class SaCookieTest { Assertions.assertEquals(cookie.getName(), "satoken"); Assertions.assertEquals(cookie.getValue(), "xxxx-xxxx-xxxx-xxxx"); - Assertions.assertEquals(cookie.getDomain(), "https://sa-token.dev33.cn/"); + Assertions.assertEquals(cookie.getDomain(), "https://sa-token.cc/"); Assertions.assertEquals(cookie.getMaxAge(), -1); Assertions.assertEquals(cookie.getPath(), "/"); Assertions.assertEquals(cookie.getSameSite(), "Lax"); Assertions.assertEquals(cookie.getHttpOnly(), true); Assertions.assertEquals(cookie.getSecure(), true); - Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.dev33.cn/; Path=/; Secure; HttpOnly; sameSite=Lax"); + Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.cc/; Path=/; Secure; HttpOnly; sameSite=Lax"); Assertions.assertNotNull(cookie.toString()); } diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java index f8e7baa6..ad9abb05 100644 --- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java +++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java @@ -166,49 +166,49 @@ public class SaFoxUtilTest { @Test public void joinParam() { // 参数为空时,返回原url - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null), "https://sa-token.cc"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", ""), "https://sa-token.cc"); // url为空时,视为空字符串 Assertions.assertEquals(SaFoxUtil.joinParam(null, "id=1"), "?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("", "id=1"), "?id=1"); // 各种情况的测试 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn?id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?", "id=1"), "https://sa-token.dev33.cn?id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id=1"), "https://sa-token.cc?id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?", "id=1"), "https://sa-token.cc?id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang", "id=1"), "https://sa-token.cc?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id=1"), "https://sa-token.cc?name=zhang&id=1"); // 重载方法测试 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id", 1), "https://sa-token.dev33.cn?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id", 1), "https://sa-token.cc?name=zhang&id=1"); // url或key为null时,不拼接 Assertions.assertEquals(SaFoxUtil.joinParam(null, "id", 1), null); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null, 1), "https://sa-token.cc"); // value为null时,会拼接出一个null字符串 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn?id=null"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id", null), "https://sa-token.cc?id=null"); } @Test public void joinSharpParam() { // 参数为空时,返回原url - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null), "https://sa-token.cc"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", ""), "https://sa-token.cc"); // url为空时,视为空字符串 Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id=1"), "#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("", "id=1"), "#id=1"); // 各种情况的测试 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn#id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#", "id=1"), "https://sa-token.dev33.cn#id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id=1"), "https://sa-token.cc#id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#", "id=1"), "https://sa-token.cc#id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang", "id=1"), "https://sa-token.cc#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id=1"), "https://sa-token.cc#name=zhang&id=1"); // 重载方法测试 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id", 1), "https://sa-token.dev33.cn#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id", 1), "https://sa-token.cc#name=zhang&id=1"); // url或key为null时,不拼接 Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id", 1), null); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null, 1), "https://sa-token.cc"); // value为null时,会拼接出一个null字符串 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn#id=null"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id", null), "https://sa-token.cc#id=null"); } @Test @@ -233,7 +233,7 @@ public class SaFoxUtilTest { @Test public void isUrl() { - Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.dev33.cn")); + Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.cc")); Assertions.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/")); Assertions.assertFalse(SaFoxUtil.isUrl(null)); @@ -246,8 +246,8 @@ public class SaFoxUtilTest { @Test public void encodeUrl() { - Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.dev33.cn"), "https%3A%2F%2Fsa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.dev33.cn"), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.cc"), "https%3A%2F%2Fsa-token.cc"); + Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.cc"), "https://sa-token.cc"); } @Test From fc200ee427be67ff267f2a871f3edf850cd274a6 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 11:28:46 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- sa-token-doc/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f1f2d1f4..9c701cfa 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ StpUtil.checkLogin(); 在 Sa-Token 中,大多数功能都可以一行代码解决: -踢人下线示例: +踢人下线: ``` java // 将账号id为 10077 的会话踢下线 diff --git a/sa-token-doc/README.md b/sa-token-doc/README.md index a3b1e62a..bf1074bf 100644 --- a/sa-token-doc/README.md +++ b/sa-token-doc/README.md @@ -45,7 +45,7 @@ StpUtil.checkLogin(); 在 Sa-Token 中,大多数功能都可以一行代码解决: -踢人下线示例: +踢人下线: ``` java // 将账号id为 10077 的会话踢下线 From a1acc1b650772cfb711384e6a6578eff4d967bcf Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 11:38:16 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/use/config.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index 4464305f..6180fad7 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -58,11 +58,12 @@ sa-token.is-log=false ``` java /** - * Sa-Token代码方式进行配置 + * Sa-Token 配置类 */ @Configuration public class SaTokenConfigure { - // 获取配置Bean (以代码的方式配置Sa-Token, 此配置会覆盖 application.yml 中的配置) + // Sa-Token 参数配置,参考文档:https://sa-token.cc + // 此配置会覆盖 application.yml 中的配置 @Bean @Primary public SaTokenConfig getSaTokenConfigPrimary() { @@ -81,11 +82,11 @@ public class SaTokenConfigure { ``` java /** - * Sa-Token代码方式进行配置 + * Sa-Token 配置类 */ @Configuration public class SaTokenConfigure { - // 以代码的方式配置 SaTokenConfig + // Sa-Token 参数配置,参考文档:https://sa-token.cc // 此配置会与 application.yml 中的配置合并 (代码配置优先) @Autowired public void configSaToken(SaTokenConfig config) { From 7703f105772a1942e73d2b423d0baea20868cd6f Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 12:40:27 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/doc.html | 2 +- sa-token-doc/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index 6190bbf7..8354e051 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -238,7 +238,7 @@ var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); - hm.src = "https://hm.baidu.com/hm.js?77d7418dd845f98ba1cfee8596eeee3f"; + hm.src = "https://hm.baidu.com/hm.js?35ad501304eae758ac6139a22a9830f5"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html index 826e9f58..b664779d 100644 --- a/sa-token-doc/index.html +++ b/sa-token-doc/index.html @@ -573,7 +573,7 @@ var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); - hm.src = "https://hm.baidu.com/hm.js?77d7418dd845f98ba1cfee8596eeee3f"; + hm.src = "https://hm.baidu.com/hm.js?35ad501304eae758ac6139a22a9830f5"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); From fa14d98462230c0c3afd39c65289c16c5e7e6f61 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 17:00:48 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B8=B8=E8=A7=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/more/common-questions.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/sa-token-doc/more/common-questions.md b/sa-token-doc/more/common-questions.md index b6ffc07f..244bc2c9 100644 --- a/sa-token-doc/more/common-questions.md +++ b/sa-token-doc/more/common-questions.md @@ -146,14 +146,32 @@ registry.addInterceptor(new SaInterceptor(handler -> { 以上代码,当你未登录访问 `/user/doLogin` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:`NotLoginException:xxx` +### Q:我在配置文件中加了一些关于 Sa-Token 的配置,但是没有生效。 +首先,有没有生效的最佳判断方式是,在main方法中加一个打印,看看打印出来的和你配置文件的一致吗: + +``` java +@SpringBootApplication +public class SaTokenApplication { + public static void main(String[] args) { + SpringApplication.run(SaTokenApplication.class, args); + System.out.println("\n启动成功:Sa-Token配置如下:" + SaManager.getConfig()); + } +} +``` + +如果不一致,请排查: +- 可能1:项目中还存在代码配置,而代码配置会覆盖 `application.yml` 中配置,详细参考:[框架配置](/use/config)。 +- 可能2:你的配置文件名字错误,SpringBoot 项目正常情况下配置文件名称应该是:`application.yml` 或 `application.properties`。 + + ### Q:有时候我不加 Token 也可以通过鉴权,请问是怎么回事? -可能1:你访问的这个接口,根本就没有鉴权的代码,所以可以安全的访问通过。 -可能2:可能是 Cookie 帮你自动提交了 Token,在浏览器或 Postman 中会自动维护Cookie模式,如不需要可以在配置文件:`is-read-cookie: false`,然后重启项目再测试一下。 +- 可能1:你访问的这个接口,根本就没有鉴权的代码,所以可以安全的访问通过。 +- 可能2:可能是 Cookie 帮你自动提交了 Token,在浏览器或 Postman 中会自动维护Cookie模式,如不需要可以在配置文件:`is-read-cookie: false`,然后重启项目再测试一下。 ### Q:一个 User 对象存进 Session 后,再取出来时报错:无法从 User 类型转换成 User 类型? -可能1:你的 User 类中途换了包名,导致存进去时和取出来时对不上,无法成功创建实例。 -可能2:你打开了代码热刷新模式,先存进去的对象,热刷新后再取出,会报错,关闭热刷新即可解决。 +- 可能1:你的 User 类中途换了包名,导致存进去时和取出来时对不上,无法成功创建实例。 +- 可能2:你打开了代码热刷新模式,先存进去的对象,热刷新后再取出,会报错,关闭热刷新即可解决。 ### Q:我配置了 active-timeout 值,但是当我每次续签时 Redis 中的 ttl 并没有更新,是不是 bug 了? From e21928183dde88ca3e9915b3e65406168f38422f Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 18:19:41 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=90=8E=E5=B0=86=20Token=20=E5=86=99=E5=85=A5=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=A4=B4=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev33/satoken/config/SaTokenConfig.java | 20 +++++ .../satoken/context/model/SaResponse.java | 5 ++ .../cn/dev33/satoken/stp/SaLoginConfig.java | 20 +++-- .../cn/dev33/satoken/stp/SaLoginModel.java | 74 +++++++++++++++++-- .../java/cn/dev33/satoken/stp/StpLogic.java | 34 ++++++++- .../java/cn/dev33/satoken/stp/StpUtil.java | 11 ++- .../java/com/pj/satoken/SaTokenConfigure.java | 20 ++++- 7 files changed, 163 insertions(+), 21 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 068a4eb2..53026e9a 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -46,6 +46,9 @@ public class SaTokenConfig implements Serializable { /** 是否尝试从cookie里读取token */ private Boolean isReadCookie = true; + /** 是否在登录后将 Token 写入到响应头 */ + private Boolean isWriteHeader = false; + /** token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ private String tokenStyle = "uuid"; @@ -240,6 +243,22 @@ public class SaTokenConfig implements Serializable { return this; } + /** + * @return 是否在登录后将 Token 写入到响应头 + */ + public Boolean getIsWriteHeader() { + return isWriteHeader; + } + + /** + * @param isWriteHeader 是否在登录后将 Token 写入到响应头 + * @return 对象自身 + */ + public SaTokenConfig setIsWriteHeader(Boolean isWriteHeader) { + this.isWriteHeader = isWriteHeader; + return this; + } + /** * @return token风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) */ @@ -462,6 +481,7 @@ public class SaTokenConfig implements Serializable { + ", isReadBody=" + isReadBody + ", isReadHeader=" + isReadHeader + ", isReadCookie=" + isReadCookie + + ", isWriteHeader=" + isWriteHeader + ", tokenStyle=" + tokenStyle + ", dataRefreshPeriod=" + dataRefreshPeriod + ", tokenSessionCheckLogin=" + tokenSessionCheckLogin diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java index 9718f9e5..99984369 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java @@ -7,6 +7,11 @@ package cn.dev33.satoken.context.model; */ public interface SaResponse { + /** + * 指定前端可以获取到哪些响应头时使用的参数名 + */ + public static final String ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers"; + /** * 获取底层源对象 * @return see note diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java index 1c70bdca..e25b7ebf 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java @@ -16,7 +16,7 @@ public class SaLoginConfig { /** * @param device 此次登录的客户端设备类型 - * @return SaLoginModel配置对象 + * @return 登录参数 Model */ public static SaLoginModel setDevice(String device) { return create().setDevice(device); @@ -24,7 +24,7 @@ public class SaLoginConfig { /** * @param isLastingCookie 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) - * @return 对象自身 + * @return 登录参数 Model */ public static SaLoginModel setIsLastingCookie(Boolean isLastingCookie) { return create().setIsLastingCookie(isLastingCookie); @@ -32,7 +32,7 @@ public class SaLoginConfig { /** * @param timeout 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) - * @return 对象自身 + * @return 登录参数 Model */ public static SaLoginModel setTimeout(long timeout) { return create().setTimeout(timeout); @@ -40,7 +40,7 @@ public class SaLoginConfig { /** * @param extraData 扩展信息(只在jwt模式下生效) - * @return 对象自身 + * @return 登录参数 Model */ public static SaLoginModel setExtraData(Map extraData) { return create().setExtraData(extraData); @@ -48,7 +48,7 @@ public class SaLoginConfig { /** * @param token 预定Token(预定本次登录生成的Token值) - * @return 对象自身 + * @return 登录参数 Model */ public static SaLoginModel setToken(String token) { return create().setToken(token); @@ -58,12 +58,20 @@ public class SaLoginConfig { * 写入扩展数据(只在jwt模式下生效) * @param key 键 * @param value 值 - * @return 对象自身 + * @return 登录参数 Model */ public static SaLoginModel setExtra(String key, Object value) { return create().setExtra(key, value); } + /** + * @param isWriteHeader 是否在登录后将 Token 写入到响应头 + * @return 登录参数 Model + */ + public static SaLoginModel setIsWriteHeader(Boolean isWriteHeader) { + return create().setIsWriteHeader(isWriteHeader); + } + /** * 静态方法获取一个 SaLoginModel 对象 * @return SaLoginModel 对象 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java index 9b3fe71f..0e32823d 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java @@ -23,7 +23,7 @@ public class SaLoginModel { /** * 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) */ - public Boolean isLastingCookie; + public Boolean isLastingCookie = true; /** * 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) @@ -39,6 +39,9 @@ public class SaLoginModel { * 预定Token(预定本次登录生成的Token值) */ public String token; + + /** 是否在登录后将 Token 写入到响应头 */ + private Boolean isWriteHeader; /** @@ -58,12 +61,22 @@ public class SaLoginModel { } /** - * @return 参考 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) + * @return 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) */ public Boolean getIsLastingCookie() { return isLastingCookie; } + /** + * @return 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) + */ + public Boolean getIsLastingCookieOrFalse() { + if(isLastingCookie == null) { + return false; + } + return isLastingCookie; + } + /** * @param isLastingCookie 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) * @return 对象自身 @@ -121,13 +134,45 @@ public class SaLoginModel { return this; } + /** + * @return 是否在登录后将 Token 写入到响应头 + */ + public Boolean getIsWriteHeader() { + return isWriteHeader; + } + + /** + * @return 是否在登录后将 Token 写入到响应头 + */ + public Boolean getIsWriteHeaderOrFalse() { + if(isWriteHeader == null) { + return false; + } + return isWriteHeader; + } + + /** + * @param isWriteHeader 是否在登录后将 Token 写入到响应头 + * @return 对象自身 + */ + public SaLoginModel setIsWriteHeader(Boolean isWriteHeader) { + this.isWriteHeader = isWriteHeader; + return this; + } + /* * toString */ @Override public String toString() { - return "SaLoginModel [device=" + device + ", isLastingCookie=" + isLastingCookie + ", timeout=" + timeout - + ", extraData=" + extraData + ", token=" + token + "]"; + return "SaLoginModel [" + + "device=" + device + + ", isLastingCookie=" + isLastingCookie + + ", timeout=" + timeout + + ", extraData=" + extraData + + ", token=" + token + + ", isWriteHeader=" + isWriteHeader + + "]"; } // ------ 附加方法 @@ -174,9 +219,10 @@ public class SaLoginModel { * @return Cookie时长 */ public int getCookieTimeout() { - if(isLastingCookie == false) { + if(getIsLastingCookieOrFalse() == false) { return -1; } + initTimeout(); if(timeout == SaTokenDao.NEVER_EXPIRE) { return Integer.MAX_VALUE; } @@ -193,6 +239,15 @@ public class SaLoginModel { return device; } + /** + * 初始化 timeout 值 (如果尚未配置timeout,则取全局配置的值) + */ + public void initTimeout() { + if(timeout == null) { + timeout = SaManager.getConfig().getTimeout(); + } + } + /** * 构建对象,初始化默认值 * @return 对象自身 @@ -210,12 +265,15 @@ public class SaLoginModel { // if(device == null) { // device = SaTokenConsts.DEFAULT_LOGIN_DEVICE; // } - if(isLastingCookie == null) { - isLastingCookie = true; - } +// if(isLastingCookie == null) { +// isLastingCookie = true; +// } if(timeout == null) { timeout = config.getTimeout(); } + if(isWriteHeader == null) { + isWriteHeader = config.getIsWriteHeader(); + } return this; } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index e8e1a625..af308f0e 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -17,6 +17,7 @@ import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.model.SaCookie; import cn.dev33.satoken.context.model.SaRequest; +import cn.dev33.satoken.context.model.SaResponse; import cn.dev33.satoken.context.model.SaStorage; import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.exception.ApiDisabledException; @@ -102,7 +103,7 @@ public class StpLogic { * @param tokenValue token值 */ public void setTokenValue(String tokenValue){ - setTokenValue(tokenValue, getConfigOfCookieTimeout()); + setTokenValue(tokenValue, new SaLoginModel().setTimeout(getConfig().getTimeout())); } /** @@ -111,17 +112,31 @@ public class StpLogic { * @param cookieTimeout Cookie存活时间(秒) */ public void setTokenValue(String tokenValue, int cookieTimeout){ + setTokenValue(tokenValue, new SaLoginModel().setTimeout(cookieTimeout)); + } + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + * @param loginModel 登录参数 + */ + public void setTokenValue(String tokenValue, SaLoginModel loginModel){ if(SaFoxUtil.isEmpty(tokenValue)) { return; } - // 1. 将token保存到[存储器]里 + // 1. 将 Token 保存到 [存储器] 里 setTokenValueToStorage(tokenValue); // 2. 将 Token 保存到 [Cookie] 里 if (getConfig().getIsReadCookie()) { - setTokenValueToCookie(tokenValue, cookieTimeout); + setTokenValueToCookie(tokenValue, loginModel.getCookieTimeout()); + } + + // 3. 将 Token 写入到响应头里 + if(loginModel.getIsWriteHeaderOrFalse()) { + setTokenValueToResponseHeader(tokenValue); } } @@ -164,6 +179,17 @@ public class StpLogic { ; SaHolder.getResponse().addCookie(cookie); } + + /** + * 将 Token 写入到 [响应头] 里 + * @param tokenValue token值 + */ + public void setTokenValueToResponseHeader(String tokenValue){ + String tokenName = getTokenName(); + SaResponse response = SaHolder.getResponse(); + response.setHeader(tokenName, tokenValue); + response.addHeader(SaResponse.ACCESS_CONTROL_EXPOSE_HEADERS, tokenName); + } /** * 获取当前TokenValue @@ -292,7 +318,7 @@ public class StpLogic { String token = createLoginSession(id, loginModel); // 2、在当前客户端注入Token - setTokenValue(token, loginModel.getCookieTimeout()); + setTokenValue(token, loginModel); } /** diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index 60d02e10..931d7c3a 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -83,7 +83,16 @@ public class StpUtil { public static void setTokenValue(String tokenValue, int cookieTimeout){ stpLogic.setTokenValue(tokenValue, cookieTimeout); } - + + /** + * 在当前会话写入当前TokenValue + * @param tokenValue token值 + * @param loginModel 登录参数 + */ + public static void setTokenValue(String tokenValue, SaLoginModel loginModel){ + stpLogic.setTokenValue(tokenValue, loginModel); + } + /** * 获取当前TokenValue * @return 当前tokenValue diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java index a4a4995e..00ce6931 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java @@ -8,6 +8,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.router.SaHttpMethod; +import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.util.SaResult; @@ -51,7 +53,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { }) // 前置函数:在每次认证函数之前执行 - .setBeforeAuth(r -> { + .setBeforeAuth(obj -> { // ---------- 设置一些安全响应头 ---------- SaHolder.getResponse() // 服务器名称 @@ -62,7 +64,21 @@ public class SaTokenConfigure implements WebMvcConfigurer { .setHeader("X-XSS-Protection", "1; mode=block") // 禁用浏览器内容嗅探 .setHeader("X-Content-Type-Options", "nosniff") - ; + + // ---------- 设置跨域响应头 ---------- + // 允许指定域访问跨域资源 + .setHeader("Access-Control-Allow-Origin", "*") + // 允许所有请求方式 + .setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") + // 有效时间 + .setHeader("Access-Control-Max-Age", "3600") + // 允许的header参数 + .setHeader("Access-Control-Allow-Headers", "*"); + + // 如果是预检请求,则立即返回到前端 + SaRouter.match(SaHttpMethod.OPTIONS) + .free(r -> System.out.println("--------OPTIONS预检请求,不做处理")) + .back(); }) ; } From f0186e99c42a0f8100faaca7f12aa496bca2c394 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 18:36:36 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=90=8E=E5=B0=86=20Token=20=E5=86=99=E5=85=A5=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=A4=B4=E7=9A=84=E6=96=B9=E6=B3=95..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/dev33/satoken/stp/SaLoginModel.java | 28 +++++++++---------- .../java/cn/dev33/satoken/stp/StpLogic.java | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java index 0e32823d..1813890f 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java @@ -93,6 +93,16 @@ public class SaLoginModel { return timeout; } + /** + * @return timeout 值 (如果此配置项尚未配置,则取全局配置的值) + */ + public Long getTimeoutOrGlobalConfig() { + if(timeout == null) { + timeout = SaManager.getConfig().getTimeout(); + } + return timeout; + } + /** * @param timeout 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值) * @return 对象自身 @@ -142,11 +152,11 @@ public class SaLoginModel { } /** - * @return 是否在登录后将 Token 写入到响应头 + * @return 是否在登录后将 Token 写入到响应头 (如果此配置项尚未配置,则取全局配置的值) */ - public Boolean getIsWriteHeaderOrFalse() { + public Boolean getIsWriteHeaderOrGlobalConfig() { if(isWriteHeader == null) { - return false; + isWriteHeader = SaManager.getConfig().getIsWriteHeader(); } return isWriteHeader; } @@ -222,8 +232,7 @@ public class SaLoginModel { if(getIsLastingCookieOrFalse() == false) { return -1; } - initTimeout(); - if(timeout == SaTokenDao.NEVER_EXPIRE) { + if(getTimeoutOrGlobalConfig() == SaTokenDao.NEVER_EXPIRE) { return Integer.MAX_VALUE; } return (int)(long)timeout; @@ -239,15 +248,6 @@ public class SaLoginModel { return device; } - /** - * 初始化 timeout 值 (如果尚未配置timeout,则取全局配置的值) - */ - public void initTimeout() { - if(timeout == null) { - timeout = SaManager.getConfig().getTimeout(); - } - } - /** * 构建对象,初始化默认值 * @return 对象自身 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index af308f0e..81f2dc87 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -135,7 +135,7 @@ public class StpLogic { } // 3. 将 Token 写入到响应头里 - if(loginModel.getIsWriteHeaderOrFalse()) { + if(loginModel.getIsWriteHeaderOrGlobalConfig()) { setTokenValueToResponseHeader(tokenValue); } } From 4c8be2abda3948d0b2e1d159e321904288cc71ea Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 18:41:47 +0800 Subject: [PATCH 15/16] =?UTF-8?q?is-write-header=20=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/api/stp-util.md | 1 + sa-token-doc/up/remember-me.md | 1 + sa-token-doc/use/config.md | 1 + 3 files changed, 3 insertions(+) diff --git a/sa-token-doc/api/stp-util.md b/sa-token-doc/api/stp-util.md index e7f3e5b2..966530bf 100644 --- a/sa-token-doc/api/stp-util.md +++ b/sa-token-doc/api/stp-util.md @@ -37,6 +37,7 @@ StpUtil.login(10001, new SaLoginModel() .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值) .setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录生成的Token .setExtra("name", "zhangsan") // Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效) + .setIsWriteHeader(false) // 是否在登录后将 Token 写入到响应头 ); ``` diff --git a/sa-token-doc/up/remember-me.md b/sa-token-doc/up/remember-me.md index 319b268e..d97e903e 100644 --- a/sa-token-doc/up/remember-me.md +++ b/sa-token-doc/up/remember-me.md @@ -76,6 +76,7 @@ StpUtil.login(10001, new SaLoginModel() .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在) .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值) .setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录的生成的Token + .setIsWriteHeader(false) // 是否在登录后将 Token 写入到响应头 ); ``` diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index 6180fad7..baf3d37f 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -125,6 +125,7 @@ public class SaTokenConfigure { | isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token | | isReadHeader | Boolean | true | 是否尝试从 header 里读取 Token | | isReadCookie | Boolean | true | 是否尝试从 cookie 里读取 Token,此值为 false 后,`StpUtil.login(id)` 登录时也不会再往前端注入Cookie | +| isWriteHeader | Boolean | false | 是否在登录后将 Token 写入到响应头 | | tokenStyle | String | uuid | token风格, [参考:自定义Token风格](/up/token-style) | | dataRefreshPeriod | int | 30 | 默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 | | tokenSessionCheckLogin | Boolean | true | 获取 `Token-Session` 时是否必须登录 (如果配置为true,会在每次获取 `Token-Session` 时校验是否登录),[详解](/use/config?id=配置项详解:tokenSessionCheckLogin) | From 02b55b7665816cc4e9d366b5cd562c65cffed3eb Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sat, 22 Oct 2022 05:18:08 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 17 +++++++ .../sa-token-demo-alone-redis/pom.xml | 10 ++-- sa-token-demo/sa-token-demo-case/pom.xml | 8 +-- .../sa-token-demo-dubbo-consumer/pom.xml | 8 +-- .../sa-token-demo-dubbo-provider/pom.xml | 8 +-- sa-token-demo/sa-token-demo-grpc/pom.xml | 8 +-- sa-token-demo/sa-token-demo-jwt/pom.xml | 10 ++-- .../sa-token-demo-oauth2-client/pom.xml | 6 +-- .../sa-token-demo-oauth2-server/pom.xml | 10 ++-- .../sa-token-demo-quick-login/pom.xml | 8 +-- sa-token-demo/sa-token-demo-solon/pom.xml | 12 ++--- .../sa-token-demo-springboot-redis/pom.xml | 10 ++-- .../sa-token-demo-springboot/pom.xml | 8 +-- .../sa-token-demo-sso-server/pom.xml | 10 ++-- .../sa-token-demo-sso1-client/pom.xml | 12 ++--- .../sa-token-demo-sso2-client/pom.xml | 12 ++--- .../sa-token-demo-sso3-client/pom.xml | 10 ++-- sa-token-demo/sa-token-demo-test/pom.xml | 10 ++-- sa-token-demo/sa-token-demo-thymeleaf/pom.xml | 8 +-- sa-token-demo/sa-token-demo-webflux/pom.xml | 10 ++-- .../sa-token-demo-websocket-spring/pom.xml | 8 +-- sa-token-demo/sa-token-demo-websocket/pom.xml | 8 +-- sa-token-plugin/sa-token-alone-redis/pom.xml | 2 +- .../sa-token-context-dubbo/pom.xml | 2 +- sa-token-plugin/sa-token-context-grpc/pom.xml | 2 +- sa-token-plugin/sa-token-dao-redisx/pom.xml | 4 +- .../sa-token-dialect-thymeleaf/pom.xml | 4 +- sa-token-plugin/sa-token-jwt/pom.xml | 2 +- sa-token-plugin/sa-token-quick-login/pom.xml | 2 +- sa-token-plugin/sa-token-spring-aop/pom.xml | 2 +- sa-token-plugin/sa-token-temp-jwt/pom.xml | 4 +- .../sa-token-jboot-plugin/pom.xml | 2 +- .../sa-token-jfinal-plugin/pom.xml | 2 +- .../pom.xml | 51 ++++++++++--------- sa-token-starter/sa-token-servlet/pom.xml | 5 +- .../sa-token-solon-plugin/pom.xml | 12 ++--- .../cn/dev33/satoken/solon/XPluginImp.java | 2 +- .../src/test/java/demo/Config.java | 10 ++-- .../sa-token-spring-boot-starter/pom.xml | 23 +++++---- 39 files changed, 186 insertions(+), 156 deletions(-) diff --git a/pom.xml b/pom.xml index dd1b01c9..894d9f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,23 @@ 1.8 utf-8 utf-8 + + 2.5.12 + 5.0.4.RELEASE + 3.1.4.RELEASE + 2.12.6.1 + 3.1.0 + 3.0.9.RELEASE + 1.10.4 + 1.9.1 + 1.4.3 + 4.9.17 + 3.14.4 + 2.5.0 + 2.7.15 + 2.10.1.RELEASE + 5.8.5 + 0.9.1 diff --git a/sa-token-demo/sa-token-demo-alone-redis/pom.xml b/sa-token-demo/sa-token-demo-alone-redis/pom.xml index 18112cde..7f2a6067 100644 --- a/sa-token-demo/sa-token-demo-alone-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-alone-redis/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -35,14 +35,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} @@ -55,7 +55,7 @@ cn.dev33 sa-token-alone-redis - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-case/pom.xml b/sa-token-demo/sa-token-demo-case/pom.xml index fc713fb2..25e66d42 100644 --- a/sa-token-demo/sa-token-demo-case/pom.xml +++ b/sa-token-demo/sa-token-demo-case/pom.xml @@ -15,9 +15,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -36,14 +36,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml b/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml index 1d4c4656..50cd6ad8 100644 --- a/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml +++ b/sa-token-demo/sa-token-demo-dubbo-consumer/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.1 - 1.31.1.temp + 1.31.1.temp @@ -31,14 +31,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} org.apache.commons @@ -68,7 +68,7 @@ cn.dev33 sa-token-context-dubbo - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml b/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml index c58b1117..91f59c8e 100644 --- a/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml +++ b/sa-token-demo/sa-token-demo-dubbo-provider/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.1 - 1.31.1.temp + 1.31.1.temp @@ -31,14 +31,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} org.apache.commons @@ -68,7 +68,7 @@ cn.dev33 sa-token-context-dubbo - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-grpc/pom.xml b/sa-token-demo/sa-token-demo-grpc/pom.xml index bf69b928..c14c9ef8 100644 --- a/sa-token-demo/sa-token-demo-grpc/pom.xml +++ b/sa-token-demo/sa-token-demo-grpc/pom.xml @@ -27,7 +27,7 @@ UTF-8 UTF-8 1.18.10 - 1.31.1.temp + 1.31.1.temp @@ -54,17 +54,17 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-context-grpc - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-jwt/pom.xml b/sa-token-demo/sa-token-demo-jwt/pom.xml index d0b5b6a0..ce2cf50e 100644 --- a/sa-token-demo/sa-token-demo-jwt/pom.xml +++ b/sa-token-demo/sa-token-demo-jwt/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,21 +31,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-jwt - ${sa-token-version} + ${sa-token.version} - 1.31.1.temp + + 1.31.1.temp @@ -32,7 +32,7 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml index a4e8beb9..86244fc9 100644 --- a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml +++ b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml @@ -16,8 +16,8 @@ 1.8 3.1.1 - - 1.31.1.temp + + 1.31.1.temp @@ -32,21 +32,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-oauth2 - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} org.apache.commons diff --git a/sa-token-demo/sa-token-demo-quick-login/pom.xml b/sa-token-demo/sa-token-demo-quick-login/pom.xml index 42e01ad3..6c7fd685 100644 --- a/sa-token-demo/sa-token-demo-quick-login/pom.xml +++ b/sa-token-demo/sa-token-demo-quick-login/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,14 +31,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-quick-login - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml index 26c88b5c..ebd39d18 100644 --- a/sa-token-demo/sa-token-demo-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-solon/pom.xml @@ -7,9 +7,9 @@ 0.0.1-SNAPSHOT - + - 1.31.1.temp + 1.31.1.temp @@ -25,21 +25,21 @@ cn.dev33 sa-token-solon-plugin - ${sa-token-version} + ${sa-token.version} @@ -52,7 +52,7 @@ diff --git a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml index 49fa16a4..b066e57d 100644 --- a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml @@ -15,9 +15,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -36,21 +36,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-springboot/pom.xml b/sa-token-demo/sa-token-demo-springboot/pom.xml index b5fdd415..2dd3f1ea 100644 --- a/sa-token-demo/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot/pom.xml @@ -15,9 +15,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -36,14 +36,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-sso-server/pom.xml b/sa-token-demo/sa-token-demo-sso-server/pom.xml index 8f8fcea6..1c5d2c21 100644 --- a/sa-token-demo/sa-token-demo-sso-server/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-server/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,21 +31,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-sso - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} org.apache.commons diff --git a/sa-token-demo/sa-token-demo-sso1-client/pom.xml b/sa-token-demo/sa-token-demo-sso1-client/pom.xml index afac6355..c98dd7bd 100644 --- a/sa-token-demo/sa-token-demo-sso1-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso1-client/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,21 +31,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-sso - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} @@ -58,7 +58,7 @@ cn.dev33 sa-token-alone-redis - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-sso2-client/pom.xml b/sa-token-demo/sa-token-demo-sso2-client/pom.xml index 5aa3882c..b98d79c2 100644 --- a/sa-token-demo/sa-token-demo-sso2-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso2-client/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,21 +31,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-sso - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} @@ -58,7 +58,7 @@ cn.dev33 sa-token-alone-redis - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-sso3-client/pom.xml b/sa-token-demo/sa-token-demo-sso3-client/pom.xml index 365eaa7c..31224e47 100644 --- a/sa-token-demo/sa-token-demo-sso3-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso3-client/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -31,21 +31,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-sso - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-test/pom.xml b/sa-token-demo/sa-token-demo-test/pom.xml index b4c7e569..1dbc211a 100644 --- a/sa-token-demo/sa-token-demo-test/pom.xml +++ b/sa-token-demo/sa-token-demo-test/pom.xml @@ -15,9 +15,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -36,21 +36,21 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dao-redis-jackson - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml index de1c725d..7b756a07 100644 --- a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml +++ b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -41,14 +41,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} cn.dev33 sa-token-dialect-thymeleaf - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-webflux/pom.xml b/sa-token-demo/sa-token-demo-webflux/pom.xml index e3f7d5ad..3f1414b4 100644 --- a/sa-token-demo/sa-token-demo-webflux/pom.xml +++ b/sa-token-demo/sa-token-demo-webflux/pom.xml @@ -14,9 +14,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -35,21 +35,21 @@ cn.dev33 sa-token-reactor-spring-boot-starter - ${sa-token-version} + ${sa-token.version} diff --git a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml index 5978ac6b..2be2ce3c 100644 --- a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml +++ b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml @@ -15,9 +15,9 @@ - + - 1.31.1.temp + 1.31.1.temp @@ -42,14 +42,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} + - 1.31.1.temp + 1.31.1.temp @@ -42,14 +42,14 @@ cn.dev33 sa-token-spring-boot-starter - ${sa-token-version} + ${sa-token.version} org.springframework.boot spring-boot-configuration-processor - 2.5.12 + ${springboot.version} true diff --git a/sa-token-plugin/sa-token-jwt/pom.xml b/sa-token-plugin/sa-token-jwt/pom.xml index bdaf04ef..a43ed8f1 100644 --- a/sa-token-plugin/sa-token-jwt/pom.xml +++ b/sa-token-plugin/sa-token-jwt/pom.xml @@ -27,7 +27,7 @@ cn.hutool hutool-jwt - 5.8.5 + ${hutool-jwt.version} diff --git a/sa-token-plugin/sa-token-quick-login/pom.xml b/sa-token-plugin/sa-token-quick-login/pom.xml index 121bd159..5bf1f1ad 100644 --- a/sa-token-plugin/sa-token-quick-login/pom.xml +++ b/sa-token-plugin/sa-token-quick-login/pom.xml @@ -27,7 +27,7 @@ org.springframework.boot spring-boot-starter-thymeleaf - 2.5.12 + ${springboot.version} diff --git a/sa-token-plugin/sa-token-spring-aop/pom.xml b/sa-token-plugin/sa-token-spring-aop/pom.xml index 3b08c64c..9475a39b 100644 --- a/sa-token-plugin/sa-token-spring-aop/pom.xml +++ b/sa-token-plugin/sa-token-spring-aop/pom.xml @@ -27,7 +27,7 @@ org.springframework.boot spring-boot-starter-aop - 2.5.12 + ${springboot.version} diff --git a/sa-token-plugin/sa-token-temp-jwt/pom.xml b/sa-token-plugin/sa-token-temp-jwt/pom.xml index 7fe0a32f..3ac777a6 100644 --- a/sa-token-plugin/sa-token-temp-jwt/pom.xml +++ b/sa-token-plugin/sa-token-temp-jwt/pom.xml @@ -27,13 +27,13 @@ io.jsonwebtoken jjwt - 0.9.1 + ${jjwt.version} diff --git a/sa-token-starter/sa-token-jboot-plugin/pom.xml b/sa-token-starter/sa-token-jboot-plugin/pom.xml index 685064ee..9a09461a 100644 --- a/sa-token-starter/sa-token-jboot-plugin/pom.xml +++ b/sa-token-starter/sa-token-jboot-plugin/pom.xml @@ -24,7 +24,7 @@ io.jboot jboot - 3.14.4 + ${jboot.version} provided diff --git a/sa-token-starter/sa-token-jfinal-plugin/pom.xml b/sa-token-starter/sa-token-jfinal-plugin/pom.xml index 8604009c..6ac0c80b 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/pom.xml +++ b/sa-token-starter/sa-token-jfinal-plugin/pom.xml @@ -32,7 +32,7 @@ com.jfinal jfinal - 4.9.17 + ${jfinal.version} provided diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml index 8c69cb3c..c3132617 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml @@ -23,27 +23,47 @@ sa-token-core ${revision} - + + org.springframework.boot spring-boot-starter - 2.5.12 + ${springboot.version} true - + + org.springframework spring-web - 5.0.4.RELEASE + ${spring-web.version} true - + + io.projectreactor reactor-core - 3.1.4.RELEASE + ${reactor-core.version} true + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + true + + + + + org.springframework.boot + spring-boot-configuration-processor + ${springboot.version} + true + + cn.dev33 @@ -51,6 +71,7 @@ ${revision} true + cn.dev33 @@ -59,26 +80,10 @@ true - - - com.fasterxml.jackson.core - jackson-databind - 2.12.6.1 - true - - - - - org.springframework.boot - spring-boot-configuration-processor - 2.5.12 - true - - diff --git a/sa-token-starter/sa-token-servlet/pom.xml b/sa-token-starter/sa-token-servlet/pom.xml index 04f508b9..ed2f4aa7 100644 --- a/sa-token-starter/sa-token-servlet/pom.xml +++ b/sa-token-starter/sa-token-servlet/pom.xml @@ -23,11 +23,12 @@ sa-token-core ${revision} - + + javax.servlet javax.servlet-api - 3.1.0 + ${servlet-api.version} true diff --git a/sa-token-starter/sa-token-solon-plugin/pom.xml b/sa-token-starter/sa-token-solon-plugin/pom.xml index 1b1ac43f..ea599bd7 100644 --- a/sa-token-starter/sa-token-solon-plugin/pom.xml +++ b/sa-token-starter/sa-token-solon-plugin/pom.xml @@ -17,17 +17,17 @@ solon integrate sa-token - - org.noear - solon - 1.10.4 - - cn.dev33 sa-token-core ${revision} + + + org.noear + solon + ${solon.version} + \ No newline at end of file diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java index 26b91cac..7991d65b 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java @@ -3,7 +3,6 @@ package cn.dev33.satoken.solon; import org.noear.solon.Solon; import org.noear.solon.core.AopContext; import org.noear.solon.core.Plugin; -import org.noear.solon.core.event.EventBus; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.annotation.SaCheckBasic; @@ -34,6 +33,7 @@ import cn.dev33.satoken.temp.SaTempInterface; * @author noear * @since 1.4 */ +@SuppressWarnings("deprecation") public class XPluginImp implements Plugin { @Override diff --git a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java index 8bd221b1..0002d8f0 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java +++ b/sa-token-starter/sa-token-solon-plugin/src/test/java/demo/Config.java @@ -1,19 +1,21 @@ package demo; -import cn.dev33.satoken.router.SaRouter; -import cn.dev33.satoken.solon.integration.SaTokenPathFilter; -import cn.dev33.satoken.stp.StpUtil; import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Configuration; import org.noear.solon.core.handle.Filter; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.solon.integration.SaTokenPathFilter; +import cn.dev33.satoken.stp.StpUtil; + /** * @author noear 2022/3/30 created */ +@SuppressWarnings("deprecation") @Configuration public class Config { - @Bean + @Bean public Filter saTokenFilter() { return new SaTokenPathFilter() // 指定 [拦截路由] 与 [放行路由] diff --git a/sa-token-starter/sa-token-spring-boot-starter/pom.xml b/sa-token-starter/sa-token-spring-boot-starter/pom.xml index 72746940..4d26ef46 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/pom.xml +++ b/sa-token-starter/sa-token-spring-boot-starter/pom.xml @@ -17,16 +17,28 @@ springboot integrate sa-token + cn.dev33 sa-token-servlet ${revision} + + org.springframework.boot spring-boot-starter-web - 2.5.12 + ${springboot.version} + + + + org.springframework.boot + spring-boot-configuration-processor + ${springboot.version} + true + + cn.dev33 @@ -34,6 +46,7 @@ ${revision} true + cn.dev33 @@ -41,14 +54,6 @@ ${revision} true - - - - org.springframework.boot - spring-boot-configuration-processor - 2.5.12 - true -