From 6ca853516671882e8e54d9630a4299f12fbcf9aa Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期四, 13 一月 2022 11:14:33 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/satoken' into dev --- ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java | 28 ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java | 31 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java | 4 ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java | 27 ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java | 26 ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java | 81 +- ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java | 22 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java | 66 + ruoyi-generator/src/main/resources/vm/java/controller.java.vm | 14 ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java | 107 +++ ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java | 5 ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java | 121 ++++ ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java | 16 ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java | 178 ++++++ ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java | 16 ruoyi-admin/src/main/resources/application.yml | 46 + ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java | 4 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java | 62 ++ ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java | 13 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java | 30 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java | 63 ++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 4 ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java | 38 + ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java | 27 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java | 138 ++++ ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java | 58 - pom.xml | 14 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java | 6 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java | 14 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java | 36 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java | 38 - ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java | 28 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java | 12 ruoyi-common/pom.xml | 16 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java | 14 /dev/null | 56 - ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 3 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java | 37 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java | 8 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java | 16 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java | 14 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java | 14 ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java | 10 ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java | 8 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java | 10 ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java | 10 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java | 12 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java | 67 -- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java | 3 ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java | 10 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java | 18 52 files changed, 1,174 insertions(+), 529 deletions(-) diff --git a/pom.xml b/pom.xml index 16501c3..7763720 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ <easyexcel.version>2.2.11</easyexcel.version> <cglib.version>3.3.0</cglib.version> <velocity.version>2.3</velocity.version> + <satoken.version>1.28.0</satoken.version> <mybatis-plus.version>3.5.0</mybatis-plus.version> <p6spy.version>3.9.1</p6spy.version> <hutool.version>5.7.18</hutool.version> @@ -137,6 +138,19 @@ <version>${velocity.version}</version> </dependency> + <!-- Sa-Token 鏉冮檺璁よ瘉, 鍦ㄧ嚎鏂囨。锛歨ttp://sa-token.dev33.cn/ --> + <dependency> + <groupId>cn.dev33</groupId> + <artifactId>sa-token-spring-boot-starter</artifactId> + <version>${satoken.version}</version> + </dependency> + <!-- Sa-Token 鏁村悎 jwt --> + <dependency> + <groupId>cn.dev33</groupId> + <artifactId>sa-token-jwt</artifactId> + <version>${satoken.version}</version> + </dependency> + <!-- jdk11 缂哄け渚濊禆 jaxb--> <dependency> <groupId>com.sun.xml.bind</groupId> diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index ef81c99..255f0b1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; @@ -9,7 +10,6 @@ import org.springframework.data.redis.connection.RedisServerCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -30,7 +30,7 @@ private final RedisTemplate<String, String> redisTemplate; @ApiOperation("鑾峰彇缂撳瓨鐩戞帶璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @SaCheckPermission("monitor:cache:list") @GetMapping() public AjaxResult<Map<String, Object>> getInfo() throws Exception { Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::info); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 106605a..22acf31 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -13,7 +14,6 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +35,7 @@ private final ISysLogininforService logininforService; @ApiOperation("鏌ヨ绯荤粺璁块棶璁板綍鍒楄〃") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @SaCheckPermission("monitor:logininfor:list") @GetMapping("/list") public TableDataInfo<SysLogininfor> list(SysLogininfor logininfor, PageQuery pageQuery) { return logininforService.selectPageLogininforList(logininfor, pageQuery); @@ -43,7 +43,7 @@ @ApiOperation("瀵煎嚭绯荤粺璁块棶璁板綍鍒楄〃") @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @SaCheckPermission("monitor:logininfor:export") @PostMapping("/export") public void export(SysLogininfor logininfor, HttpServletResponse response) { List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); @@ -51,7 +51,7 @@ } @ApiOperation("鍒犻櫎绯荤粺璁块棶璁板綍") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @SaCheckPermission("monitor:logininfor:remove") @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE) @DeleteMapping("/{infoIds}") public AjaxResult<Void> remove(@PathVariable Long[] infoIds) { @@ -59,7 +59,7 @@ } @ApiOperation("娓呯┖绯荤粺璁块棶璁板綍") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @SaCheckPermission("monitor:logininfor:remove") @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") public AjaxResult<Void> clean() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 8af5832..e510429 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -13,7 +14,6 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +35,7 @@ private final ISysOperLogService operLogService; @ApiOperation("鏌ヨ鎿嶄綔鏃ュ織璁板綍鍒楄〃") - @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @SaCheckPermission("monitor:operlog:list") @GetMapping("/list") public TableDataInfo<SysOperLog> list(SysOperLog operLog, PageQuery pageQuery) { return operLogService.selectPageOperLogList(operLog, pageQuery); @@ -43,7 +43,7 @@ @ApiOperation("瀵煎嚭鎿嶄綔鏃ュ織璁板綍鍒楄〃") @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @SaCheckPermission("monitor:operlog:export") @PostMapping("/export") public void export(SysOperLog operLog, HttpServletResponse response) { List<SysOperLog> list = operLogService.selectOperLogList(operLog); @@ -52,7 +52,7 @@ @ApiOperation("鍒犻櫎鎿嶄綔鏃ュ織璁板綍") @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.DELETE) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/{operIds}") public AjaxResult<Void> remove(@PathVariable Long[] operIds) { return toAjax(operLogService.deleteOperLogByIds(operIds)); @@ -60,7 +60,7 @@ @ApiOperation("娓呯┖鎿嶄綔鏃ュ織璁板綍") @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/clean") public AjaxResult<Void> clean() { operLogService.cleanOperLog(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 6c96564..90003ef 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,27 +1,30 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpLogic; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.domain.dto.UserOnlineDTO; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶 @@ -34,34 +37,38 @@ @RequestMapping("/monitor/online") public class SysUserOnlineController extends BaseController { - private final ISysUserOnlineService userOnlineService; - @ApiOperation("鍦ㄧ嚎鐢ㄦ埛鍒楄〃") - @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @SaCheckPermission("monitor:online:list") @GetMapping("/list") public TableDataInfo<SysUserOnline> list(String ipaddr, String userName) { - Collection<String> keys = RedisUtils.keys(Constants.LOGIN_TOKEN_KEY + "*"); - List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>(); + // 鑾峰彇鎵�鏈夋湭杩囨湡鐨� token + List<String> keys = StpUtil.searchTokenValue("", -1, 0); + List<UserOnlineDTO> userOnlineDTOList = new ArrayList<>(); for (String key : keys) { - LoginUser user = RedisUtils.getCacheObject(key); - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); - } - } else if (StringUtils.isNotEmpty(ipaddr)) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); - } - } else if (StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); - } - } else { - userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + String token = key.replace(Constants.LOGIN_TOKEN_KEY, ""); + // 濡傛灉宸茬粡杩囨湡鍒欒涪涓嬬嚎 + if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) { + continue; } + userOnlineDTOList.add(RedisUtils.getCacheObject(Constants.ONLINE_TOKEN_KEY + token)); } - Collections.reverse(userOnlineList); - userOnlineList.removeAll(Collections.singleton(null)); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr())) + .collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List<SysUserOnline> userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); return TableDataInfo.build(userOnlineList); } @@ -69,11 +76,14 @@ * 寮洪��鐢ㄦ埛 */ @ApiOperation("寮洪��鐢ㄦ埛") - @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @SaCheckPermission("monitor:online:forceLogout") @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE) @DeleteMapping("/{tokenId}") public AjaxResult<Void> forceLogout(@PathVariable String tokenId) { - RedisUtils.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException e) { + } return AjaxResult.success(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index e646b9a..0b8a928 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃 */ @ApiOperation("鑾峰彇鍙傛暟閰嶇疆鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:config:list')") + @SaCheckPermission("system:config:list") @GetMapping("/list") public TableDataInfo<SysConfig> list(SysConfig config, PageQuery pageQuery) { return configService.selectPageConfigList(config, pageQuery); @@ -48,7 +48,7 @@ @ApiOperation("瀵煎嚭鍙傛暟閰嶇疆鍒楄〃") @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:config:export')") + @SaCheckPermission("system:config:export") @PostMapping("/export") public void export(SysConfig config, HttpServletResponse response) { List<SysConfig> list = configService.selectConfigList(config); @@ -59,7 +59,7 @@ * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:config:query')") + @SaCheckPermission("system:config:query") @GetMapping(value = "/{configId}") public AjaxResult<SysConfig> getInfo(@ApiParam("鍙傛暟ID") @PathVariable Long configId) { return AjaxResult.success(configService.selectConfigById(configId)); @@ -78,7 +78,7 @@ * 鏂板鍙傛暟閰嶇疆 */ @ApiOperation("鏂板鍙傛暟閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:config:add')") + @SaCheckPermission("system:config:add") @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysConfig config) { @@ -92,7 +92,7 @@ * 淇敼鍙傛暟閰嶇疆 */ @ApiOperation("淇敼鍙傛暟閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:config:edit')") + @SaCheckPermission("system:config:edit") @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysConfig config) { @@ -106,7 +106,7 @@ * 鍒犻櫎鍙傛暟閰嶇疆 */ @ApiOperation("鍒犻櫎鍙傛暟閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @SaCheckPermission("system:config:remove") @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{configIds}") public AjaxResult<Void> remove(@ApiParam("鍙傛暟ID涓�") @PathVariable Long[] configIds) { @@ -118,7 +118,7 @@ * 鍒锋柊鍙傛暟缂撳瓨 */ @ApiOperation("鍒锋柊鍙傛暟缂撳瓨") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @SaCheckPermission("system:config:remove") @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") public AjaxResult<Void> refreshCache() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index e47b1e8..08ebf96 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import com.ruoyi.common.annotation.Log; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -41,7 +41,7 @@ * 鑾峰彇閮ㄩ棬鍒楄〃 */ @ApiOperation("鑾峰彇閮ㄩ棬鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @SaCheckPermission("system:dept:list") @GetMapping("/list") public AjaxResult<List<SysDept>> list(SysDept dept) { List<SysDept> depts = deptService.selectDeptList(dept); @@ -52,7 +52,7 @@ * 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級 */ @ApiOperation("鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @SaCheckPermission("system:dept:list") @GetMapping("/list/exclude/{deptId}") public AjaxResult<List<SysDept>> excludeChild(@ApiParam("閮ㄩ棬ID") @PathVariable(value = "deptId", required = false) Long deptId) { List<SysDept> depts = deptService.selectDeptList(new SysDept()); @@ -65,7 +65,7 @@ * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:dept:query')") + @SaCheckPermission("system:dept:query") @GetMapping(value = "/{deptId}") public AjaxResult<SysDept> getInfo(@ApiParam("閮ㄩ棬ID") @PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); @@ -99,7 +99,7 @@ * 鏂板閮ㄩ棬 */ @ApiOperation("鏂板閮ㄩ棬") - @PreAuthorize("@ss.hasPermi('system:dept:add')") + @SaCheckPermission("system:dept:add") @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysDept dept) { @@ -113,7 +113,7 @@ * 淇敼閮ㄩ棬 */ @ApiOperation("淇敼閮ㄩ棬") - @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @SaCheckPermission("system:dept:edit") @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysDept dept) { @@ -132,7 +132,7 @@ * 鍒犻櫎閮ㄩ棬 */ @ApiOperation("鍒犻櫎閮ㄩ棬") - @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @SaCheckPermission("system:dept:remove") @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}") public AjaxResult<Void> remove(@ApiParam("閮ㄩ棬ID涓�") @PathVariable Long deptId) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 07cb74e..851cf4e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -16,7 +17,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ private final ISysDictTypeService dictTypeService; @ApiOperation("鏌ヨ瀛楀吀鏁版嵁鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo<SysDictData> list(SysDictData dictData, PageQuery pageQuery) { return dictDataService.selectPageDictDataList(dictData, pageQuery); @@ -48,7 +48,7 @@ @ApiOperation("瀵煎嚭瀛楀吀鏁版嵁鍒楄〃") @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictData dictData, HttpServletResponse response) { List<SysDictData> list = dictDataService.selectDictDataList(dictData); @@ -59,7 +59,7 @@ * 鏌ヨ瀛楀吀鏁版嵁璇︾粏 */ @ApiOperation("鏌ヨ瀛楀吀鏁版嵁璇︾粏") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictCode}") public AjaxResult<SysDictData> getInfo(@ApiParam("瀛楀吀code") @PathVariable Long dictCode) { return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); @@ -82,7 +82,7 @@ * 鏂板瀛楀吀绫诲瀷 */ @ApiOperation("鏂板瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @SaCheckPermission("system:dict:add") @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysDictData dict) { @@ -93,7 +93,7 @@ * 淇敼淇濆瓨瀛楀吀绫诲瀷 */ @ApiOperation("淇敼淇濆瓨瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @SaCheckPermission("system:dict:edit") @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysDictData dict) { @@ -104,7 +104,7 @@ * 鍒犻櫎瀛楀吀绫诲瀷 */ @ApiOperation("鍒犻櫎瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) @DeleteMapping("/{dictCodes}") public AjaxResult<Void> remove(@ApiParam("瀛楀吀code涓�") @PathVariable Long[] dictCodes) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index ca43783..9d98f9b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -37,7 +37,7 @@ private final ISysDictTypeService dictTypeService; @ApiOperation("鏌ヨ瀛楀吀绫诲瀷鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo<SysDictType> list(SysDictType dictType, PageQuery pageQuery) { return dictTypeService.selectPageDictTypeList(dictType, pageQuery); @@ -45,7 +45,7 @@ @ApiOperation("瀵煎嚭瀛楀吀绫诲瀷鍒楄〃") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictType dictType, HttpServletResponse response) { List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); @@ -56,7 +56,7 @@ * 鏌ヨ瀛楀吀绫诲瀷璇︾粏 */ @ApiOperation("鏌ヨ瀛楀吀绫诲瀷璇︾粏") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictId}") public AjaxResult<SysDictType> getInfo(@ApiParam("瀛楀吀ID") @PathVariable Long dictId) { return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); @@ -66,7 +66,7 @@ * 鏂板瀛楀吀绫诲瀷 */ @ApiOperation("鏂板瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @SaCheckPermission("system:dict:add") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysDictType dict) { @@ -80,7 +80,7 @@ * 淇敼瀛楀吀绫诲瀷 */ @ApiOperation("淇敼瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @SaCheckPermission("system:dict:edit") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysDictType dict) { @@ -94,7 +94,7 @@ * 鍒犻櫎瀛楀吀绫诲瀷 */ @ApiOperation("鍒犻櫎瀛楀吀绫诲瀷") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE) @DeleteMapping("/{dictIds}") public AjaxResult<Void> remove(@ApiParam("瀛楀吀ID涓�") @PathVariable Long[] dictIds) { @@ -106,7 +106,7 @@ * 鍒锋柊瀛楀吀缂撳瓨 */ @ApiOperation("鍒锋柊瀛楀吀缂撳瓨") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @SaCheckPermission("system:dict:remove") @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") public AjaxResult<Void> refreshCache() { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 9e51823..6322ed5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,14 +1,17 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; -import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysLoginService; import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.Api; @@ -39,7 +42,6 @@ private final SysLoginService loginService; private final ISysMenuService menuService; - private final ISysUserService userService; private final SysPermissionService permissionService; /** @@ -59,6 +61,16 @@ return AjaxResult.success(ajax); } + @ApiOperation("鐧诲嚭鏂规硶") + @PostMapping("/logout") + public AjaxResult<Void> logout(){ + try { + StpUtil.logout(); + } catch (NotLoginException e) { + } + return AjaxResult.success("閫�鍑烘垚鍔�"); + } + /** * 鑾峰彇鐢ㄦ埛淇℃伅 * @@ -67,7 +79,7 @@ @ApiOperation("鑾峰彇鐢ㄦ埛淇℃伅") @GetMapping("getInfo") public AjaxResult<Map<String, Object>> getInfo() { - SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); // 瑙掕壊闆嗗悎 Set<String> roles = permissionService.getRolePermission(user); // 鏉冮檺闆嗗悎 @@ -87,7 +99,7 @@ @ApiOperation("鑾峰彇璺敱淇℃伅") @GetMapping("getRouters") public AjaxResult<List<RouterVo>> getRouters() { - Long userId = SecurityUtils.getUserId(); + Long userId = LoginUtils.getUserId(); List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId); return AjaxResult.success(menuService.buildMenus(menus)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index a525ac4..118f87b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; @@ -14,7 +15,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ * 鑾峰彇鑿滃崟鍒楄〃 */ @ApiOperation("鑾峰彇鑿滃崟鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:menu:list')") + @SaCheckPermission("system:menu:list") @GetMapping("/list") public AjaxResult<List<SysMenu>> list(SysMenu menu) { List<SysMenu> menus = menuService.selectMenuList(menu, getUserId()); @@ -51,7 +51,7 @@ * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:menu:query')") + @SaCheckPermission("system:menu:query") @GetMapping(value = "/{menuId}") public AjaxResult<SysMenu> getInfo(@ApiParam("鑿滃崟ID") @PathVariable Long menuId) { return AjaxResult.success(menuService.selectMenuById(menuId)); @@ -84,7 +84,7 @@ * 鏂板鑿滃崟 */ @ApiOperation("鏂板鑿滃崟") - @PreAuthorize("@ss.hasPermi('system:menu:add')") + @SaCheckPermission("system:menu:add") @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysMenu menu) { @@ -100,7 +100,7 @@ * 淇敼鑿滃崟 */ @ApiOperation("淇敼鑿滃崟") - @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @SaCheckPermission("system:menu:edit") @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysMenu menu) { @@ -118,7 +118,7 @@ * 鍒犻櫎鑿滃崟 */ @ApiOperation("鍒犻櫎鑿滃崟") - @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @SaCheckPermission("system:menu:remove") @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{menuId}") public AjaxResult<Void> remove(@ApiParam("鑿滃崟ID") @PathVariable("menuId") Long menuId) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index 337bf32..23e8593 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -8,14 +9,13 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.service.ISysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; /** * 鍏憡 淇℃伅鎿嶄綔澶勭悊 @@ -35,7 +35,7 @@ * 鑾峰彇閫氱煡鍏憡鍒楄〃 */ @ApiOperation("鑾峰彇閫氱煡鍏憡鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:notice:list')") + @SaCheckPermission("system:notice:list") @GetMapping("/list") public TableDataInfo<SysNotice> list(SysNotice notice, PageQuery pageQuery) { return noticeService.selectPageNoticeList(notice, pageQuery); @@ -45,7 +45,7 @@ * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:notice:query')") + @SaCheckPermission("system:notice:query") @GetMapping(value = "/{noticeId}") public AjaxResult<SysNotice> getInfo(@ApiParam("鍏憡ID") @PathVariable Long noticeId) { return AjaxResult.success(noticeService.selectNoticeById(noticeId)); @@ -55,7 +55,7 @@ * 鏂板閫氱煡鍏憡 */ @ApiOperation("鏂板閫氱煡鍏憡") - @PreAuthorize("@ss.hasPermi('system:notice:add')") + @SaCheckPermission("system:notice:add") @Log(title = "閫氱煡鍏憡", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysNotice notice) { @@ -66,7 +66,7 @@ * 淇敼閫氱煡鍏憡 */ @ApiOperation("淇敼閫氱煡鍏憡") - @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @SaCheckPermission("system:notice:edit") @Log(title = "閫氱煡鍏憡", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysNotice notice) { @@ -77,7 +77,7 @@ * 鍒犻櫎閫氱煡鍏憡 */ @ApiOperation("鍒犻櫎閫氱煡鍏憡") - @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @SaCheckPermission("system:notice:remove") @Log(title = "閫氱煡鍏憡", businessType = BusinessType.DELETE) @DeleteMapping("/{noticeIds}") public AjaxResult<Void> remove(@ApiParam("鍏憡ID涓�") @PathVariable Long[] noticeIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index 803f95e..0562cdf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; @@ -18,7 +19,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -46,7 +46,7 @@ * 鏌ヨ瀵硅薄瀛樺偍閰嶇疆鍒楄〃 */ @ApiOperation("鏌ヨ瀵硅薄瀛樺偍閰嶇疆鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo<SysOssConfigVo> list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { return iSysOssConfigService.queryPageList(bo, pageQuery); @@ -56,7 +56,7 @@ * 鑾峰彇瀵硅薄瀛樺偍閰嶇疆璇︾粏淇℃伅 */ @ApiOperation("鑾峰彇瀵硅薄瀛樺偍閰嶇疆璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:oss:query')") + @SaCheckPermission("system:oss:query") @GetMapping("/{ossConfigId}") public AjaxResult<SysOssConfigVo> getInfo(@ApiParam("OSS閰嶇疆ID") @NotNull(message = "涓婚敭涓嶈兘涓虹┖") @@ -68,7 +68,7 @@ * 鏂板瀵硅薄瀛樺偍閰嶇疆 */ @ApiOperation("鏂板瀵硅薄瀛樺偍閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:oss:add')") + @SaCheckPermission("system:oss:add") @Log(title = "瀵硅薄瀛樺偍閰嶇疆", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -80,7 +80,7 @@ * 淇敼瀵硅薄瀛樺偍閰嶇疆 */ @ApiOperation("淇敼瀵硅薄瀛樺偍閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "瀵硅薄瀛樺偍閰嶇疆", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -92,7 +92,7 @@ * 鍒犻櫎瀵硅薄瀛樺偍閰嶇疆 */ @ApiOperation("鍒犻櫎瀵硅薄瀛樺偍閰嶇疆") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @SaCheckPermission("system:oss:remove") @Log(title = "瀵硅薄瀛樺偍閰嶇疆", businessType = BusinessType.DELETE) @DeleteMapping("/{ossConfigIds}") public AjaxResult<Void> remove(@ApiParam("OSS閰嶇疆ID涓�") @@ -105,7 +105,7 @@ * 鐘舵�佷慨鏀� */ @ApiOperation("鐘舵�佷慨鏀�") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "瀵硅薄瀛樺偍鐘舵�佷慨鏀�", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public AjaxResult<Void> changeStatus(@RequestBody SysOssConfigBo bo) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index b966879..5a35a49 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -1,6 +1,7 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpException; @@ -27,7 +28,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -59,7 +59,7 @@ * 鏌ヨOSS瀵硅薄瀛樺偍鍒楄〃 */ @ApiOperation("鏌ヨOSS瀵硅薄瀛樺偍鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo<SysOssVo> list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { return iSysOssService.queryPageList(bo, pageQuery); @@ -72,7 +72,7 @@ @ApiImplicitParams({ @ApiImplicitParam(name = "file", value = "鏂囦欢", dataTypeClass = File.class, required = true), }) - @PreAuthorize("@ss.hasPermi('system:oss:upload')") + @SaCheckPermission("system:oss:upload") @Log(title = "OSS瀵硅薄瀛樺偍", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping("/upload") @@ -88,7 +88,7 @@ } @ApiOperation("涓嬭浇OSS瀵硅薄瀛樺偍") - @PreAuthorize("@ss.hasPermi('system:oss:download')") + @SaCheckPermission("system:oss:download") @GetMapping("/download/{ossId}") public void download(@ApiParam("OSS瀵硅薄ID") @PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); @@ -115,7 +115,7 @@ * 鍒犻櫎OSS瀵硅薄瀛樺偍 */ @ApiOperation("鍒犻櫎OSS瀵硅薄瀛樺偍") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @SaCheckPermission("system:oss:remove") @Log(title = "OSS瀵硅薄瀛樺偍", businessType = BusinessType.DELETE) @DeleteMapping("/{ossIds}") public AjaxResult<Void> remove(@ApiParam("OSS瀵硅薄ID涓�") @@ -128,7 +128,7 @@ * 鍙樻洿鍥剧墖鍒楄〃棰勮鐘舵�� */ @ApiOperation("鍙樻洿鍥剧墖鍒楄〃棰勮鐘舵��") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @Log(title = "OSS瀵硅薄瀛樺偍", businessType = BusinessType.UPDATE) @PutMapping("/changePreviewListResource") public AjaxResult<Void> changePreviewListResource(@RequestBody String body) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 4f119e4..6b383a4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -15,7 +16,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,7 +40,7 @@ * 鑾峰彇宀椾綅鍒楄〃 */ @ApiOperation("鑾峰彇宀椾綅鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:post:list')") + @SaCheckPermission("system:post:list") @GetMapping("/list") public TableDataInfo<SysPost> list(SysPost post, PageQuery pageQuery) { return postService.selectPagePostList(post, pageQuery); @@ -48,7 +48,7 @@ @ApiOperation("瀵煎嚭宀椾綅鍒楄〃") @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:post:export')") + @SaCheckPermission("system:post:export") @PostMapping("/export") public void export(SysPost post, HttpServletResponse response) { List<SysPost> list = postService.selectPostList(post); @@ -59,7 +59,7 @@ * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:post:query')") + @SaCheckPermission("system:post:query") @GetMapping(value = "/{postId}") public AjaxResult<SysPost> getInfo(@ApiParam("宀椾綅ID") @PathVariable Long postId) { return AjaxResult.success(postService.selectPostById(postId)); @@ -69,7 +69,7 @@ * 鏂板宀椾綅 */ @ApiOperation("鏂板宀椾綅") - @PreAuthorize("@ss.hasPermi('system:post:add')") + @SaCheckPermission("system:post:add") @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysPost post) { @@ -85,7 +85,7 @@ * 淇敼宀椾綅 */ @ApiOperation("淇敼宀椾綅") - @PreAuthorize("@ss.hasPermi('system:post:edit')") + @SaCheckPermission("system:post:edit") @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysPost post) { @@ -101,7 +101,7 @@ * 鍒犻櫎宀椾綅 */ @ApiOperation("鍒犻櫎宀椾綅") - @PreAuthorize("@ss.hasPermi('system:post:remove')") + @SaCheckPermission("system:post:remove") @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{postIds}") public AjaxResult<Void> remove(@ApiParam("宀椾綅ID涓�") @PathVariable Long[] postIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 6a7f5ed..5e432ab 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -5,10 +5,12 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.service.ISysOssService; import com.ruoyi.system.service.ISysUserService; @@ -47,12 +49,11 @@ @ApiOperation("涓汉淇℃伅") @GetMapping public AjaxResult<Map<String, Object>> profile() { - LoginUser loginUser = getLoginUser(); - SysUser user = userService.selectUserById(loginUser.getUserId()); - Map<String, Object> ajax = new HashMap<>(); - ajax.put("user", user); - ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); - ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + SysUser user = userService.getById(getUserId()); + Map<String, Object> ajax = new HashMap<>(); + ajax.put("user", user); + ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserName())); + ajax.put("postGroup", userService.selectUserPostGroup(user.getUserName())); return AjaxResult.success(ajax); } @@ -71,9 +72,7 @@ && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪"); } - LoginUser loginUser = getLoginUser(); - SysUser sysUser = userService.selectUserById(loginUser.getUserId()); - user.setUserId(sysUser.getUserId()); + user.setUserId(getUserId()); user.setUserName(null); user.setPassword(null); if (userService.updateUserProfile(user) > 0) { @@ -93,7 +92,7 @@ @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") public AjaxResult<Void> updatePwd(String oldPassword, String newPassword) { - SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); String userName = user.getUserName(); String password = user.getPassword(); if (!SecurityUtils.matchesPassword(oldPassword, password)) { @@ -118,12 +117,11 @@ @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE) @PostMapping("/avatar") public AjaxResult<Map<String, Object>> avatar(@RequestPart("avatarfile") MultipartFile file) { - Map<String, Object> ajax = new HashMap<>(); + Map<String,Object> ajax = new HashMap<>(); if (!file.isEmpty()) { - LoginUser loginUser = getLoginUser(); - SysOss oss = iSysOssService.upload(file); - String avatar = oss.getUrl(); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + SysOss oss = iSysOssService.upload(file); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(getUsername(), avatar)) { ajax.put("imgUrl", avatar); return AjaxResult.success(ajax); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 9ddb217..ee0a4d4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; @@ -9,8 +10,8 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.TokenService; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysUserRole; @@ -20,7 +21,6 @@ import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -40,12 +40,11 @@ public class SysRoleController extends BaseController { private final ISysRoleService roleService; - private final TokenService tokenService; private final ISysUserService userService; private final SysPermissionService permissionService; @ApiOperation("鏌ヨ瑙掕壊淇℃伅鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/list") public TableDataInfo<SysRole> list(SysRole role, PageQuery pageQuery) { return roleService.selectPageRoleList(role, pageQuery); @@ -53,7 +52,7 @@ @ApiOperation("瀵煎嚭瑙掕壊淇℃伅鍒楄〃") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:role:export')") + @SaCheckPermission("system:role:export") @PostMapping("/export") public void export(SysRole role, HttpServletResponse response) { List<SysRole> list = roleService.selectRoleList(role); @@ -64,7 +63,7 @@ * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @SaCheckPermission("system:role:query") @GetMapping(value = "/{roleId}") public AjaxResult<SysRole> getInfo(@ApiParam("瑙掕壊ID") @PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); @@ -75,7 +74,7 @@ * 鏂板瑙掕壊 */ @ApiOperation("鏂板瑙掕壊") - @PreAuthorize("@ss.hasPermi('system:role:add')") + @SaCheckPermission("system:role:add") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysRole role) { @@ -92,7 +91,7 @@ * 淇敼淇濆瓨瑙掕壊 */ @ApiOperation("淇敼淇濆瓨瑙掕壊") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysRole role) { @@ -108,8 +107,8 @@ LoginUser loginUser = getLoginUser(); SysUser sysUser = userService.selectUserById(loginUser.getUserId()); if (StringUtils.isNotNull(sysUser) && !sysUser.isAdmin()) { - loginUser.setMenuPermissions(permissionService.getMenuPermission(sysUser)); - tokenService.setLoginUser(loginUser); + loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser)); + LoginUtils.setLoginUser(loginUser); } return AjaxResult.success(); } @@ -120,7 +119,7 @@ * 淇敼淇濆瓨鏁版嵁鏉冮檺 */ @ApiOperation("淇敼淇濆瓨鏁版嵁鏉冮檺") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) @PutMapping("/dataScope") public AjaxResult<Void> dataScope(@RequestBody SysRole role) { @@ -132,7 +131,7 @@ * 鐘舵�佷慨鏀� */ @ApiOperation("鐘舵�佷慨鏀�") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public AjaxResult<Void> changeStatus(@RequestBody SysRole role) { @@ -144,7 +143,7 @@ * 鍒犻櫎瑙掕壊 */ @ApiOperation("鍒犻櫎瑙掕壊") - @PreAuthorize("@ss.hasPermi('system:role:remove')") + @SaCheckPermission("system:role:remove") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{roleIds}") public AjaxResult<Void> remove(@ApiParam("宀椾綅ID涓�") @PathVariable Long[] roleIds) { @@ -155,7 +154,7 @@ * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛� */ @ApiOperation("鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @SaCheckPermission("system:role:query") @GetMapping("/optionselect") public AjaxResult<List<SysRole>> optionselect() { return AjaxResult.success(roleService.selectRoleAll()); @@ -165,7 +164,7 @@ * 鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛� */ @ApiOperation("鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛�") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/allocatedList") public TableDataInfo<SysUser> allocatedList(SysUser user, PageQuery pageQuery) { return userService.selectAllocatedList(user, pageQuery); @@ -175,7 +174,7 @@ * 鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛� */ @ApiOperation("鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛�") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/unallocatedList") public TableDataInfo<SysUser> unallocatedList(SysUser user, PageQuery pageQuery) { return userService.selectUnallocatedList(user, pageQuery); @@ -185,7 +184,7 @@ * 鍙栨秷鎺堟潈鐢ㄦ埛 */ @ApiOperation("鍙栨秷鎺堟潈鐢ㄦ埛") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancel") public AjaxResult<Void> cancelAuthUser(@RequestBody SysUserRole userRole) { @@ -200,7 +199,7 @@ @ApiImplicitParam(name = "roleId", value = "瑙掕壊ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "鐢ㄦ埛ID涓�", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancelAll") public AjaxResult<Void> cancelAuthUserAll(Long roleId, Long[] userIds) { @@ -215,7 +214,7 @@ @ApiImplicitParam(name = "roleId", value = "瑙掕壊ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "鐢ㄦ埛ID涓�", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @SaCheckPermission("system:role:edit") @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT) @PutMapping("/authUser/selectAll") public AjaxResult<Void> selectAuthUserAll(Long roleId, Long[] userIds) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 5471baa..c80bf80 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,5 +1,6 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -26,7 +27,6 @@ import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -58,7 +58,7 @@ * 鑾峰彇鐢ㄦ埛鍒楄〃 */ @ApiOperation("鑾峰彇鐢ㄦ埛鍒楄〃") - @PreAuthorize("@ss.hasPermi('system:user:list')") + @SaCheckPermission("system:user:list") @GetMapping("/list") public TableDataInfo<SysUser> list(SysUser user, PageQuery pageQuery) { return userService.selectPageUserList(user, pageQuery); @@ -66,7 +66,7 @@ @ApiOperation("瀵煎嚭鐢ㄦ埛鍒楄〃") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:user:export')") + @SaCheckPermission("system:user:export") @PostMapping("/export") public void export(SysUser user, HttpServletResponse response) { List<SysUser> list = userService.selectUserList(user); @@ -87,7 +87,7 @@ @ApiImplicitParam(name = "file", value = "瀵煎叆鏂囦欢", dataType = "java.io.File", required = true), }) @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('system:user:import')") + @SaCheckPermission("system:user:import") @PostMapping("/importData") public AjaxResult<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); @@ -104,10 +104,10 @@ * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅 */ @ApiOperation("鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('system:user:query')") - @GetMapping(value = {"/", "/{userId}"}) + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}" }) public AjaxResult<Map<String, Object>> getInfo(@ApiParam("鐢ㄦ埛ID") @PathVariable(value = "userId", required = false) Long userId) { - userService.checkUserDataScope(userId); + userService.checkUserDataScope(userId); Map<String, Object> ajax = new HashMap<>(); List<SysRole> roles = roleService.selectRoleAll(); ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); @@ -125,7 +125,7 @@ * 鏂板鐢ㄦ埛 */ @ApiOperation("鏂板鐢ㄦ埛") - @PreAuthorize("@ss.hasPermi('system:user:add')") + @SaCheckPermission("system:user:add") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT) @PostMapping public AjaxResult<Void> add(@Validated @RequestBody SysUser user) { @@ -146,7 +146,7 @@ * 淇敼鐢ㄦ埛 */ @ApiOperation("淇敼鐢ㄦ埛") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> edit(@Validated @RequestBody SysUser user) { @@ -165,7 +165,7 @@ * 鍒犻櫎鐢ㄦ埛 */ @ApiOperation("鍒犻櫎鐢ㄦ埛") - @PreAuthorize("@ss.hasPermi('system:user:remove')") + @SaCheckPermission("system:user:remove") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") public AjaxResult<Void> remove(@ApiParam("瑙掕壊ID涓�") @PathVariable Long[] userIds) { @@ -179,7 +179,7 @@ * 閲嶇疆瀵嗙爜 */ @ApiOperation("閲嶇疆瀵嗙爜") - @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @SaCheckPermission("system:user:resetPwd") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") public AjaxResult<Void> resetPwd(@RequestBody SysUser user) { @@ -192,7 +192,7 @@ * 鐘舵�佷慨鏀� */ @ApiOperation("鐘舵�佷慨鏀�") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public AjaxResult<Void> changeStatus(@RequestBody SysUser user) { @@ -204,7 +204,7 @@ * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊 */ @ApiOperation("鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊") - @PreAuthorize("@ss.hasPermi('system:user:query')") + @SaCheckPermission("system:user:query") @GetMapping("/authRole/{userId}") public AjaxResult<Map<String, Object>> authRole(@ApiParam("鐢ㄦ埛ID") @PathVariable("userId") Long userId) { SysUser user = userService.selectUserById(userId); @@ -223,7 +223,7 @@ @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛Id", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "roleIds", value = "瑙掕壊ID涓�", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @SaCheckPermission("system:user:edit") @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT) @PutMapping("/authRole") public AjaxResult<Void> insertAuthRole(Long userId, Long[] roleIds) { diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ed9f1d2..ab692f0 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -95,24 +95,46 @@ # 鍏佽瀵硅薄蹇界暐json涓笉瀛樺湪鐨勫睘鎬� fail_on_unknown_properties: false -# token閰嶇疆 -token: - # 浠ょ墝鑷畾涔夋爣璇� - header: Authorization - # 浠ょ墝瀵嗛挜 - secret: abcdefghijklmnopqrstuvwxyz - # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛� - expireTime: 30 +# Sa-Token閰嶇疆 +sa-token: + # token鍚嶇О (鍚屾椂涔熸槸cookie鍚嶇О) + token-name: Authorization + # token鏈夋晥鏈� 璁句负涓�澶� (蹇呭畾杩囨湡) 鍗曚綅: 绉� + timeout: 86400 + # token涓存椂鏈夋晥鏈� (鎸囧畾鏃堕棿鏃犳搷浣滃氨杩囨湡) 鍗曚綅: 绉� + activity-timeout: 1800 + # 鏄惁鍏佽鍚屼竴璐﹀彿骞跺彂鐧诲綍 (涓簍rue鏃跺厑璁镐竴璧风櫥褰�, 涓篺alse鏃舵柊鐧诲綍鎸ゆ帀鏃х櫥褰�) + is-concurrent: true + # 鍦ㄥ浜虹櫥褰曞悓涓�璐﹀彿鏃讹紝鏄惁鍏辩敤涓�涓猼oken (涓簍rue鏃舵墍鏈夌櫥褰曞叡鐢ㄤ竴涓猼oken, 涓篺alse鏃舵瘡娆$櫥褰曟柊寤轰竴涓猼oken) + is-share: false + # 鏄惁灏濊瘯浠庤姹備綋閲岃鍙杢oken + is-read-body: false + # 鏄惁灏濊瘯浠巋eader閲岃鍙杢oken + is-read-head: true + # 鏄惁灏濊瘯浠巆ookie閲岃鍙杢oken + is-read-cookie: false + # token鍓嶇紑 + token-prefix: "Bearer" + # token椋庢牸 + token-style: uuid + # jwt绉橀挜 + jwt-secret-key: abcdefghijklmnopqrstuvwxyz + # 鏄惁杈撳嚭鎿嶄綔鏃ュ織 + is-log: true # security閰嶇疆 security: - # 鐧诲嚭璺緞 - logout-url: /logout - # 鍖垮悕璺緞 - anonymous: + # 鎺掗櫎璺緞 + excludes: - /login + - /logout - /register - /captchaImage + # 闈欐�佽祫婧� + - /*.html + - /**/*.html + - /**/*.css + - /**/*.js # swagger 鏂囨。閰嶇疆 - /doc.html - /swagger-resources/** diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index a91b5b4..91a741a 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -29,10 +29,20 @@ <artifactId>spring-web</artifactId> </dependency> - <!-- spring security 瀹夊叏璁よ瘉 --> + <!-- Sa-Token 鏉冮檺璁よ瘉, 鍦ㄧ嚎鏂囨。锛歨ttp://sa-token.dev33.cn/ --> <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> + <groupId>cn.dev33</groupId> + <artifactId>sa-token-spring-boot-starter</artifactId> + </dependency> + <!-- Sa-Token 鏁村悎 jwt --> + <dependency> + <groupId>cn.dev33</groupId> + <artifactId>sa-token-jwt</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-crypto</artifactId> </dependency> <!-- 鑷畾涔夐獙璇佹敞瑙� --> diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 617567d..5e07c96 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -1,6 +1,5 @@ package com.ruoyi.common.constant; - /** * 閫氱敤甯搁噺淇℃伅 * @@ -66,7 +65,12 @@ /** * 鐧诲綍鐢ㄦ埛 redis key */ - String LOGIN_TOKEN_KEY = "login_tokens:"; + public static final String LOGIN_TOKEN_KEY = "Authorization:login:token:"; + + /** + * 鍦ㄧ嚎鐢ㄦ埛 redis key + */ + public static final String ONLINE_TOKEN_KEY = "online_tokens:"; /** * 闃查噸鎻愪氦 redis key @@ -106,37 +110,7 @@ /** * 浠ょ墝鍓嶇紑 */ - String TOKEN_PREFIX = "Bearer "; - - /** - * 浠ょ墝鍓嶇紑 - */ String LOGIN_USER_KEY = "login_user_key"; - - /** - * 鐢ㄦ埛ID - */ - String JWT_USERID = "userid"; - - /** - * 鐢ㄦ埛鍚嶇О - */ - String JWT_USERNAME = "sub"; - - /** - * 鐢ㄦ埛澶村儚 - */ - String JWT_AVATAR = "avatar"; - - /** - * 鍒涘缓鏃堕棿 - */ - String JWT_CREATED = "created"; - - /** - * 鐢ㄦ埛鏉冮檺 - */ - String JWT_AUTHORITIES = "authorities"; /** * 鍙傛暟绠$悊 cache key diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java index bad8f77..4c5e197 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -2,7 +2,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; /** @@ -71,27 +71,27 @@ * 鑾峰彇鐢ㄦ埛缂撳瓨淇℃伅 */ public LoginUser getLoginUser() { - return SecurityUtils.getLoginUser(); + return LoginUtils.getLoginUser(); } /** * 鑾峰彇鐧诲綍鐢ㄦ埛id */ public Long getUserId() { - return getLoginUser().getUserId(); + return LoginUtils.getUserId(); } /** * 鑾峰彇鐧诲綍閮ㄩ棬id */ public Long getDeptId() { - return getLoginUser().getDeptId(); + return LoginUtils.getDeptId(); } /** * 鑾峰彇鐧诲綍鐢ㄦ埛鍚� */ public String getUsername() { - return getLoginUser().getUsername(); + return LoginUtils.getUsername(); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java new file mode 100644 index 0000000..5eb5280 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java @@ -0,0 +1,62 @@ +package com.ruoyi.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 褰撳墠鍦ㄧ嚎浼氳瘽 + * + * @author ruoyi + */ + +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class UserOnlineDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 浼氳瘽缂栧彿 + */ + private String tokenId; + + /** + * 閮ㄩ棬鍚嶇О + */ + private String deptName; + + /** + * 鐢ㄦ埛鍚嶇О + */ + private String userName; + + /** + * 鐧诲綍IP鍦板潃 + */ + private String ipaddr; + + /** + * 鐧诲綍鍦板潃 + */ + private String loginLocation; + + /** + * 娴忚鍣ㄧ被鍨� + */ + private String browser; + + /** + * 鎿嶄綔绯荤粺 + */ + private String os; + + /** + * 鐧诲綍鏃堕棿 + */ + private Long loginTime; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index 0506883..7554e3f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -1,13 +1,10 @@ package com.ruoyi.common.core.domain.model; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import java.util.Collection; +import java.io.Serializable; import java.util.Set; /** @@ -19,7 +16,7 @@ @Data @NoArgsConstructor @Accessors(chain = true) -public class LoginUser implements UserDetails { +public class LoginUser implements Serializable { private static final long serialVersionUID = 1L; @@ -71,72 +68,16 @@ /** * 鑿滃崟鏉冮檺 */ - private Set<String> menuPermissions; + private Set<String> menuPermission; /** * 瑙掕壊鏉冮檺 */ - private Set<String> rolePermissions; + private Set<String> rolePermission; /** * 鐢ㄦ埛鍚� */ private String username; - /** - * 瀵嗙爜 - */ - private String password; - - @JsonIgnore - @Override - public String getPassword() { - return password; - } - - @Override - public String getUsername() { - return username; - } - - /** - * 璐︽埛鏄惁鏈繃鏈�,杩囨湡鏃犳硶楠岃瘉 - */ - @JsonIgnore - @Override - public boolean isAccountNonExpired() { - return true; - } - - /** - * 鎸囧畾鐢ㄦ埛鏄惁瑙i攣,閿佸畾鐨勭敤鎴锋棤娉曡繘琛岃韩浠介獙璇� - */ - @JsonIgnore - @Override - public boolean isAccountNonLocked() { - return true; - } - - /** - * 鎸囩ず鏄惁宸茶繃鏈熺殑鐢ㄦ埛鐨勫嚟鎹�(瀵嗙爜),杩囨湡鐨勫嚟鎹槻姝㈣璇� - */ - @JsonIgnore - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - /** - * 鏄惁鍙敤 ,绂佺敤鐨勭敤鎴蜂笉鑳借韩浠介獙璇� - */ - @JsonIgnore - @Override - public boolean isEnabled() { - return true; - } - - @Override - public Collection<? extends GrantedAuthority> getAuthorities() { - return null; - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java deleted file mode 100644 index d9a9f0a..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/TokenService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ruoyi.common.core.service; - -import com.ruoyi.common.core.domain.model.LoginUser; - -import javax.servlet.http.HttpServletRequest; - -/** - * token楠岃瘉澶勭悊 - * - * @author Lion Li - */ -public interface TokenService { - - /** - * 鑾峰彇鐢ㄦ埛韬唤淇℃伅 - * - * @return 鐢ㄦ埛淇℃伅 - */ - LoginUser getLoginUser(HttpServletRequest request); - - /** - * 璁剧疆鐢ㄦ埛韬唤淇℃伅 - */ - void setLoginUser(LoginUser loginUser); - - /** - * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅 - */ - void delLoginUser(String token); - - /** - * 鍒涘缓浠ょ墝 - * - * @param loginUser 鐢ㄦ埛淇℃伅 - * @return 浠ょ墝 - */ - String createToken(LoginUser loginUser); - - /** - * 楠岃瘉浠ょ墝鏈夋晥鏈燂紝鐩稿樊涓嶈冻20鍒嗛挓锛岃嚜鍔ㄥ埛鏂扮紦瀛� - * - * @param loginUser - * @return 浠ょ墝 - */ - void verifyToken(LoginUser loginUser); - - /** - * 鍒锋柊浠ょ墝鏈夋晥鏈� - * - * @param loginUser 鐧诲綍淇℃伅 - */ - void refreshToken(LoginUser loginUser); - - /** - * 璁剧疆鐢ㄦ埛浠g悊淇℃伅 - * - * @param loginUser 鐧诲綍淇℃伅 - */ - void setUserAgent(LoginUser loginUser); - - /** - * 浠庝护鐗屼腑鑾峰彇鐢ㄦ埛鍚� - * - * @param token 浠ょ墝 - * @return 鐢ㄦ埛鍚� - */ - String getUsernameFromToken(String token); - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java new file mode 100644 index 0000000..e6ac849 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DeviceType.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 璁惧绫诲瀷 + * 閽堝涓�濂� 鐢ㄦ埛浣撶郴 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DeviceType { + + /** + * pc绔� + */ + PC("pc"), + + /** + * app绔� + */ + APP("app"); + + private final String device; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java new file mode 100644 index 0000000..9c3b531 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 璁惧绫诲瀷 + * 閽堝涓ゅ 鐢ㄦ埛浣撶郴 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * pc绔� + */ + SYS_USER("sys_user:"), + + /** + * app绔� + */ + APP_USER("app_user:"); + + private final String userType; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java b/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java deleted file mode 100644 index 927a941..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/properties/TokenProperties.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ruoyi.common.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * token 閰嶇疆灞炴�� - * - * @author Lion Li - */ -@Data -@Component -@ConfigurationProperties(prefix = "token") -public class TokenProperties { - - /** - * 浠ょ墝鑷畾涔夋爣璇� - */ - private String header; - - /** - * 浠ょ墝绉橀挜 - */ - private String secret; - - /** - * 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛� - */ - private int expireTime; -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java new file mode 100644 index 0000000..a5dc50e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java @@ -0,0 +1,107 @@ +package com.ruoyi.common.utils; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.DeviceType; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.exception.UtilException; + +/** + * 鐧诲綍閴存潈宸ュ叿 + * 涓洪�傞厤澶氱鐧诲綍鑰屽皝瑁� + * + * @author Lion Li + */ +public class LoginUtils { + + private final static String LOGIN_USER_KEY = "loginUser"; + + /** + * 鐧诲綍绯荤粺 + * 閽堝涓ゅ鐢ㄦ埛浣撶郴 + * @param loginUser 鐧诲綍鐢ㄦ埛淇℃伅 + */ + public static void login(LoginUser loginUser, UserType userType) { + StpUtil.login(userType.getUserType() + loginUser.getUserId()); + setLoginUser(loginUser); + } + + /** + * 鐧诲綍绯荤粺 鍩轰簬 璁惧绫诲瀷 + * 閽堝涓�濂楃敤鎴蜂綋绯� + * @param loginUser 鐧诲綍鐢ㄦ埛淇℃伅 + */ + public static void loginByDevice(LoginUser loginUser, UserType userType, DeviceType deviceType) { + StpUtil.login(userType.getUserType() + loginUser.getUserId(), deviceType.getDevice()); + setLoginUser(loginUser); + } + + /** + * 璁剧疆鐢ㄦ埛鏁版嵁 + */ + public static void setLoginUser(LoginUser loginUser) { + StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + } + + /** + * 鑾峰彇鐢ㄦ埛 + **/ + public static LoginUser getLoginUser() { + return (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY); + } + + /** + * 鑾峰彇鐢ㄦ埛id + */ + public static Long getUserId() { + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + String loginId = StpUtil.getLoginIdAsString(); + String userId; + String replace = ""; + if (StringUtils.contains(loginId, UserType.SYS_USER.getUserType())) { + userId = StringUtils.replace(loginId, UserType.SYS_USER.getUserType(), replace); + } else if (StringUtils.contains(loginId, UserType.APP_USER.getUserType())){ + userId = StringUtils.replace(loginId, UserType.APP_USER.getUserType(), replace); + } else { + throw new UtilException("鐧诲綍鐢ㄦ埛: LoginId寮傚父 => " + loginId); + } + return Long.parseLong(userId); + } + return loginUser.getUserId(); + } + + /** + * 鑾峰彇閮ㄩ棬ID + **/ + public static Long getDeptId() { + return getLoginUser().getDeptId(); + } + + /** + * 鑾峰彇鐢ㄦ埛璐︽埛 + **/ + public static String getUsername() { + return getLoginUser().getUsername(); + } + + /** + * 鑾峰彇鐢ㄦ埛绫诲瀷 + */ + public static UserType getUserType() { + String loginId = StpUtil.getLoginIdAsString(); + return getUserType(loginId); + } + + public static UserType getUserType(Object loginId) { + if (StringUtils.contains(loginId.toString(), UserType.SYS_USER.getUserType())) { + return UserType.SYS_USER; + } else if (StringUtils.contains(loginId.toString(), UserType.APP_USER.getUserType())){ + return UserType.APP_USER; + } else { + throw new UtilException("鐧诲綍鐢ㄦ埛: LoginId寮傚父 => " + loginId); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 43cb8fe..72c9453 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -1,72 +1,16 @@ package com.ruoyi.common.utils; -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.ServiceException; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * 瀹夊叏鏈嶅姟宸ュ叿绫� * - * @author ruoyi + * @author Long Li */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class SecurityUtils { - - /** - * 鐢ㄦ埛ID - **/ - public static Long getUserId() { - try { - return getLoginUser().getUserId(); - } catch (Exception e) { - throw new ServiceException("鑾峰彇鐢ㄦ埛ID寮傚父", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 鑾峰彇閮ㄩ棬ID - **/ - public static Long getDeptId() { - try { - return getLoginUser().getDeptId(); - } catch (Exception e) { - throw new ServiceException("鑾峰彇閮ㄩ棬ID寮傚父", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 鑾峰彇鐢ㄦ埛璐︽埛 - **/ - public static String getUsername() { - try { - return getLoginUser().getUsername(); - } catch (Exception e) { - throw new ServiceException("鑾峰彇鐢ㄦ埛璐︽埛寮傚父", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 鑾峰彇鐢ㄦ埛 - **/ - public static LoginUser getLoginUser() { - try { - return (LoginUser) getAuthentication().getPrincipal(); - } catch (Exception e) { - throw new ServiceException("鑾峰彇鐢ㄦ埛淇℃伅寮傚父", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 鑾峰彇Authentication - */ - public static Authentication getAuthentication() { - return SecurityContextHolder.getContext().getAuthentication(); - } /** * 鐢熸垚BCryptPasswordEncoder瀵嗙爜 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index 003d7dc..9a8cf63 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -1,5 +1,6 @@ package com.ruoyi.demo.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; @@ -22,7 +23,6 @@ import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -53,28 +53,28 @@ * 鏌ヨ娴嬭瘯鍗曡〃鍒楄〃 */ @ApiOperation("鏌ヨ娴嬭瘯鍗曡〃鍒楄〃") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @SaCheckPermission("demo:demo:list") @GetMapping("/list") public TableDataInfo<TestDemoVo> list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { return iTestDemoService.queryPageList(bo, pageQuery); } - /** - * 鑷畾涔夊垎椤垫煡璇� - */ - @ApiOperation("鑷畾涔夊垎椤垫煡璇�") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") - @GetMapping("/page") - public TableDataInfo<TestDemoVo> page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { - return iTestDemoService.customPageList(bo, pageQuery); - } + /** + * 鑷畾涔夊垎椤垫煡璇� + */ + @ApiOperation("鑷畾涔夊垎椤垫煡璇�") + @SaCheckPermission("demo:demo:list") + @GetMapping("/page") + public TableDataInfo<TestDemoVo> page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.customPageList(bo, pageQuery); + } @ApiOperation("瀵煎叆娴嬭瘯-鏍¢獙") @ApiImplicitParams({ @ApiImplicitParam(name = "file", value = "瀵煎叆鏂囦欢", dataType = "java.io.File", required = true), }) @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('demo:demo:import')") + @SaCheckPermission("demo:demo:import") @PostMapping("/importData") public AjaxResult<Void> importData(@RequestPart("file") MultipartFile file) throws Exception { ExcelResult<TestDemoImportVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); @@ -88,7 +88,7 @@ * 瀵煎嚭娴嬭瘯鍗曡〃鍒楄〃 */ @ApiOperation("瀵煎嚭娴嬭瘯鍗曡〃鍒楄〃") - @PreAuthorize("@ss.hasPermi('demo:demo:export')") + @SaCheckPermission("demo:demo:export") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@Validated TestDemoBo bo, HttpServletResponse response) { @@ -104,7 +104,7 @@ * 鑾峰彇娴嬭瘯鍗曡〃璇︾粏淇℃伅 */ @ApiOperation("鑾峰彇娴嬭瘯鍗曡〃璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('demo:demo:query')") + @SaCheckPermission("demo:demo:query") @GetMapping("/{id}") public AjaxResult<TestDemoVo> getInfo(@ApiParam("娴嬭瘯ID") @NotNull(message = "涓婚敭涓嶈兘涓虹┖") @@ -116,7 +116,7 @@ * 鏂板娴嬭瘯鍗曡〃 */ @ApiOperation("鏂板娴嬭瘯鍗曡〃") - @PreAuthorize("@ss.hasPermi('demo:demo:add')") + @SaCheckPermission("demo:demo:add") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.INSERT) @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "涓嶅厑璁搁噸澶嶆彁浜�") @PostMapping() @@ -131,7 +131,7 @@ * 淇敼娴嬭瘯鍗曡〃 */ @ApiOperation("淇敼娴嬭瘯鍗曡〃") - @PreAuthorize("@ss.hasPermi('demo:demo:edit')") + @SaCheckPermission("demo:demo:edit") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() @@ -143,8 +143,8 @@ * 鍒犻櫎娴嬭瘯鍗曡〃 */ @ApiOperation("鍒犻櫎娴嬭瘯鍗曡〃") - @PreAuthorize("@ss.hasPermi('demo:demo:remove')") - @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.DELETE) + @SaCheckPermission("demo:demo:remove") + @Log(title = "娴嬭瘯鍗曡〃" , businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult<Void> remove(@ApiParam("娴嬭瘯ID涓�") @NotEmpty(message = "涓婚敭涓嶈兘涓虹┖") diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index 463ea3b..f0231bb 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -1,5 +1,6 @@ package com.ruoyi.demo.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; @@ -17,7 +18,6 @@ import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -46,7 +46,7 @@ * 鏌ヨ娴嬭瘯鏍戣〃鍒楄〃 */ @ApiOperation("鏌ヨ娴嬭瘯鏍戣〃鍒楄〃") - @PreAuthorize("@ss.hasPermi('demo:tree:list')") + @SaCheckPermission("demo:tree:list") @GetMapping("/list") public AjaxResult<List<TestTreeVo>> list(@Validated(QueryGroup.class) TestTreeBo bo) { List<TestTreeVo> list = iTestTreeService.queryList(bo); @@ -57,7 +57,7 @@ * 瀵煎嚭娴嬭瘯鏍戣〃鍒楄〃 */ @ApiOperation("瀵煎嚭娴嬭瘯鏍戣〃鍒楄〃") - @PreAuthorize("@ss.hasPermi('demo:tree:export')") + @SaCheckPermission("demo:tree:export") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.EXPORT) @GetMapping("/export") public void export(@Validated TestTreeBo bo, HttpServletResponse response) { @@ -69,7 +69,7 @@ * 鑾峰彇娴嬭瘯鏍戣〃璇︾粏淇℃伅 */ @ApiOperation("鑾峰彇娴嬭瘯鏍戣〃璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('demo:tree:query')") + @SaCheckPermission("demo:tree:query") @GetMapping("/{id}") public AjaxResult<TestTreeVo> getInfo(@ApiParam("娴嬭瘯鏍慖D") @NotNull(message = "涓婚敭涓嶈兘涓虹┖") @@ -81,7 +81,7 @@ * 鏂板娴嬭瘯鏍戣〃 */ @ApiOperation("鏂板娴嬭瘯鏍戣〃") - @PreAuthorize("@ss.hasPermi('demo:tree:add')") + @SaCheckPermission("demo:tree:add") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping() @@ -93,7 +93,7 @@ * 淇敼娴嬭瘯鏍戣〃 */ @ApiOperation("淇敼娴嬭瘯鏍戣〃") - @PreAuthorize("@ss.hasPermi('demo:tree:edit')") + @SaCheckPermission("demo:tree:edit") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() @@ -105,8 +105,8 @@ * 鍒犻櫎娴嬭瘯鏍戣〃 */ @ApiOperation("鍒犻櫎娴嬭瘯鏍戣〃") - @PreAuthorize("@ss.hasPermi('demo:tree:remove')") - @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.DELETE) + @SaCheckPermission("demo:tree:remove") + @Log(title = "娴嬭瘯鏍戣〃" , businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult<Void> remove(@ApiParam("娴嬭瘯鏍慖D涓�") @NotEmpty(message = "涓婚敭涓嶈兘涓虹┖") diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..58427da --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,138 @@ +package com.ruoyi.framework.aspectj; + +import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +/** + * 鏁版嵁杩囨护澶勭悊 + * + * @author Lion Li + * @deprecated 3.6.0 绉婚櫎 {@link com.ruoyi.framework.handler.PlusDataPermissionHandler} + */ +@Aspect +@Component +@Deprecated +public class DataScopeAspect { + + /** + * 鍏ㄩ儴鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 鑷畾鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 閮ㄩ棬鏁版嵁鏉冮檺 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄� + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 浠呮湰浜烘暟鎹潈闄� + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 鏁版嵁鏉冮檺杩囨护鍏抽敭瀛� + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { + // 鑾峰彇褰撳墠鐨勭敤鎴� + SysUser currentUser = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); + // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹� + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias(), controllerDataScope.isUser()); + } + } + + /** + * 鏁版嵁鑼冨洿杩囨护 + * + * @param joinPoint 鍒囩偣 + * @param user 鐢ㄦ埛 + * @param userAlias 鍒悕 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, boolean isUser) { + StringBuilder sqlString = new StringBuilder(); + + // 灏� "." 鎻愬彇鍑�,涓嶅啓鍒悕涓哄崟琛ㄦ煡璇�,鍐欏埆鍚嶄负澶氳〃鏌ヨ + deptAlias = StringUtils.isNotBlank(deptAlias) ? deptAlias + "." : ""; + userAlias = StringUtils.isNotBlank(userAlias) ? userAlias + "." : ""; + + for (SysRole role : user.getRoles()) { + String dataScope = role.getDataScope(); + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", + deptAlias, role.getRoleId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}dept_id = {} ", + deptAlias, user.getDeptId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (isUser) { + sqlString.append(StringUtils.format(" OR {}user_id = {} ", + userAlias, user.getUserId())); + } else { + // 鏁版嵁鏉冮檺涓轰粎鏈汉涓旀病鏈塽serAlias鍒悕涓嶆煡璇换浣曟暟鎹� + sqlString.append(" OR 1=0 "); + } + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + putDataScope(joinPoint, sqlString.substring(4)); + } + } + + /** + * 鎷兼帴鏉冮檺sql鍓嶅厛娓呯┖params.dataScope鍙傛暟闃叉娉ㄥ叆 + */ + private void clearDataScope(final JoinPoint joinPoint) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params)) { + putDataScope(joinPoint, ""); + } + } + + private static void putDataScope(JoinPoint joinPoint, String sql) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params)) { + if (params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, sql); + } + } + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 642076d..e7aa909 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -2,12 +2,11 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.dto.OperLogDTO; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.OperLogService; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.HttpMethod; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -60,9 +59,6 @@ protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { try { - // 鑾峰彇褰撳墠鐨勭敤鎴� - LoginUser loginUser = SecurityUtils.getLoginUser(); - // *========鏁版嵁搴撴棩蹇�=========*// OperLogDTO operLog = new OperLogDTO(); operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); @@ -70,9 +66,7 @@ String ip = ServletUtils.getClientIP(); operLog.setOperIp(ip); operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); - if (loginUser != null) { - operLog.setOperName(loginUser.getUsername()); - } + operLog.setOperName(LoginUtils.getUsername()); if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java index 48761ac..9fa586b 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java @@ -1,10 +1,10 @@ package com.ruoyi.framework.aspectj; +import cn.dev33.satoken.SaManager; import cn.hutool.crypto.SecureUtil; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.ServletUtils; @@ -37,7 +37,6 @@ @Component public class RepeatSubmitAspect { - private final TokenProperties tokenProperties; private final RepeatSubmitProperties repeatSubmitProperties; @Before("@annotation(repeatSubmit)") @@ -57,7 +56,7 @@ String url = request.getRequestURI(); // 鍞竴鍊硷紙娌℃湁娑堟伅澶村垯浣跨敤璇锋眰鍦板潃锛� - String submitKey = StringUtils.trimToEmpty(request.getHeader(tokenProperties.getHeader())); + String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); submitKey = SecureUtil.md5(submitKey + ":" + nowParams); // 鍞竴鏍囪瘑锛堟寚瀹歬ey + url + 娑堟伅澶达級 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java deleted file mode 100644 index 728773d..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.config; - -import cn.hutool.core.util.ArrayUtil; -import com.ruoyi.common.exception.ServiceException; -import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurerSupport; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.security.concurrent.DelegatingSecurityContextExecutorService; - -import java.util.Arrays; -import java.util.concurrent.Executor; -import java.util.concurrent.ScheduledExecutorService; - -/** - * 寮傛閰嶇疆 - * - * @author Lion Li - */ -@EnableAsync -@Configuration -public class AsyncConfig extends AsyncConfigurerSupport { - - @Autowired - @Qualifier("scheduledExecutorService") - private ScheduledExecutorService scheduledExecutorService; - - /** - * 寮傛鎵ц闇�瑕佷娇鐢ㄦ潈闄愭鏋惰嚜甯︾殑鍖呰绾跨▼姹� 淇濊瘉鏉冮檺淇℃伅鐨勪紶閫� - */ - @Override - public Executor getAsyncExecutor() { - return new DelegatingSecurityContextExecutorService(scheduledExecutorService); - } - - /** - * 寮傛鎵ц寮傚父澶勭悊 - */ - @Override - public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { - return (throwable, method, objects) -> { - throwable.printStackTrace(); - StringBuilder sb = new StringBuilder(); - sb.append("Exception message - ").append(throwable.getMessage()) - .append(", Method name - ").append(method.getName()); - if (ArrayUtil.isNotEmpty(objects)) { - sb.append(", Parameter value - ").append(Arrays.toString(objects)); - } - throw new ServiceException(sb.toString()); - }; - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index 83565b6..f43ecab 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -20,10 +20,6 @@ public class ResourcesConfig implements WebMvcConfigurer { @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - } - - @Override public void addInterceptors(InterceptorRegistry registry) { // 鍏ㄥ眬閾捐矾璺熻釜鎷︽埅鍣� registry.addInterceptor(new TLogWebInterceptor()); @@ -31,6 +27,10 @@ registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + } + /** * 璺ㄥ煙閰嶇疆 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java new file mode 100644 index 0000000..2604245 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -0,0 +1,63 @@ +package com.ruoyi.framework.config; + +import cn.dev33.satoken.interceptor.SaAnnotationInterceptor; +import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import cn.dev33.satoken.jwt.StpLogicJwtForStyle; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpLogic; +import cn.dev33.satoken.stp.StpUtil; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.config.properties.SecurityProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * sa-token 閰嶇疆 + * + * @author Lion Li + */ +@Slf4j +@Configuration +public class SaTokenConfig implements WebMvcConfigurer { + + @Autowired + private SecurityProperties securityProperties; + + /** + * 娉ㄥ唽sa-token鐨勬嫤鎴櫒 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 娉ㄥ唽璺敱鎷︽埅鍣紝鑷畾涔夐獙璇佽鍒� + registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { + // 鐧诲綍楠岃瘉 -- 鎺掗櫎澶氫釜璺緞 + SaRouter + // 鑾峰彇鎵�鏈夌殑 + .match("/**") + // 鎺掗櫎涓嬩笉闇�瑕佹嫤鎴殑 + .notMatch(securityProperties.getExcludes()) + .check(() -> { + if (log.isDebugEnabled()) { + Long userId = LoginUtils.getUserId(); + if (StringUtils.isNotNull(userId)) { + log.debug("鍓╀綑鏈夋晥鏃堕棿: {}", StpUtil.getTokenTimeout()); + log.debug("涓存椂鏈夋晥鏃堕棿: {}", StpUtil.getTokenActivityTimeout()); + } + } + }); + })).addPathPatterns("/**"); + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); + } + + @Bean + public StpLogic getStpLogicJwt() { + // Sa-Token 鏁村悎 jwt (Style妯″紡) + return new StpLogicJwtForStyle(); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java deleted file mode 100644 index 450eccd..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.ruoyi.framework.config; - -import com.ruoyi.framework.config.properties.SecurityProperties; -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; -import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.logout.LogoutFilter; -import org.springframework.web.filter.CorsFilter; - -/** - * spring security閰嶇疆 - * - * @author ruoyi - */ -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -public class SecurityConfig extends WebSecurityConfigurerAdapter { - /** - * 鑷畾涔夌敤鎴疯璇侀�昏緫 - */ - @Autowired - private UserDetailsService userDetailsService; - - /** - * 璁よ瘉澶辫触澶勭悊绫� - */ - @Autowired - private AuthenticationEntryPointImpl unauthorizedHandler; - - /** - * 閫�鍑哄鐞嗙被 - */ - @Autowired - private LogoutSuccessHandlerImpl logoutSuccessHandler; - - /** - * token璁よ瘉杩囨护鍣� - */ - @Autowired - private JwtAuthenticationTokenFilter authenticationTokenFilter; - - /** - * 璺ㄥ煙杩囨护鍣� - */ - @Autowired - private CorsFilter corsFilter; - - @Autowired - private SecurityProperties securityProperties; - - /** - * 瑙e喅 鏃犳硶鐩存帴娉ㄥ叆 AuthenticationManager - * - * @return - * @throws Exception - */ - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - /** - * anyRequest | 鍖归厤鎵�鏈夎姹傝矾寰� - * access | SpringEl琛ㄨ揪寮忕粨鏋滀负true鏃跺彲浠ヨ闂� - * anonymous | 鍖垮悕鍙互璁块棶 - * denyAll | 鐢ㄦ埛涓嶈兘璁块棶 - * fullyAuthenticated | 鐢ㄦ埛瀹屽叏璁よ瘉鍙互璁块棶锛堥潪remember-me涓嬭嚜鍔ㄧ櫥褰曪級 - * hasAnyAuthority | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏朵腑浠讳綍涓�涓潈闄愬彲浠ヨ闂� - * hasAnyRole | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏朵腑浠讳綍涓�涓鑹插彲浠ヨ闂� - * hasAuthority | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏舵潈闄愬彲浠ヨ闂� - * hasIpAddress | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧずIP鍦板潃锛屽鏋滅敤鎴稩P鍜屽弬鏁板尮閰嶏紝鍒欏彲浠ヨ闂� - * hasRole | 濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏惰鑹插彲浠ヨ闂� - * permitAll | 鐢ㄦ埛鍙互浠绘剰璁块棶 - * rememberMe | 鍏佽閫氳繃remember-me鐧诲綍鐨勭敤鎴疯闂� - * authenticated | 鐢ㄦ埛鐧诲綍鍚庡彲璁块棶 - */ - @Override - protected void configure(HttpSecurity httpSecurity) throws Exception { - httpSecurity - // CSRF绂佺敤锛屽洜涓轰笉浣跨敤session - .csrf().disable() - // 璁よ瘉澶辫触澶勭悊绫� - .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() - // 鍩轰簬token锛屾墍浠ヤ笉闇�瑕乻ession - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() - // 杩囨护璇锋眰 - .authorizeRequests() - .antMatchers( - HttpMethod.GET, - "/", - "/*.html", - "/**/*.html", - "/**/*.css", - "/**/*.js" - ).permitAll() - .antMatchers(securityProperties.getAnonymous()).anonymous() - .antMatchers(securityProperties.getPermitAll()).permitAll() - // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇� - .anyRequest().authenticated() - .and() - .headers().frameOptions().disable(); - httpSecurity.logout().logoutUrl(securityProperties.getLogoutUrl()).logoutSuccessHandler(logoutSuccessHandler); - // 娣诲姞JWT filter - httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); - // 娣诲姞CORS filter - httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); - httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); - } - - /** - * 寮烘暎鍒楀搱甯屽姞瀵嗗疄鐜� - */ - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - /** - * 韬唤璁よ瘉鎺ュ彛 - */ - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index 16437f4..167ac2e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -1,8 +1,8 @@ package com.ruoyi.framework.config; +import cn.dev33.satoken.config.SaTokenConfig; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.SwaggerProperties; @@ -40,7 +40,7 @@ public class SwaggerConfig { private final SwaggerProperties swaggerProperties; - private final TokenProperties tokenProperties; + private final SaTokenConfig saTokenConfig; private final OpenApiExtensionResolver openApiExtensionResolver; /** @@ -110,7 +110,7 @@ */ private List<SecurityScheme> securitySchemes() { List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); - String header = tokenProperties.getHeader(); + String header = saTokenConfig.getTokenName(); apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); return apiKeyList; } @@ -136,7 +136,7 @@ AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; List<SecurityReference> securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference(tokenProperties.getHeader(), authorizationScopes)); + securityReferences.add(new SecurityReference(saTokenConfig.getTokenName(), authorizationScopes)); return securityReferences; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java index c83ffcc..b374181 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java @@ -15,18 +15,9 @@ public class SecurityProperties { /** - * 閫�鍑虹櫥褰晆rl + * 鎺掗櫎璺緞 */ - private String logoutUrl; + private String[] excludes; - /** - * 鍖垮悕鏀捐璺緞 - */ - private String[] anonymous; - - /** - * 鐢ㄦ埛浠绘剰璁块棶鏀捐璺緞 - */ - private String[] permitAll; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java index 4c4f36c..87781eb 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java @@ -6,7 +6,7 @@ import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -72,18 +72,18 @@ } } - /** - * 鑾峰彇鐧诲綍鐢ㄦ埛鍚� - */ - private String getLoginUsername() { - LoginUser loginUser; - try { - loginUser = SecurityUtils.getLoginUser(); - } catch (Exception e) { - log.warn("鑷姩娉ㄥ叆璀﹀憡 => 鐢ㄦ埛鏈櫥褰�"); - return null; - } - return loginUser.getUsername(); - } + /** + * 鑾峰彇鐧诲綍鐢ㄦ埛鍚� + */ + private String getLoginUsername() { + LoginUser loginUser; + try { + loginUser = LoginUtils.getLoginUser(); + } catch (Exception e) { + log.warn("鑷姩娉ㄥ叆璀﹀憡 => 鐢ㄦ埛鏈櫥褰�"); + return null; + } + return loginUser.getUsername(); + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java index d5f4f58..2318f6f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -13,7 +13,7 @@ import com.ruoyi.common.enums.DataScopeType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.DataPermissionHelper; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import lombok.extern.slf4j.Slf4j; @@ -76,7 +76,7 @@ } SysUser currentUser = DataPermissionHelper.getVariable("user"); if (ObjectUtil.isNull(currentUser)) { - currentUser = SpringUtils.getBean(UserService.class).selectUserById(SecurityUtils.getUserId()); + currentUser = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); DataPermissionHelper.setVariable("user", currentUser); } // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹� diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java new file mode 100644 index 0000000..95837fe --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -0,0 +1,121 @@ +package com.ruoyi.framework.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.dto.UserOnlineDTO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * 鐢ㄦ埛琛屼负 渚﹀惉鍣ㄧ殑瀹炵幇 + */ +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + @Autowired + private SaTokenConfig saTokenConfig; + + /** + * 姣忔鐧诲綍鏃惰Е鍙� + */ + @Override + public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginUtils.getUserId()); + String tokenValue = StpUtil.getTokenValue(); + UserOnlineDTO userOnlineDTO = new UserOnlineDTO() + .setIpaddr(ip) + .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) + .setBrowser(userAgent.getBrowser().getName()) + .setOs(userAgent.getOs().getName()) + .setLoginTime(System.currentTimeMillis()) + .setTokenId(tokenValue) + .setUserName(user.getUserName()); + if (StringUtils.isNotNull(user.getDept())) { + userOnlineDTO.setDeptName(user.getDept().getDeptName()); + } + RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO, saTokenConfig.getTimeout(), TimeUnit.SECONDS); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); + } else if (userType == UserType.APP_USER) { + // app绔� 鑷鏍规嵁涓氬姟缂栧啓 + } + } + + /** + * 姣忔娉ㄩ攢鏃惰Е鍙� + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 姣忔琚涪涓嬬嚎鏃惰Е鍙� + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 姣忔琚《涓嬬嚎鏃惰Е鍙� + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 姣忔琚皝绂佹椂瑙﹀彂 + */ + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + } + + /** + * 姣忔琚В灏佹椂瑙﹀彂 + */ + @Override + public void doUntieDisable(String loginType, Object loginId) { + } + + /** + * 姣忔鍒涘缓Session鏃惰Е鍙� + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 姣忔娉ㄩ攢Session鏃惰Е鍙� + */ + @Override + public void doLogoutSession(String id) { + } + + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java new file mode 100644 index 0000000..556133c --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java @@ -0,0 +1,178 @@ +package com.ruoyi.framework.satoken.dao; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.util.SaFoxUtil; +import com.ruoyi.common.utils.RedisUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Sa-Token鎸佷箙灞傛帴鍙�(浣跨敤妗嗘灦鑷甫RedisUtils瀹炵幇 鍗忚缁熶竴) + * + * @author Lion Li + */ +@Component +public class PlusSaTokenDao implements SaTokenDao { + + /** + * 鑾峰彇Value锛屽鏃犺繑绌� + */ + @Override + public String get(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 鍐欏叆Value锛屽苟璁惧畾瀛樻椿鏃堕棿 (鍗曚綅: 绉�) + */ + @Override + public void set(String key, String value, long timeout) { + if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 鍒ゆ柇鏄惁涓烘案涓嶈繃鏈� + if(timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, value); + } else { + RedisUtils.setCacheObject(key, value, timeout, TimeUnit.SECONDS); + } + } + + /** + * 淇慨鏀规寚瀹歬ey-value閿�煎 (杩囨湡鏃堕棿涓嶅彉) + */ + @Override + public void update(String key, String value) { + long expire = getTimeout(key); + // -2 = 鏃犳閿� + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.set(key, value, expire); + } + + /** + * 鍒犻櫎Value + */ + @Override + public void delete(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 鑾峰彇Value鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�) + */ + @Override + public long getTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 淇敼Value鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�) + */ + @Override + public void updateTimeout(String key, long timeout) { + // 鍒ゆ柇鏄惁鎯宠璁剧疆涓烘案涔� + if(timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getTimeout(key); + if(expire == SaTokenDao.NEVER_EXPIRE) { + // 濡傛灉鍏跺凡缁忚璁剧疆涓烘案涔咃紝鍒欎笉浣滀换浣曞鐞� + } else { + // 濡傛灉灏氭湭琚缃负姘镐箙锛岄偅涔堝啀娆et涓�娆� + this.set(key, this.get(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + + /** + * 鑾峰彇Object锛屽鏃犺繑绌� + */ + @Override + public Object getObject(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 鍐欏叆Object锛屽苟璁惧畾瀛樻椿鏃堕棿 (鍗曚綅: 绉�) + */ + @Override + public void setObject(String key, Object object, long timeout) { + if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 鍒ゆ柇鏄惁涓烘案涓嶈繃鏈� + if(timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, object); + } else { + RedisUtils.setCacheObject(key, object, timeout, TimeUnit.SECONDS); + } + } + + /** + * 鏇存柊Object (杩囨湡鏃堕棿涓嶅彉) + */ + @Override + public void updateObject(String key, Object object) { + long expire = getObjectTimeout(key); + // -2 = 鏃犳閿� + if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.setObject(key, object, expire); + } + + /** + * 鍒犻櫎Object + */ + @Override + public void deleteObject(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 鑾峰彇Object鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�) + */ + @Override + public long getObjectTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 淇敼Object鐨勫墿浣欏瓨娲绘椂闂� (鍗曚綅: 绉�) + */ + @Override + public void updateObjectTimeout(String key, long timeout) { + // 鍒ゆ柇鏄惁鎯宠璁剧疆涓烘案涔� + if(timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getObjectTimeout(key); + if(expire == SaTokenDao.NEVER_EXPIRE) { + // 濡傛灉鍏跺凡缁忚璁剧疆涓烘案涔咃紝鍒欎笉浣滀换浣曞鐞� + } else { + // 濡傛灉灏氭湭琚缃负姘镐箙锛岄偅涔堝啀娆et涓�娆� + this.setObject(key, this.getObject(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + /** + * 鎼滅储鏁版嵁 + */ + @Override + public List<String> searchData(String prefix, String keyword, int start, int size) { + Collection<String> keys = RedisUtils.keys(prefix + "*" + keyword + "*"); + List<String> list = new ArrayList<>(keys); + return SaFoxUtil.searchList(list, start, size); + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java new file mode 100644 index 0000000..e5bacd3 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java @@ -0,0 +1,38 @@ +package com.ruoyi.framework.satoken.service; + +import cn.dev33.satoken.stp.StpInterface; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.LoginUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class SaInterfaceImpl implements StpInterface { + + @Override + public List<String> getPermissionList(Object loginId, String loginType) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + LoginUser loginUser = LoginUtils.getLoginUser(); + return new ArrayList<>(loginUser.getMenuPermission()); + } else if (userType == UserType.APP_USER) { + // app绔潈闄愯繑鍥� 鑷鏍规嵁涓氬姟缂栧啓 + } + return new ArrayList<>(); + } + + @Override + public List<String> getRoleList(Object loginId, String loginType) { + UserType userType = LoginUtils.getUserType(loginId); + if (userType == UserType.SYS_USER) { + LoginUser loginUser = LoginUtils.getLoginUser(); + return new ArrayList<>(loginUser.getRolePermission()); + } else if (userType == UserType.APP_USER) { + // app绔潈闄愯繑鍥� 鑷鏍规嵁涓氬姟缂栧啓 + } + return new ArrayList<>(); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java deleted file mode 100644 index 4ebb4aa..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ruoyi.framework.security.filter; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * token杩囨护鍣� 楠岃瘉token鏈夋晥鎬� - * - * @author ruoyi - */ -@Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { - - @Autowired - private TokenService tokenService; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { - tokenService.verifyToken(loginUser); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authenticationToken); - } - chain.doFilter(request, response); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java deleted file mode 100644 index 35b0f92..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.Serializable; - -/** - * 璁よ瘉澶辫触澶勭悊绫� 杩斿洖鏈巿鏉� - * - * @author ruoyi - */ -@Component -public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { - private static final long serialVersionUID = -8970718410437077606L; - - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) - throws IOException { - int code = HttpStatus.HTTP_UNAUTHORIZED; - String msg = StringUtils.format("璇锋眰璁块棶锛歿}锛岃璇佸け璐ワ紝鏃犳硶璁块棶绯荤粺璧勬簮", request.getRequestURI()); - ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(code, msg))); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java deleted file mode 100644 index 969af51..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛 - * - * @author ruoyi - */ -@Configuration -public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { - - @Autowired - private TokenService tokenService; - - @Autowired - private LogininforService asyncService; - - /** - * 閫�鍑哄鐞� - */ - @Override - public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException { - LoginUser loginUser = tokenService.getLoginUser(request); - String message = MessageUtils.message("user.logout.success"); - if (StringUtils.isNotNull(loginUser)) { - String userName = loginUser.getUsername(); - // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍 - tokenService.delLoginUser(loginUser.getToken()); - // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇� - asyncService.recordLogininfor(userName, Constants.LOGOUT, message, request); - } - ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(HttpStatus.HTTP_OK, message))); - } - -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 4c642c2..60979dd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,13 +1,18 @@ package com.ruoyi.framework.web.exception; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import cn.dev33.satoken.exception.NotRoleException; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.http.HttpStatus; +import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.exception.DemoModeException; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.support.DefaultMessageSourceResolvable; -import org.springframework.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -31,14 +36,34 @@ /** * 鏉冮檺鏍¢獙寮傚父 */ - @ExceptionHandler(AccessDeniedException.class) - public AjaxResult<Void> handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { + @ExceptionHandler(NotPermissionException.class) + public AjaxResult<Void> handleAccessDeniedException(NotPermissionException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("璇锋眰鍦板潃'{}',鏉冮檺鏍¢獙澶辫触'{}'", requestURI, e.getMessage()); return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "娌℃湁鏉冮檺锛岃鑱旂郴绠$悊鍛樻巿鏉�"); } /** + * 瑙掕壊鏍¢獙寮傚父 + */ + @ExceptionHandler(NotRoleException.class) + public AjaxResult<Void> handleAccessDeniedException(NotRoleException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',瑙掕壊鏍¢獙澶辫触'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "娌℃湁瑙掕壊锛岃鑱旂郴绠$悊鍛樻巿鏉�"); + } + + /** + * 璁よ瘉澶辫触 + */ + @ExceptionHandler(NotLoginException.class) + public AjaxResult<Void> handleAccessDeniedException(NotLoginException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("璇锋眰鍦板潃'{}',璁よ瘉澶辫触'{}',鏃犳硶璁块棶绯荤粺璧勬簮", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.HTTP_UNAUTHORIZED, StringUtils.format("璇锋眰鍦板潃'{}',璁よ瘉澶辫触'{}',鏃犳硶璁块棶绯荤粺璧勬簮", requestURI)); + } + + /** * 璇锋眰鏂瑰紡涓嶆敮鎸� */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java deleted file mode 100644 index 0e97b92..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ruoyi.framework.web.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.Set; - -/** - * RuoYi棣栧垱 鑷畾涔夋潈闄愬疄鐜帮紝ss鍙栬嚜SpringSecurity棣栧瓧姣� - * - * @author ruoyi - */ -@Service("ss") -public class PermissionService { - /** - * 鎵�鏈夋潈闄愭爣璇� - */ - private static final String ALL_PERMISSION = "*:*:*"; - - /** - * 绠$悊鍛樿鑹叉潈闄愭爣璇� - */ - private static final String SUPER_ADMIN = "admin"; - - private static final String ROLE_DELIMETER = ","; - - private static final String PERMISSION_DELIMETER = ","; - - /** - * 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄� - * - * @param permission 鏉冮檺瀛楃涓� - * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄� - */ - public boolean hasPermi(String permission) { - if (StringUtils.isEmpty(permission)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - return hasPermissions(loginUser.getMenuPermissions(), permission); - } - - /** - * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺锛屼笌 hasPermi閫昏緫鐩稿弽 - * - * @param permission 鏉冮檺瀛楃涓� - * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺 - */ - public boolean lacksPermi(String permission) { - return hasPermi(permission) != true; - } - - /** - * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓潈闄� - * - * @param permissions 浠� PERMISSION_NAMES_DELIMETER 涓哄垎闅旂鐨勬潈闄愬垪琛� - * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓潈闄� - */ - public boolean hasAnyPermi(String permissions) { - if (StringUtils.isEmpty(permissions)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - Set<String> authorities = loginUser.getMenuPermissions(); - for (String permission : permissions.split(PERMISSION_DELIMETER)) { - if (permission != null && hasPermissions(authorities, permission)) { - return true; - } - } - return false; - } - - /** - * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁鏌愪釜瑙掕壊 - * - * @param role 瑙掕壊瀛楃涓� - * @return 鐢ㄦ埛鏄惁鍏峰鏌愯鑹� - */ - public boolean hasRole(String role) { - if (StringUtils.isEmpty(role)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set<String> rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - return false; - } - - /** - * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊锛屼笌 isRole閫昏緫鐩稿弽銆� - * - * @param role 瑙掕壊鍚嶇О - * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊 - */ - public boolean lacksRole(String role) { - return hasRole(role) != true; - } - - /** - * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓鑹� - * - * @param roles 浠� ROLE_NAMES_DELIMETER 涓哄垎闅旂鐨勮鑹插垪琛� - * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓鑹� - */ - public boolean hasAnyRoles(String roles) { - if (StringUtils.isEmpty(roles)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set<String> rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String role : roles.split(ROLE_DELIMETER)) { - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - } - return false; - } - - /** - * 鍒ゆ柇鏄惁鍖呭惈鏉冮檺 - * - * @param permissions 鏉冮檺鍒楄〃 - * @param permission 鏉冮檺瀛楃涓� - * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄� - */ - private boolean hasPermissions(Set<String> permissions, String permission) { - return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); - } -} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index 685a5bb..f1ff61a 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -1,5 +1,6 @@ package com.ruoyi.generator.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import com.ruoyi.common.annotation.Log; @@ -16,7 +17,6 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -45,7 +45,7 @@ * 鏌ヨ浠g爜鐢熸垚鍒楄〃 */ @ApiOperation("鏌ヨ浠g爜鐢熸垚鍒楄〃") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/list") public TableDataInfo<GenTable> genList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageGenTableList(genTable, pageQuery); @@ -55,7 +55,7 @@ * 淇敼浠g爜鐢熸垚涓氬姟 */ @ApiOperation("淇敼浠g爜鐢熸垚涓氬姟") - @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @SaCheckPermission("tool:gen:query") @GetMapping(value = "/{talbleId}") public AjaxResult<Map<String, Object>> getInfo(@PathVariable Long talbleId) { GenTable table = genTableService.selectGenTableById(talbleId); @@ -72,7 +72,7 @@ * 鏌ヨ鏁版嵁搴撳垪琛� */ @ApiOperation("鏌ヨ鏁版嵁搴撳垪琛�") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/db/list") public TableDataInfo<GenTable> dataList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageDbTableList(genTable, pageQuery); @@ -82,7 +82,7 @@ * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛� */ @ApiOperation("鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛�") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{talbleId}") public TableDataInfo<GenTableColumn> columnList(Long tableId) { TableDataInfo<GenTableColumn> dataInfo = new TableDataInfo<>(); @@ -96,7 +96,7 @@ * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛� */ @ApiOperation("瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛�") - @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @SaCheckPermission("tool:gen:import") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT) @PostMapping("/importTable") public AjaxResult<Void> importTableSave(String tables) { @@ -111,7 +111,7 @@ * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟 */ @ApiOperation("淇敼淇濆瓨浠g爜鐢熸垚涓氬姟") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @SaCheckPermission("tool:gen:edit") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult<Void> editSave(@Validated @RequestBody GenTable genTable) { @@ -124,7 +124,7 @@ * 鍒犻櫎浠g爜鐢熸垚 */ @ApiOperation("鍒犻櫎浠g爜鐢熸垚") - @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @SaCheckPermission("tool:gen:remove") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") public AjaxResult<Void> remove(@PathVariable Long[] tableIds) { @@ -136,7 +136,7 @@ * 棰勮浠g爜 */ @ApiOperation("棰勮浠g爜") - @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @SaCheckPermission("tool:gen:preview") @GetMapping("/preview/{tableId}") public AjaxResult<Map<String, String>> preview(@PathVariable("tableId") Long tableId) throws IOException { Map<String, String> dataMap = genTableService.previewCode(tableId); @@ -147,7 +147,7 @@ * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級 */ @ApiOperation("鐢熸垚浠g爜锛堜笅杞芥柟寮忥級") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { @@ -159,7 +159,7 @@ * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛� */ @ApiOperation("鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") public AjaxResult<Void> genCode(@PathVariable("tableName") String tableName) { @@ -171,7 +171,7 @@ * 鍚屾鏁版嵁搴� */ @ApiOperation("鍚屾鏁版嵁搴�") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @SaCheckPermission("tool:gen:edit") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableName}") public AjaxResult<Void> synchDb(@PathVariable("tableName") String tableName) { @@ -183,7 +183,7 @@ * 鎵归噺鐢熸垚浠g爜 */ @ApiOperation("鎵归噺鐢熸垚浠g爜") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") public void batchGenCode(HttpServletResponse response, String tables) throws IOException { diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 3ac512b..8382443 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -10,9 +10,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; @@ -161,7 +159,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void importGenTable(List<GenTable> tableList) { - String operName = SecurityUtils.getUsername(); + String operName = LoginUtils.getUsername(); try { for (GenTable table : tableList) { String tableName = table.getTableName(); diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 16798f3..cd618fb 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -7,7 +7,7 @@ import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; -import org.springframework.security.access.prepost.PreAuthorize; +import cn.dev33.satoken.annotation.SaCheckPermission; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -51,7 +51,7 @@ * 鏌ヨ${functionName}鍒楄〃 */ @ApiOperation("鏌ヨ${functionName}鍒楄〃") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @SaCheckPermission("${permissionPrefix}:list") @GetMapping("/list") #if($table.crud || $table.sub) public TableDataInfo<${ClassName}Vo> list(@Validated(QueryGroup.class) ${ClassName}Bo bo, PageQuery pageQuery) { @@ -68,7 +68,7 @@ * 瀵煎嚭${functionName}鍒楄〃 */ @ApiOperation("瀵煎嚭${functionName}鍒楄〃") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @SaCheckPermission("${permissionPrefix}:export") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@Validated ${ClassName}Bo bo, HttpServletResponse response) { @@ -80,7 +80,7 @@ * 鑾峰彇${functionName}璇︾粏淇℃伅 */ @ApiOperation("鑾峰彇${functionName}璇︾粏淇℃伅") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @SaCheckPermission("${permissionPrefix}:query") @GetMapping("/{${pkColumn.javaField}}") public AjaxResult<${ClassName}Vo> getInfo(@ApiParam("涓婚敭") @NotNull(message = "涓婚敭涓嶈兘涓虹┖") @@ -92,7 +92,7 @@ * 鏂板${functionName} */ @ApiOperation("鏂板${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @SaCheckPermission("${permissionPrefix}:add") @Log(title = "${functionName}", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -104,7 +104,7 @@ * 淇敼${functionName} */ @ApiOperation("淇敼${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @SaCheckPermission("${permissionPrefix}:edit") @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -116,7 +116,7 @@ * 鍒犻櫎${functionName} */ @ApiOperation("鍒犻櫎${functionName}") - @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @SaCheckPermission("${permissionPrefix}:remove") @Log(title = "${functionName}" , businessType = BusinessType.DELETE) @DeleteMapping("/{${pkColumn.javaField}s}") public AjaxResult<Void> remove(@ApiParam("涓婚敭涓�") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java index 3b700d4..9bd21d3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java @@ -7,6 +7,7 @@ import com.ruoyi.common.excel.ExcelListener; import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ValidatorUtils; @@ -44,7 +45,7 @@ this.userService = SpringUtils.getBean(ISysUserService.class); this.password = SecurityUtils.encryptPassword(initPassword); this.isUpdateSupport = isUpdateSupport; - this.operName = SecurityUtils.getUsername(); + this.operName = LoginUtils.getUsername(); } @Override diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java deleted file mode 100644 index aefc3c7..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.system.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.system.domain.SysUserOnline; - -/** - * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞� - * - * @author Lion Li - */ -public interface ISysUserOnlineService { - /** - * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 - * - * @param ipaddr 鐧诲綍鍦板潃 - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); - - /** - * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 - * - * @param userName 鐢ㄦ埛鍚嶇О - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - SysUserOnline selectOnlineByUserName(String userName, LoginUser user); - - /** - * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 - * - * @param ipaddr 鐧诲綍鍦板潃 - * @param userName 鐢ㄦ埛鍚嶇О - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); - - /** - * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 - * - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛 - */ - SysUserOnline loginUserToUserOnline(LoginUser user); -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index cd9a957..3ef0900 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -1,24 +1,21 @@ package com.ruoyi.system.service; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.core.service.TokenService; +import com.ruoyi.common.enums.DeviceType; +import com.ruoyi.common.enums.UserStatus; +import com.ruoyi.common.enums.UserType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; import com.ruoyi.common.exception.user.UserException; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.redis.RedisUtils; +import com.ruoyi.common.utils.*; +import lombok.extern.slf4j.Slf4j; import lombok.RequiredArgsConstructor; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -30,14 +27,14 @@ * @author Lion Li */ @RequiredArgsConstructor +@Slf4j @Service public class SysLoginService { - private final TokenService tokenService; - private final AuthenticationManager authenticationManager; private final ISysUserService userService; private final ISysConfigService configService; private final LogininforService asyncService; + private final SysPermissionService permissionService; /** * 鐧诲綍楠岃瘉 @@ -62,39 +59,49 @@ asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); } - // 鐢ㄦ埛楠岃瘉 - Authentication authentication = null; - try { - // 璇ユ柟娉曚細鍘昏皟鐢║serDetailsServiceImpl.loadUserByUsername - authentication = authenticationManager - .authenticate(new UsernamePasswordAuthenticationToken(username, password)); - } catch (Exception e) { - if (e instanceof BadCredentialsException) { - // 鏄惁绗竴娆� - errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; - // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰� - if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { - RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); - throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); - } else { - // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑 - RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber); - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request); - throw new UserException("user.password.retry.limit.count", errorNumber); - } + + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username); + throw new UserException("user.not.exists", username); + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍒犻櫎.", username); + throw new UserException("user.password.delete", username); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username); + throw new UserException("user.blocked", username); + } + if (!SecurityUtils.matchesPassword(password, user.getPassword())) { + // 鏄惁绗竴娆� + errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; + // 杈惧埌瑙勫畾閿欒娆℃暟 鍒欓攣瀹氱櫥褰� + if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); } else { - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request); - throw new ServiceException(e.getMessage()); + // 鏈揪鍒拌瀹氶敊璇鏁� 鍒欓�掑 + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request); + throw new UserException("user.password.retry.limit.count", errorNumber); } } + // 鐧诲綍鎴愬姛 娓呯┖閿欒娆℃暟 RedisUtils.deleteObject(Constants.LOGIN_ERROR + username); asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); - LoginUser loginUser = (LoginUser) authentication.getPrincipal(); - recordLoginInfo(loginUser.getUserId(), username); + recordLoginInfo(user.getUserId(), username); + + LoginUser loginUser = new LoginUser(); + loginUser.setUserId(user.getUserId()); + loginUser.setDeptId(user.getDeptId()); + loginUser.setUsername(user.getUserName()); + loginUser.setMenuPermission(permissionService.getMenuPermission(user)); + loginUser.setRolePermission(permissionService.getRolePermission(user)); + // 鐢熸垚token - return tokenService.createToken(loginUser); + LoginUtils.loginByDevice(loginUser, UserType.SYS_USER, DeviceType.PC); + return StpUtil.getTokenValue(); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 42b1892..6736d7c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -10,7 +10,7 @@ import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.TreeBuildUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -153,7 +153,7 @@ */ @Override public void checkDeptDataScope(Long deptId) { - if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + if (!SysUser.isAdmin(LoginUtils.getUserId())) { SysDept dept = new SysDept(); dept.setDeptId(deptId); List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index f3c4a74..2f72767 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysRoleDept; @@ -182,7 +182,7 @@ */ @Override public void checkRoleDataScope(Long roleId) { - if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + if (!SysUser.isAdmin(LoginUtils.getUserId())) { SysRole role = new SysRole(); role.setRoleId(roleId); List<SysRole> roles = SpringUtils.getAopProxy(this).selectRoleList(role); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java deleted file mode 100644 index 8ec0fe2..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ruoyi.system.service.impl; - -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.mapper.SysUserMapper; -import com.ruoyi.system.service.ISysUserOnlineService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -/** - * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞傚鐞� - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class SysUserOnlineServiceImpl implements ISysUserOnlineService { - - private final SysUserMapper userMapper; - - /** - * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅 - * - * @param ipaddr 鐧诲綍鍦板潃 - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - @Override - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 - * - * @param userName 鐢ㄦ埛鍚嶇О - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - @Override - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { - if (StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅 - * - * @param ipaddr 鐧诲綍鍦板潃 - * @param userName 鐢ㄦ埛鍚嶇О - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅 - */ - @Override - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅 - * - * @param user 鐢ㄦ埛淇℃伅 - * @return 鍦ㄧ嚎鐢ㄦ埛 - */ - @Override - public SysUserOnline loginUserToUserOnline(LoginUser user) { - if (StringUtils.isNull(user)) { - return null; - } - SysUser sysUser = userMapper.selectUserById(user.getUserId()); - SysUserOnline sysUserOnline = new SysUserOnline(); - sysUserOnline.setTokenId(user.getToken()); - sysUserOnline.setUserName(user.getUsername()); - sysUserOnline.setIpaddr(user.getIpaddr()); - sysUserOnline.setLoginLocation(user.getLoginLocation()); - sysUserOnline.setBrowser(user.getBrowser()); - sysUserOnline.setOs(user.getOs()); - sysUserOnline.setLoginTime(user.getLoginTime()); - if (StringUtils.isNotNull(sysUser.getDept())) { - sysUserOnline.setDeptName(sysUser.getDept().getDeptName()); - } - return sysUserOnline; - } -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index fe028bc..9dd77a0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.LoginUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -208,7 +209,7 @@ */ @Override public void checkUserDataScope(Long userId) { - if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + if (!SysUser.isAdmin(LoginUtils.getUserId())) { SysUser user = new SysUser(); user.setUserId(userId); List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java deleted file mode 100644 index af14f37..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.ruoyi.system.service.impl; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.jwt.JWTUtil; -import cn.hutool.jwt.signers.JWTSigner; -import cn.hutool.jwt.signers.JWTSignerUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.properties.TokenProperties; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.AddressUtils; -import com.ruoyi.common.utils.redis.RedisUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * token楠岃瘉澶勭悊 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class TokenServiceImpl implements TokenService { - - protected static final long MILLIS_SECOND = 1000; - - protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; - - private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; - - private final TokenProperties tokenProperties; - - /** - * 鑾峰彇鐢ㄦ埛韬唤淇℃伅 - * - * @return 鐢ㄦ埛淇℃伅 - */ - @Override - public LoginUser getLoginUser(HttpServletRequest request) { - // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗� - String token = getToken(request); - if (StringUtils.isNotEmpty(token)) { - try { - JSONObject claims = parseToken(token); - // 瑙f瀽瀵瑰簲鐨勬潈闄愪互鍙婄敤鎴蜂俊鎭� - String uuid = claims.getStr(Constants.LOGIN_USER_KEY); - String userKey = getTokenKey(uuid); - LoginUser user = RedisUtils.getCacheObject(userKey); - return user; - } catch (Exception e) { - - } - } - return null; - } - - /** - * 璁剧疆鐢ㄦ埛韬唤淇℃伅 - */ - @Override - public void setLoginUser(LoginUser loginUser) { - if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { - refreshToken(loginUser); - } - } - - /** - * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅 - */ - @Override - public void delLoginUser(String token) { - if (StringUtils.isNotEmpty(token)) { - String userKey = getTokenKey(token); - RedisUtils.deleteObject(userKey); - } - } - - /** - * 鍒涘缓浠ょ墝 - * - * @param loginUser 鐢ㄦ埛淇℃伅 - * @return 浠ょ墝 - */ - @Override - public String createToken(LoginUser loginUser) { - String token = IdUtil.fastUUID(); - loginUser.setToken(token); - setUserAgent(loginUser); - refreshToken(loginUser); - - Map<String, Object> claims = new HashMap<>(); - claims.put(Constants.LOGIN_USER_KEY, token); - return createToken(claims); - } - - /** - * 楠岃瘉浠ょ墝鏈夋晥鏈燂紝鐩稿樊涓嶈冻20鍒嗛挓锛岃嚜鍔ㄥ埛鏂扮紦瀛� - * - * @param loginUser - * @return 浠ょ墝 - */ - @Override - public void verifyToken(LoginUser loginUser) { - long expireTime = loginUser.getExpireTime(); - long currentTime = System.currentTimeMillis(); - if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { - refreshToken(loginUser); - } - } - - /** - * 鍒锋柊浠ょ墝鏈夋晥鏈� - * - * @param loginUser 鐧诲綍淇℃伅 - */ - @Override - public void refreshToken(LoginUser loginUser) { - loginUser.setLoginTime(System.currentTimeMillis()); - loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpireTime() * MILLIS_MINUTE); - // 鏍规嵁uuid灏唋oginUser缂撳瓨 - String userKey = getTokenKey(loginUser.getToken()); - RedisUtils.setCacheObject(userKey, loginUser, tokenProperties.getExpireTime(), TimeUnit.MINUTES); - } - - /** - * 璁剧疆鐢ㄦ埛浠g悊淇℃伅 - * - * @param loginUser 鐧诲綍淇℃伅 - */ - @Override - public void setUserAgent(LoginUser loginUser) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - loginUser.setIpaddr(ip); - loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); - loginUser.setBrowser(userAgent.getBrowser().getName()); - loginUser.setOs(userAgent.getOs().getName()); - } - - /** - * 浠庢暟鎹0鏄庣敓鎴愪护鐗� - * - * @param claims 鏁版嵁澹版槑 - * @return 浠ょ墝 - */ - private String createToken(Map<String, Object> claims) { - JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); - String token = JWTUtil.createToken(claims, signer); - return token; - } - - /** - * 浠庝护鐗屼腑鑾峰彇鏁版嵁澹版槑 - * - * @param token 浠ょ墝 - * @return 鏁版嵁澹版槑 - */ - private JSONObject parseToken(String token) { - JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); - return JWTUtil.parseToken(token).setSigner(signer).getPayload().getClaimsJson(); - } - - /** - * 浠庝护鐗屼腑鑾峰彇鐢ㄦ埛鍚� - * - * @param token 浠ょ墝 - * @return 鐢ㄦ埛鍚� - */ - @Override - public String getUsernameFromToken(String token) { - JSONObject claims = parseToken(token); - return claims.getStr("sub"); - } - - /** - * 鑾峰彇璇锋眰token - * - * @param request - * @return token - */ - private String getToken(HttpServletRequest request) { - String token = request.getHeader(tokenProperties.getHeader()); - if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { - token = token.replace(Constants.TOKEN_PREFIX, ""); - } - return token; - } - - private String getTokenKey(String uuid) { - return Constants.LOGIN_TOKEN_KEY + uuid; - } -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java deleted file mode 100644 index c66aa59..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ruoyi.system.service.impl; - -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.enums.UserStatus; -import com.ruoyi.common.exception.user.UserException; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysUserService; -import com.ruoyi.system.service.SysPermissionService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -/** - * 鐢ㄦ埛楠岃瘉澶勭悊 - * - * @author ruoyi - */ -@Slf4j -@RequiredArgsConstructor -@Service -public class UserDetailsServiceImpl implements UserDetailsService { - - private final ISysUserService userService; - private final SysPermissionService permissionService; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - SysUser user = userService.selectUserByUserName(username); - if (StringUtils.isNull(user)) { - log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username); - throw new UserException("user.not.exists", username); - } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { - log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍒犻櫎.", username); - throw new UserException("user.password.delete", username); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username); - throw new UserException("user.blocked", username); - } - - return createLoginUser(user); - } - - public UserDetails createLoginUser(SysUser user) { - return new LoginUser() - .setUserId(user.getUserId()) - .setDeptId(user.getDeptId()) - .setUsername(user.getUserName()) - .setPassword(user.getPassword()) - .setMenuPermissions(permissionService.getMenuPermission(user)) - .setRolePermissions(permissionService.getRolePermission(user)); - } -} -- Gitblit v1.9.3