From 345ec09be55bebd1935a150b435eba3c1258c166 Mon Sep 17 00:00:00 2001 From: zhengqingya <960869719@qq.com> Date: Mon, 13 Feb 2023 11:58:04 +0800 Subject: [PATCH] add jwt --- smallboot-api/common/auth/pom.xml | 9 +++- .../common/auth/api/TestController.java | 2 +- .../common/auth/config/SaTokenConfig.java | 27 +++++++++++ .../auth/config/SaTokenCustomConfig.java | 30 ------------ ...kenUrlConfig.java => SaTokenProperty.java} | 6 +-- .../auth/config/SaTokenWebMvcConfig.java | 13 ++--- .../src/main/resources/application-auth.yml | 2 + ...omUserContext.java => JwtUserContext.java} | 12 ++--- .../common/base/model/bo/JwtCustomUserBO.java | 48 ------------------- .../common/base}/model/bo/JwtUserBO.java | 23 +++++++-- .../HandlerInterceptorForTokenUser.java | 21 ++++++-- .../config/mybatis/MyMetaObjectHandler.java | 15 ++---- .../system/service/impl/AuthServiceImpl.java | 6 ++- .../src/components/base/BaseTableP.vue | 26 ++++++---- .../src/components/base/BaseTitleCard.vue | 1 - .../layout/components/TagsView/ScrollPane.vue | 2 +- .../src/layout/components/TagsView/index.vue | 15 ++++-- smallboot-web/src/store/modules/settings.ts | 4 +- .../src/views/system/dict/edit-dict.vue | 11 ++--- smallboot-web/src/views/system/dict/index.vue | 15 +++--- 20 files changed, 142 insertions(+), 146 deletions(-) create mode 100644 smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenConfig.java delete mode 100644 smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenCustomConfig.java rename smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/{SaTokenUrlConfig.java => SaTokenProperty.java} (84%) rename smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/{JwtCustomUserContext.java => JwtUserContext.java} (50%) delete mode 100644 smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtCustomUserBO.java rename smallboot-api/common/{auth/src/main/java/com/zhengqing/common/auth => base/src/main/java/com/zhengqing/common/base}/model/bo/JwtUserBO.java (51%) diff --git a/smallboot-api/common/auth/pom.xml b/smallboot-api/common/auth/pom.xml index a043c9b..c207e76 100644 --- a/smallboot-api/common/auth/pom.xml +++ b/smallboot-api/common/auth/pom.xml @@ -29,7 +29,14 @@ cn.dev33 sa-token-spring-boot-starter - 1.27.0 + 1.34.0 + + + + + cn.dev33 + sa-token-jwt + 1.34.0 diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/api/TestController.java b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/api/TestController.java index 49f12d4..e98fd89 100644 --- a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/api/TestController.java +++ b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/api/TestController.java @@ -62,7 +62,7 @@ public class TestController { @GetMapping("logout") @ApiOperation("退出登录") public String logout(String loginId) { - StpUtil.logoutByLoginId(loginId); + StpUtil.logout(loginId); return "SUCCESS"; } diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenConfig.java b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenConfig.java new file mode 100644 index 0000000..67486b0 --- /dev/null +++ b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenConfig.java @@ -0,0 +1,27 @@ +package com.zhengqing.common.auth.config; + +import cn.dev33.satoken.jwt.StpLogicJwtForSimple; +import cn.dev33.satoken.stp.StpLogic; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + *

Sa-Token 配置类

+ * + * @author zhengqingya + * @description + * @date 2021/11/3 12:06 + */ +@Configuration +public class SaTokenConfig { + + /** + * Sa-Token 整合 jwt (Simple 简单模式) + * 参考 https://sa-token.cc/doc.html#/plugin/jwt-extend + */ + @Bean + public StpLogic getStpLogicJwt() { + return new StpLogicJwtForSimple(); + } + +} diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenCustomConfig.java b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenCustomConfig.java deleted file mode 100644 index 8b0775d..0000000 --- a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenCustomConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.zhengqing.common.auth.config; - -import cn.dev33.satoken.strategy.SaStrategy; -import cn.dev33.satoken.util.SaFoxUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; - -/** - *

自定义sa-token生成策略

- * - * @author zhengqingya - * @description - * @date 2021/11/3 12:06 - */ -@Configuration -public class SaTokenCustomConfig { - - /** - * 重写 Sa-Token 框架内部算法策略 - */ - @Autowired - public void rewriteSaStrategy() { - // 重写 Token 生成策略 - SaStrategy.me.createToken = (loginId, loginType) -> { - // 随机60位长度字符串 - return SaFoxUtil.getRandomString(60); - }; - } - -} diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenUrlConfig.java b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenProperty.java similarity index 84% rename from smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenUrlConfig.java rename to smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenProperty.java index f9e160d..345d1d2 100644 --- a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenUrlConfig.java +++ b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenProperty.java @@ -8,16 +8,16 @@ import java.util.List; /** - *

Sa-Token 拦截/开放 URL 配置类

+ *

Sa-Token 配置属性

* * @author zhengqingya - * @description + * @description 拦截/开放 URL * @date 2021/11/3 8:54 下午 */ @Data @Configuration @ConfigurationProperties(prefix = "sa-token", ignoreUnknownFields = true) -public class SaTokenUrlConfig { +public class SaTokenProperty { /** * 拦截url diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenWebMvcConfig.java b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenWebMvcConfig.java index 0c97497..996298f 100644 --- a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenWebMvcConfig.java +++ b/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/config/SaTokenWebMvcConfig.java @@ -1,6 +1,7 @@ package com.zhengqing.common.auth.config; -import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.stp.StpUtil; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -18,14 +19,14 @@ import javax.annotation.Resource; public class SaTokenWebMvcConfig implements WebMvcConfigurer { @Resource - private SaTokenUrlConfig saTokenUrlConfig; + private SaTokenProperty saTokenProperty; @Override public void addInterceptors(InterceptorRegistry registry) { - // 注册1个登录认证拦截器 - registry.addInterceptor(new SaRouteInterceptor()) - .addPathPatterns(this.saTokenUrlConfig.getInterceptUrlList()) - .excludePathPatterns(this.saTokenUrlConfig.getOpenUrlList()); + // 注册1个登录认证拦截器 -- 参考: https://sa-token.cc/doc.html#/use/route-check + registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin())) + .addPathPatterns(this.saTokenProperty.getInterceptUrlList()) + .excludePathPatterns(this.saTokenProperty.getOpenUrlList()); } } diff --git a/smallboot-api/common/auth/src/main/resources/application-auth.yml b/smallboot-api/common/auth/src/main/resources/application-auth.yml index affe4ed..201e33a 100644 --- a/smallboot-api/common/auth/src/main/resources/application-auth.yml +++ b/smallboot-api/common/auth/src/main/resources/application-auth.yml @@ -2,6 +2,8 @@ sa-token: # token名称 (同时也是cookie名称) 注意不能带冒号: token-name: Authorization-smallboot + # jwt秘钥 + jwt-secret-key: smallboot # token值前缀 # token-prefix: Bearer # token有效期,单位s 这里设置1天, -1代表永不过期 diff --git a/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtCustomUserContext.java b/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtUserContext.java similarity index 50% rename from smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtCustomUserContext.java rename to smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtUserContext.java index db782e0..003ba2e 100644 --- a/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtCustomUserContext.java +++ b/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/context/JwtUserContext.java @@ -1,7 +1,7 @@ package com.zhengqing.common.base.context; -import com.zhengqing.common.base.model.bo.JwtCustomUserBO; +import com.zhengqing.common.base.model.bo.JwtUserBO; /** *

jwt自定义用户信息上下文

@@ -10,16 +10,16 @@ import com.zhengqing.common.base.model.bo.JwtCustomUserBO; * @description 请务必在请求结束时, 调用 @Method remove() * @date 2020/8/1 19:07 */ -public class JwtCustomUserContext { +public class JwtUserContext { - public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); + public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); - public static JwtCustomUserBO get() { + public static JwtUserBO get() { return THREAD_LOCAL.get(); } - public static void set(JwtCustomUserBO jwtCustomUserBO) { - THREAD_LOCAL.set(jwtCustomUserBO); + public static void set(JwtUserBO jwtUserBO) { + THREAD_LOCAL.set(jwtUserBO); } public static void remove() { diff --git a/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtCustomUserBO.java b/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtCustomUserBO.java deleted file mode 100644 index 20078f0..0000000 --- a/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtCustomUserBO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.zhengqing.common.base.model.bo; - -import com.zhengqing.common.base.enums.AuthSourceEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - *

jwt中自定义的用户信息

- * - * @author zhengqingya - * @description {@link com.zhengqing.auth.security.config.CustomAdditionalInformation} - * @date 2022/6/15 10:34 - */ -@Data -@SuperBuilder -@NoArgsConstructor -@AllArgsConstructor -public class JwtCustomUserBO { - /** - * {@link AuthSourceEnum} - */ - @ApiModelProperty(value = "认证来源") - private String authSource; - - @ApiModelProperty(value = "jwt") - private String token; - - @ApiModelProperty(value = "jwt的唯一身份标识") - private String jti; - - @ApiModelProperty(value = "过期时间(2022-06-01 23:06:53)") - private String expireTime; - - @ApiModelProperty(value = "租户ID") - private String tenantId; - - @ApiModelProperty(value = "B端系统用户ID") - private String sysUserId; - - @ApiModelProperty(value = "C端用户ID") - private String umsUserId; - - @ApiModelProperty(value = "用户名") - private String username; -} diff --git a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/model/bo/JwtUserBO.java b/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtUserBO.java similarity index 51% rename from smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/model/bo/JwtUserBO.java rename to smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtUserBO.java index 8956c16..c724954 100644 --- a/smallboot-api/common/auth/src/main/java/com/zhengqing/common/auth/model/bo/JwtUserBO.java +++ b/smallboot-api/common/base/src/main/java/com/zhengqing/common/base/model/bo/JwtUserBO.java @@ -1,6 +1,6 @@ -package com.zhengqing.common.auth.model.bo; +package com.zhengqing.common.base.model.bo; -import com.zhengqing.common.base.model.bo.BaseBO; +import com.zhengqing.common.base.enums.AuthSourceEnum; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; @@ -22,10 +22,27 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor public class JwtUserBO extends BaseBO { + @ApiModelProperty(value = "认证来源") + private AuthSourceEnum authSourceEnum; + @ApiModelProperty(value = "用户ID") - private Integer userId; + private String userId; @ApiModelProperty(value = "用户名") private String userName; + /** + * 获取B端用户ID + */ + public Integer getUserIdForB() { + return Integer.valueOf(this.userId); + } + + /** + * 获取C端用户ID + */ + public Long getUserIdForC() { + return Long.valueOf(this.userId); + } + } diff --git a/smallboot-api/common/core/src/main/java/com/zhengqing/common/core/config/interceptor/HandlerInterceptorForTokenUser.java b/smallboot-api/common/core/src/main/java/com/zhengqing/common/core/config/interceptor/HandlerInterceptorForTokenUser.java index 74db3a3..2822a52 100644 --- a/smallboot-api/common/core/src/main/java/com/zhengqing/common/core/config/interceptor/HandlerInterceptorForTokenUser.java +++ b/smallboot-api/common/core/src/main/java/com/zhengqing/common/core/config/interceptor/HandlerInterceptorForTokenUser.java @@ -2,11 +2,11 @@ package com.zhengqing.common.core.config.interceptor; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.json.JSONUtil; -import com.zhengqing.common.auth.model.bo.JwtUserBO; import com.zhengqing.common.base.constant.AppConstant; -import com.zhengqing.common.base.context.JwtCustomUserContext; +import com.zhengqing.common.base.context.JwtUserContext; import com.zhengqing.common.base.context.SysUserContext; import com.zhengqing.common.base.context.UmsUserContext; +import com.zhengqing.common.base.model.bo.JwtUserBO; import com.zhengqing.common.core.config.WebAppConfig; import org.apache.commons.lang3.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; @@ -35,8 +35,19 @@ public class HandlerInterceptorForTokenUser implements HandlerInterceptor { return true; } JwtUserBO jwtUserBO = JSONUtil.toBean(StpUtil.getLoginId().toString(), JwtUserBO.class); - SysUserContext.setUserId(jwtUserBO.getUserId()); - SysUserContext.setUsername(jwtUserBO.getUserName()); + JwtUserContext.set(jwtUserBO); + switch (jwtUserBO.getAuthSourceEnum()) { + case B: + SysUserContext.setUserId(Integer.valueOf(jwtUserBO.getUserId())); + SysUserContext.setUsername(jwtUserBO.getUserName()); + break; + case C: + UmsUserContext.setUserId(Long.valueOf(jwtUserBO.getUserId())); + UmsUserContext.setUsername(jwtUserBO.getUserName()); + break; + default: + break; + } return true; } @@ -57,7 +68,7 @@ public class HandlerInterceptorForTokenUser implements HandlerInterceptor { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); SysUserContext.remove(); UmsUserContext.remove(); - JwtCustomUserContext.remove(); + JwtUserContext.remove(); } } diff --git a/smallboot-api/common/db/src/main/java/com/zhengqing/common/db/config/mybatis/MyMetaObjectHandler.java b/smallboot-api/common/db/src/main/java/com/zhengqing/common/db/config/mybatis/MyMetaObjectHandler.java index cf5635b..67b8329 100644 --- a/smallboot-api/common/db/src/main/java/com/zhengqing/common/db/config/mybatis/MyMetaObjectHandler.java +++ b/smallboot-api/common/db/src/main/java/com/zhengqing/common/db/config/mybatis/MyMetaObjectHandler.java @@ -2,9 +2,8 @@ package com.zhengqing.common.db.config.mybatis; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.zhengqing.common.base.constant.BaseConstant; -import com.zhengqing.common.base.context.JwtCustomUserContext; -import com.zhengqing.common.base.enums.AuthSourceEnum; -import com.zhengqing.common.base.model.bo.JwtCustomUserBO; +import com.zhengqing.common.base.context.JwtUserContext; +import com.zhengqing.common.base.model.bo.JwtUserBO; import com.zhengqing.common.db.constant.MybatisConstant; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -74,13 +73,9 @@ public class MyMetaObjectHandler implements MetaObjectHandler { * @date 2022/7/8 18:15 */ private Long getUserId() { - JwtCustomUserBO jwtCustomUserBO = JwtCustomUserContext.get(); - if (jwtCustomUserBO != null) { - if (AuthSourceEnum.B.getValue().equals(jwtCustomUserBO.getAuthSource())) { - return Long.valueOf(jwtCustomUserBO.getSysUserId()); - } else { - return Long.valueOf(jwtCustomUserBO.getUmsUserId()); - } + JwtUserBO jwtUserBO = JwtUserContext.get(); + if (jwtUserBO != null) { + return Long.valueOf(jwtUserBO.getUserId()); } return Long.valueOf(BaseConstant.DEFAULT_CONTEXT_KEY_USER_ID); } diff --git a/smallboot-api/system/src/main/java/com/zhengqing/system/service/impl/AuthServiceImpl.java b/smallboot-api/system/src/main/java/com/zhengqing/system/service/impl/AuthServiceImpl.java index 2fae0c9..1091867 100644 --- a/smallboot-api/system/src/main/java/com/zhengqing/system/service/impl/AuthServiceImpl.java +++ b/smallboot-api/system/src/main/java/com/zhengqing/system/service/impl/AuthServiceImpl.java @@ -3,10 +3,11 @@ package com.zhengqing.common.auth.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.Assert; import cn.hutool.json.JSONUtil; -import com.zhengqing.common.auth.model.bo.JwtUserBO; import com.zhengqing.common.auth.model.dto.AuthLoginDTO; import com.zhengqing.common.auth.model.vo.AuthLoginVO; import com.zhengqing.common.auth.service.IAuthService; +import com.zhengqing.common.base.enums.AuthSourceEnum; +import com.zhengqing.common.base.model.bo.JwtUserBO; import com.zhengqing.system.entity.SysUser; import com.zhengqing.system.service.ISysUserService; import com.zhengqing.system.util.PasswordUtil; @@ -45,7 +46,8 @@ public class AuthServiceImpl implements IAuthService { // 登录 StpUtil.login(JSONUtil.toJsonStr( JwtUserBO.builder() - .userId(sysUser.getUserId()) + .authSourceEnum(AuthSourceEnum.B) + .userId(String.valueOf(sysUser.getUserId())) .userName(sysUser.getUsername()) .build() )); diff --git a/smallboot-web/src/components/base/BaseTableP.vue b/smallboot-web/src/components/base/BaseTableP.vue index 48e42d6..43bad42 100644 --- a/smallboot-web/src/components/base/BaseTableP.vue +++ b/smallboot-web/src/components/base/BaseTableP.vue @@ -4,13 +4,16 @@ - + diff --git a/smallboot-web/src/components/base/BaseTitleCard.vue b/smallboot-web/src/components/base/BaseTitleCard.vue index fa162cf..3900743 100644 --- a/smallboot-web/src/components/base/BaseTitleCard.vue +++ b/smallboot-web/src/components/base/BaseTitleCard.vue @@ -30,7 +30,6 @@ export default { + diff --git a/smallboot-web/src/views/system/dict/index.vue b/smallboot-web/src/views/system/dict/index.vue index e189d63..a91dcf8 100644 --- a/smallboot-web/src/views/system/dict/index.vue +++ b/smallboot-web/src/views/system/dict/index.vue @@ -1,7 +1,7 @@