diff --git a/smart-admin-api/pom.xml b/smart-admin-api/pom.xml index 37e2f4ae..0faa59f4 100644 --- a/smart-admin-api/pom.xml +++ b/smart-admin-api/pom.xml @@ -125,6 +125,13 @@ ${sa-token-version} + + + cn.dev33 + sa-token-jwt + 1.35.0.RC + + diff --git a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java new file mode 100644 index 00000000..30e7eb50 --- /dev/null +++ b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java @@ -0,0 +1,69 @@ +package net.lab1024.sa.admin.interceptor; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.convert.NumberWithFormat; +import net.lab1024.sa.common.common.domain.RequestUser; +import net.lab1024.sa.common.common.enumeration.UserTypeEnum; +import net.lab1024.sa.common.common.interceptor.AbstractInterceptor; +import net.lab1024.sa.common.common.util.SmartEnumUtil; +import net.lab1024.sa.common.handler.GlobalExceptionHandler; +import net.lab1024.sa.common.module.support.token.TokenService; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * admin 拦截器 + * + * @author: listen + * @date: 2023/7/12 21:00 + */ +@Configuration +public class AdminInterceptor extends AbstractInterceptor { + + @Override + public RequestUser checkTokenAndGetUser() { + /** + * 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException` + * 已在全局异常处理 + * @see GlobalExceptionHandler#handlerNotLoginException + */ + StpUtil.checkLogin(); + + // 获取额外数据 + Integer userType = ((NumberWithFormat) StpUtil.getExtra(TokenService.EXTRA_KEY_USER_TYPE)).intValue(); + UserTypeEnum userTypeEnum = SmartEnumUtil.getEnumByValue(userType, UserTypeEnum.class); + String userName = (String) StpUtil.getExtra(TokenService.EXTRA_KEY_USER_NAME); + String loginId = (String) StpUtil.getLoginId(); + + // 当前请求对象 + RequestUser requestUser = new RequestUser(); + requestUser.setUserId(TokenService.getUserId(loginId)); + requestUser.setUserName(userName); + requestUser.setUserType(userTypeEnum); + return requestUser; + } + + /** + * 配置拦截路径 + * + * @return + */ + @Override + public String[] pathPatterns() { + return new String[]{"/**"}; + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + boolean isHandle = super.preHandle(request, response, handler); + if (!isHandle) { + return false; + } + + // TODO listen 校验权限 + + return true; + } +} diff --git a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java index 6f36b68b..ed8a35cd 100644 --- a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java +++ b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java @@ -8,7 +8,6 @@ import net.lab1024.sa.admin.module.business.oa.enterprise.domain.form.*; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseEmployeeVO; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseListVO; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseVO; -import net.lab1024.sa.common.common.annoation.SaAuth; import net.lab1024.sa.common.common.domain.PageResult; import net.lab1024.sa.common.common.domain.RequestUser; import net.lab1024.sa.common.common.domain.ResponseDTO; @@ -40,21 +39,18 @@ public class EnterpriseController { @ApiOperation(value = "分页查询企业模块 @author 开云") @PostMapping("/oa/enterprise/page/query") - @SaAuth public ResponseDTO> queryByPage(@RequestBody @Valid EnterpriseQueryForm queryDTO) { return enterpriseService.queryByPage(queryDTO); } @ApiOperation(value = "查询企业详情 @author 开云") @GetMapping("/oa/enterprise/get/{enterpriseId}") - @SaAuth public ResponseDTO getDetail(@PathVariable Long enterpriseId) { return ResponseDTO.ok(enterpriseService.getDetail(enterpriseId)); } @ApiOperation(value = "新建企业 @author 开云") @PostMapping("/oa/enterprise/create") - @SaAuth public ResponseDTO createEnterprise(@RequestBody @Valid EnterpriseCreateForm createVO) { RequestUser requestUser = SmartRequestUtil.getUser(); createVO.setCreateUserId(requestUser.getUserId()); @@ -64,21 +60,18 @@ public class EnterpriseController { @ApiOperation(value = "编辑企业 @author 开云") @PostMapping("/oa/enterprise/update") - @SaAuth public ResponseDTO updateEnterprise(@RequestBody @Valid EnterpriseUpdateForm updateVO) { return enterpriseService.updateEnterprise(updateVO); } @ApiOperation(value = "删除企业 @author 开云") @GetMapping("/oa/enterprise/delete/{enterpriseId}") - @SaAuth public ResponseDTO deleteEnterprise(@PathVariable Long enterpriseId) { return enterpriseService.deleteEnterprise(enterpriseId); } @ApiOperation(value = "企业列表查询 @author 开云") @GetMapping("/oa/enterprise/query/list") - @SaAuth public ResponseDTO> queryList(@RequestParam(value = "type", required = false) Integer type) { return enterpriseService.queryList(type); } @@ -86,21 +79,18 @@ public class EnterpriseController { @ApiOperation(value = "企业添加员工 @author 罗伊") @PostMapping("/oa/enterprise/employee/add") - @SaAuth public ResponseDTO addEmployee(@RequestBody @Valid EnterpriseEmployeeForm enterpriseEmployeeForm) { return enterpriseService.addEmployee(enterpriseEmployeeForm); } @ApiOperation(value = "查询企业全部员工 @author 罗伊") @PostMapping("/oa/enterprise/employee/list") - @SaAuth public ResponseDTO> employeeList(@RequestBody @Valid List enterpriseIdList) { return ResponseDTO.ok(enterpriseService.employeeList(enterpriseIdList)); } @ApiOperation(value = "分页查询企业员工 @author 卓大") @PostMapping("/oa/enterprise/employee/queryPage") - @SaAuth public ResponseDTO> queryPageEmployeeList(@RequestBody @Valid EnterpriseEmployeeQueryForm queryForm) { return ResponseDTO.ok(enterpriseService.queryPageEmployeeList(queryForm)); } @@ -108,7 +98,6 @@ public class EnterpriseController { @ApiOperation(value = "企业删除员工 @author 罗伊") @PostMapping("/oa/enterprise/employee/delete") - @SaAuth public ResponseDTO deleteEmployee(@RequestBody @Valid EnterpriseEmployeeForm enterpriseEmployeeForm) { return enterpriseService.deleteEmployee(enterpriseEmployeeForm); } diff --git a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/controller/NoticeController.java b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/controller/NoticeController.java index 42eff483..f2af3de6 100644 --- a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/controller/NoticeController.java +++ b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/controller/NoticeController.java @@ -9,7 +9,6 @@ import net.lab1024.sa.admin.module.business.oa.notice.domain.vo.*; import net.lab1024.sa.admin.module.business.oa.notice.service.NoticeEmployeeService; import net.lab1024.sa.admin.module.business.oa.notice.service.NoticeService; import net.lab1024.sa.admin.module.business.oa.notice.service.NoticeTypeService; -import net.lab1024.sa.common.common.annoation.SaAuth; import net.lab1024.sa.common.common.domain.PageResult; import net.lab1024.sa.common.common.domain.ResponseDTO; import net.lab1024.sa.common.common.util.SmartRequestUtil; @@ -73,7 +72,6 @@ public class NoticeController { @ApiOperation("【管理】通知公告-分页查询 @author 卓大") @PostMapping("/oa/notice/query") - @SaAuth public ResponseDTO> query(@RequestBody @Valid NoticeQueryForm queryForm) { return ResponseDTO.ok(noticeService.query(queryForm)); } @@ -81,7 +79,6 @@ public class NoticeController { @ApiOperation("【管理】通知公告-添加 @author 卓大") @PostMapping("/oa/notice/add") @RepeatSubmit - @SaAuth public ResponseDTO add(@RequestBody @Valid NoticeAddForm addForm) { addForm.setCreateUserId(SmartRequestUtil.getUserId()); return noticeService.add(addForm); @@ -90,21 +87,18 @@ public class NoticeController { @ApiOperation("【管理】通知公告-更新 @author 卓大") @PostMapping("/oa/notice/update") @RepeatSubmit - @SaAuth public ResponseDTO update(@RequestBody @Valid NoticeUpdateForm updateForm) { return noticeService.update(updateForm); } @ApiOperation("【管理】通知公告-更新详情 @author 卓大") @GetMapping("/oa/notice/getUpdateVO/{noticeId}") - @SaAuth public ResponseDTO getUpdateFormVO(@PathVariable Long noticeId) { return ResponseDTO.ok(noticeService.getUpdateFormVO(noticeId)); } @ApiOperation("【管理】通知公告-删除 @author 卓大") @GetMapping("/oa/notice/delete/{noticeId}") - @SaAuth public ResponseDTO delete(@PathVariable Long noticeId) { return noticeService.delete(noticeId); } diff --git a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginEmployeeDetail.java b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginEmployeeDetail.java index 00596b76..76b4dbea 100644 --- a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginEmployeeDetail.java +++ b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginEmployeeDetail.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import net.lab1024.sa.admin.module.system.menu.domain.vo.MenuVO; -import net.lab1024.sa.common.common.domain.RequestUser; import net.lab1024.sa.common.common.enumeration.GenderEnum; import net.lab1024.sa.common.common.enumeration.UserTypeEnum; import net.lab1024.sa.common.common.swagger.ApiModelPropertyEnum; @@ -22,7 +21,7 @@ import java.util.List; * @Copyright 1024创新实验室 ( https://1024lab.net ),2012-2022 */ @Data -public class LoginEmployeeDetail implements RequestUser { +public class LoginEmployeeDetail { @ApiModelProperty("token") private String token; @@ -74,14 +73,4 @@ public class LoginEmployeeDetail implements RequestUser { @ApiModelProperty("请求user-agent") private String userAgent; - - @Override - public Long getUserId() { - return employeeId; - } - - @Override - public String getUserName() { - return actualName; - } } diff --git a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/service/MenuService.java b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/service/MenuService.java index 4b3fa693..d480eaab 100644 --- a/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/service/MenuService.java +++ b/smart-admin-api/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/menu/service/MenuService.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -38,10 +39,6 @@ public class MenuService { @Autowired private MenuDao menuDao; - - @Autowired - private List authUrl; - /** * 添加菜单 * @@ -284,7 +281,8 @@ public class MenuService { * @return */ public ResponseDTO> getAuthUrl() { - return ResponseDTO.ok(authUrl); + // TODO listen + return ResponseDTO.ok(Collections.emptyList()); } } diff --git a/smart-admin-api/sa-common/pom.xml b/smart-admin-api/sa-common/pom.xml index 9620d010..57a6c9c9 100644 --- a/smart-admin-api/sa-common/pom.xml +++ b/smart-admin-api/sa-common/pom.xml @@ -49,7 +49,7 @@ - + cn.dev33 sa-token-spring-boot-starter @@ -60,6 +60,13 @@ sa-token-redis-jackson + + + cn.dev33 + sa-token-jwt + + + org.springframework.boot spring-boot-starter-log4j2 diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/annoation/SaAuth.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/annoation/SaAuth.java deleted file mode 100644 index 4d44a2f7..00000000 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/annoation/SaAuth.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lab1024.sa.common.common.annoation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * 校验权限注解 - * - * @Author 1024创新实验室: 罗伊 - * @Date 2022-05-30 21:22:12 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 ( https://1024lab.net ) - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface SaAuth { - - String saAuth = "saAuth"; -} diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/code/UserErrorCode.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/code/UserErrorCode.java index 6178661a..39221e87 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/code/UserErrorCode.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/code/UserErrorCode.java @@ -32,7 +32,11 @@ public enum UserErrorCode implements ErrorCode { USER_STATUS_ERROR(30008, "用户状态异常"), - FORM_REPEAT_SUBMIT(30009, "请勿重复提交"); + FORM_REPEAT_SUBMIT(30009, "请勿重复提交"), + + LOGIN_FROM_OTHER(30010, "您的账号已在其他地方登录"), + + ; private final int code; diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUser.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUser.java index afce6da7..e7ef34a9 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUser.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/domain/RequestUser.java @@ -1,9 +1,11 @@ package net.lab1024.sa.common.common.domain; +import lombok.Data; import net.lab1024.sa.common.common.enumeration.UserTypeEnum; /** * 请求用户 + * 多系统用户 可以继承此类 * * @Author 1024创新实验室-主任: 卓大 * @Date 2021-12-21 19:55:07 @@ -11,39 +13,31 @@ import net.lab1024.sa.common.common.enumeration.UserTypeEnum; * @Email lab1024@163.com * @Copyright 1024创新实验室 ( https://1024lab.net ) */ -public interface RequestUser { +@Data +public class RequestUser { /** - * 请求用户id - * - * @return + * 当前请求用户id */ - Long getUserId(); + private Long userId; /** - * 请求用户名称 - * - * @return + * 当前请求用户名称 */ - String getUserName(); + private String userName; /** - * 获取用户类型 + * 当前请求用户类型 */ - UserTypeEnum getUserType(); + private UserTypeEnum userType; /** - * 获取请求的IP - * - * @return + * TODO listen 准备移除 + * 为了其他地方不报错 */ - String getIp(); - - /** - * 获取请求 user-agent - * - * @return - */ - String getUserAgent(); + @Deprecated + private String ip; + @Deprecated + private String userAgent; } diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/interceptor/AbstractInterceptor.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/interceptor/AbstractInterceptor.java index 0cb82222..22290a44 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/interceptor/AbstractInterceptor.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/interceptor/AbstractInterceptor.java @@ -1,14 +1,15 @@ package net.lab1024.sa.common.common.interceptor; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import net.lab1024.sa.common.common.annoation.NoNeedLogin; import net.lab1024.sa.common.common.code.UserErrorCode; import net.lab1024.sa.common.common.constant.RequestHeaderConst; +import net.lab1024.sa.common.common.constant.StringConst; import net.lab1024.sa.common.common.domain.RequestUser; import net.lab1024.sa.common.common.domain.ResponseDTO; import net.lab1024.sa.common.common.util.SmartRequestUtil; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.util.CollectionUtils; @@ -19,7 +20,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; -import java.util.function.Function; /** * 抽象拦截器 @@ -32,16 +32,12 @@ import java.util.function.Function; */ public abstract class AbstractInterceptor implements HandlerInterceptor { - @Autowired - private List ignoreUrlList; - - /** * Token获取用户信息 * * @return */ - protected abstract Function userFunction(); + public abstract RequestUser checkTokenAndGetUser(); /** * 拦截路径 @@ -56,6 +52,12 @@ public abstract class AbstractInterceptor implements HandlerInterceptor { * @return */ protected List getIgnoreUrlList() { + List ignoreUrlList = Lists.newArrayList(); + ignoreUrlList.add("/swagger-ui.html"); + ignoreUrlList.add("/swagger-resources/**"); + ignoreUrlList.add("/webjars/**"); + ignoreUrlList.add("/druid/**"); + ignoreUrlList.add("/*/api-docs"); return ignoreUrlList; } @@ -83,7 +85,7 @@ public abstract class AbstractInterceptor implements HandlerInterceptor { //放行的Uri前缀 String uri = request.getRequestURI(); String contextPath = request.getContextPath(); - String target = uri.replaceFirst(contextPath, ""); + String target = uri.replaceFirst(contextPath, StringConst.EMPTY); if (this.contain(this.getIgnoreUrlList(), target)) { return true; } @@ -95,9 +97,9 @@ public abstract class AbstractInterceptor implements HandlerInterceptor { String xAccessToken = StringUtils.isNotBlank(xRequestToken) ? xRequestToken : xHeaderToken; // 包含token 则获取用户信息 并保存 if (StringUtils.isNotBlank(xAccessToken)) { - RequestUser requestUser = userFunction().apply(xAccessToken); + RequestUser requestUser = this.checkTokenAndGetUser(); if (requestUser != null) { - // SmartRequestUtil.setRequestUser(requestUser); + SmartRequestUtil.setUser(requestUser); } // 有token 无需登录 if (null != noNeedLogin) { diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartRequestUtil.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartRequestUtil.java index 03def039..0e22b630 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartRequestUtil.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/common/util/SmartRequestUtil.java @@ -14,9 +14,15 @@ import net.lab1024.sa.common.common.domain.RequestUser; */ @Slf4j public class SmartRequestUtil { + + private static final ThreadLocal LOCAL = new ThreadLocal<>(); + + public static void setUser(RequestUser requestUser) { + LOCAL.set(requestUser); + } + public static RequestUser getUser() { - // TODO listen - return null; + return LOCAL.get(); } public static Long getUserId() { @@ -25,7 +31,7 @@ public class SmartRequestUtil { } public static void remove() { - // TODO listen + LOCAL.remove(); } diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/MvcConfig.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/MvcConfig.java index c08339c9..32956ada 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/MvcConfig.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/MvcConfig.java @@ -4,7 +4,6 @@ import net.lab1024.sa.common.common.interceptor.AbstractInterceptor; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; @@ -25,7 +24,7 @@ import java.util.List; public class MvcConfig implements WebMvcConfigurer { @Autowired(required = false) - private List interceptorList; + private List interceptorList; @Override public void addInterceptors (InterceptorRegistry registry) { @@ -33,7 +32,7 @@ public class MvcConfig implements WebMvcConfigurer { return; } interceptorList.forEach(e->{ - registry.addInterceptor(e).addPathPatterns("/**"); + registry.addInterceptor(e).addPathPatterns(e.pathPatterns()); }); } diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/UrlConfig.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/UrlConfig.java deleted file mode 100644 index 6e8ae116..00000000 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/UrlConfig.java +++ /dev/null @@ -1,150 +0,0 @@ -package net.lab1024.sa.common.config; - -import cn.hutool.core.util.StrUtil; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import net.lab1024.sa.common.common.annoation.NoNeedLogin; -import net.lab1024.sa.common.common.annoation.SaAuth; -import net.lab1024.sa.common.common.domain.RequestUrlVO; -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.mvc.method.RequestMappingInfo; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * url配置 - * - * @Author 1024创新实验室: 罗伊 - * @Date 2022-05-30 21:22:12 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 ( https://1024lab.net ) - */ -@Configuration -@Slf4j -public class UrlConfig { - @Autowired - private RequestMappingHandlerMapping requestMappingHandlerMapping; - - - /** - * 获取每个方法的请求路径 - * - * @return - */ - @Bean - public Map> methodUrlMap() { - Map> methodUrlMap = Maps.newHashMap(); - //获取url与类和方法的对应信息 - Map map = requestMappingHandlerMapping.getHandlerMethods(); - for (Map.Entry entry : map.entrySet()) { - RequestMappingInfo requestMappingInfo = entry.getKey(); - - Set urls = requestMappingInfo.getPatternsCondition().getPatterns(); - if (CollectionUtils.isEmpty(urls)) { - continue; - } - HandlerMethod handlerMethod = entry.getValue(); - methodUrlMap.put(handlerMethod.getMethod(), urls); - } - return methodUrlMap; - } - - /** - * 需要进行url权限校验的方法 - * - * @param methodUrlMap - * @return - */ - @Bean - public List authUrl(Map> methodUrlMap) { - List authUrlList = Lists.newArrayList(); - for (Map.Entry> entry : methodUrlMap.entrySet()) { - Method method = entry.getKey(); - SaAuth saAuth = method.getAnnotation(SaAuth.class); - if (null == saAuth) { - continue; - } - List requestUrlList = this.buildRequestUrl(method, entry.getValue()); - authUrlList.addAll(requestUrlList); - } - log.info("需要权限校验的URL:{}", authUrlList.stream().map(e -> e.getUrl()).collect(Collectors.toList())); - return authUrlList; - } - - private List buildRequestUrl(Method method, Set urlSet) { - List requestUrlList = Lists.newArrayList(); - if (CollectionUtils.isEmpty(urlSet)) { - return requestUrlList; - } - //url对应的方法名称 - String className = method.getDeclaringClass().getName(); - String methodName = method.getName(); - List list = StrUtil.split(className, "."); - String controllerName = list.get(list.size() - 1); - String name = controllerName + "." + methodName; - //swagger 说明信息 - String methodComment = null; - ApiOperation apiOperation = method.getAnnotation(ApiOperation.class); - if (apiOperation != null) { - methodComment = apiOperation.value(); - } - for (String url : urlSet) { - RequestUrlVO requestUrlVO = new RequestUrlVO(); - requestUrlVO.setUrl(url); - requestUrlVO.setName(name); - requestUrlVO.setComment(methodComment); - requestUrlList.add(requestUrlVO); - } - return requestUrlList; - } - - - /** - * 获取无需登录可以匿名访问的url信息 - * - * @return - */ - @Bean - public List noNeedLoginUrlList(Map> methodUrlMap) { - List noNeedLoginUrlList = Lists.newArrayList(); - for (Map.Entry> entry : methodUrlMap.entrySet()) { - Method method = entry.getKey(); - NoNeedLogin noNeedLogin = method.getAnnotation(NoNeedLogin.class); - if (null == noNeedLogin) { - continue; - } - noNeedLoginUrlList.addAll(entry.getValue()); - } - log.info("不需要登录的URL:{}", noNeedLoginUrlList); - return noNeedLoginUrlList; - } - - /** - * 获取忽略的url信息 - * - * @return - */ - @Bean - public List ignoreUrlList() { - List ignoreUrlList = Lists.newArrayList(); - ignoreUrlList.add("/swagger-ui.html"); - ignoreUrlList.add("/swagger-resources/**"); - ignoreUrlList.add("/webjars/**"); - ignoreUrlList.add("/druid/**"); - ignoreUrlList.add("/*/api-docs"); - return ignoreUrlList; - } - -} \ No newline at end of file diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/satoken/SaTokenConfig.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/satoken/SaTokenConfig.java new file mode 100644 index 00000000..4475d0ef --- /dev/null +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/config/satoken/SaTokenConfig.java @@ -0,0 +1,29 @@ +package net.lab1024.sa.common.config.satoken; + +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: listen + * @date: 2023/7/12 20:46 + */ +@Configuration +public class SaTokenConfig { + + /** + * 整合 jwt + * + * @return + * @see https://sa-token.cc/doc.html#/plugin/jwt-extend + */ + @Bean + public StpLogic getStpLogicJwt() { + // Simple 简单模式 + return new StpLogicJwtForSimple(); + } + +} diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/handler/GlobalExceptionHandler.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/handler/GlobalExceptionHandler.java index ea17fd75..fa3e1bb9 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/handler/GlobalExceptionHandler.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/handler/GlobalExceptionHandler.java @@ -1,5 +1,6 @@ package net.lab1024.sa.common.handler; +import cn.dev33.satoken.exception.NotLoginException; import lombok.extern.slf4j.Slf4j; import net.lab1024.sa.common.common.code.SystemErrorCode; import net.lab1024.sa.common.common.code.UserErrorCode; @@ -88,6 +89,34 @@ public class GlobalExceptionHandler { return ResponseDTO.error(SystemErrorCode.SYSTEM_ERROR, e.getMessage()); } + /** + * sa-token 登录异常处理 + * + * @param nle + * @return + * @throws Exception + */ + @ResponseBody + @ExceptionHandler(NotLoginException.class) + public ResponseDTO handlerNotLoginException(NotLoginException nle) { + /** + * 判断场景值 自己根据业务在下面 switch 添加分支判断 + * NotLoginException.NOT_TOKEN 无token + * NotLoginException.INVALID_TOKEN token无效 + * NotLoginException.TOKEN_TIMEOUT token过期 + * NotLoginException.NO_PREFIX token缺少前缀 + * NotLoginException.KICK_OUT 已被踢下线 + * NotLoginException.TOKEN_FREEZE 已被冻结 + */ + switch (nle.getType()) { + case NotLoginException.BE_REPLACED: + // token 已被顶下线 + return ResponseDTO.error(UserErrorCode.LOGIN_FROM_OTHER); + default: + return ResponseDTO.error(UserErrorCode.LOGIN_STATE_INVALID); + } + } + /** * 其他全部异常 * diff --git a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/module/support/token/TokenService.java b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/module/support/token/TokenService.java index 13daa2f9..3a19712a 100644 --- a/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/module/support/token/TokenService.java +++ b/smart-admin-api/sa-common/src/main/java/net/lab1024/sa/common/module/support/token/TokenService.java @@ -2,6 +2,7 @@ package net.lab1024.sa.common.module.support.token; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import net.lab1024.sa.common.common.constant.StringConst; import net.lab1024.sa.common.common.enumeration.UserTypeEnum; import org.springframework.stereotype.Component; @@ -19,9 +20,9 @@ import java.util.List; @Component public class TokenService { - private static final String EXTRA_KEY_USER_NAME = "userName"; + public static final String EXTRA_KEY_USER_NAME = "userName"; - private static final String EXTRA_KEY_USER_TYPE = "userType"; + public static final String EXTRA_KEY_USER_TYPE = "userType"; /** * 生成Token @@ -55,7 +56,11 @@ public class TokenService { } public static String generateLoginId(Long userId, UserTypeEnum userType) { - return userType.getValue() + "_" + userId; + return userType.getValue() + StringConst.UNDERLINE + userId; + } + + public static Long getUserId(String loginId) { + return Long.valueOf(loginId.substring(loginId.indexOf(StringConst.UNDERLINE) + 1)); } /** diff --git a/smart-admin-api/sa-common/src/main/resources/dev/sa-common.yaml b/smart-admin-api/sa-common/src/main/resources/dev/sa-common.yaml index 73a3c270..047a15cd 100644 --- a/smart-admin-api/sa-common/src/main/resources/dev/sa-common.yaml +++ b/smart-admin-api/sa-common/src/main/resources/dev/sa-common.yaml @@ -124,17 +124,19 @@ reload: sa-token: # token 名称(同时也是 cookie 名称) token-name: x-access-token - # token 前缀 + # token 前缀 例如:Bear token-prefix: + # jwt秘钥 + jwt-secret-key: smart-admin # token 有效期(单位:秒) 默认30天,-1 代表永久有效 timeout: 2592000 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 active-timeout: 28800 # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) is-concurrent: false - # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)(jwt模式下恒false) is-share: false - # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)(jwt模式下无用) token-style: simple-uuid # 是否输出操作日志 is-log: true \ No newline at end of file