From dec5f1a46d9904a7c7c4756e3e095c88708cda22 Mon Sep 17 00:00:00 2001 From: tanyp <742354529@qq.com> Date: Fri, 7 Apr 2023 16:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tansci/common/constant/Constants.java | 10 ++ .../tansci/controller/SysMenuController.java | 52 +++++++++-- .../tansci/domain/vo/SysUserSessionVo.java | 5 - .../tansci/handler/StpInterfaceHandler.java | 93 +++++++++++++++++++ .../service/impl/SysMenuServiceImpl.java | 16 +--- .../service/impl/SysUserServiceImpl.java | 24 ++--- 6 files changed, 159 insertions(+), 41 deletions(-) create mode 100644 tansci-boot/src/main/java/com/tansci/handler/StpInterfaceHandler.java diff --git a/tansci-boot/src/main/java/com/tansci/common/constant/Constants.java b/tansci-boot/src/main/java/com/tansci/common/constant/Constants.java index a34bc73..c5a9b70 100644 --- a/tansci-boot/src/main/java/com/tansci/common/constant/Constants.java +++ b/tansci-boot/src/main/java/com/tansci/common/constant/Constants.java @@ -29,4 +29,14 @@ public class Constants { public final static String UPDATE = "INSERT"; public final static String DELETE = "DELETE"; + /** + * 权限校验 + */ + public final static String PERMISSION_KEY = "permission-session"; + /** + * 角色校验 + */ + public final static String ROLE_KEY = "role-session"; + + } diff --git a/tansci-boot/src/main/java/com/tansci/controller/SysMenuController.java b/tansci-boot/src/main/java/com/tansci/controller/SysMenuController.java index d852467..dbf2330 100644 --- a/tansci-boot/src/main/java/com/tansci/controller/SysMenuController.java +++ b/tansci-boot/src/main/java/com/tansci/controller/SysMenuController.java @@ -1,5 +1,6 @@ package com.tansci.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; import com.tansci.common.WrapMapper; import com.tansci.common.Wrapper; import com.tansci.common.annotation.Log; @@ -11,9 +12,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -33,13 +32,6 @@ public class SysMenuController { @Autowired private SysMenuService sysMenuService; - @ApiOperation(value = "当前用户权限菜单树", notes = "当前用户权限菜单树") - @Log(modul = "菜单管理-当前用户权限菜单树", type = Constants.SELECT, desc = "当前用户权限菜单树") - @GetMapping("/tree") - public Wrapper> tree(SysMenu menu) { - return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.tree(menu)); - } - @ApiOperation(value = "当前用户权限菜单列表", notes = "当前用户权限菜单列表") @Log(modul = "菜单管理-当前用户权限菜单列表", type = Constants.SELECT, desc = "当前用户权限菜单列表") @GetMapping("/menus") @@ -47,4 +39,44 @@ public class SysMenuController { return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.menus()); } + @ApiOperation(value = "菜单树", notes = "菜单树") + @Log(modul = "菜单管理-菜单树", type = Constants.SELECT, desc = "菜单树") + @GetMapping("/tree") + @SaCheckPermission("menu:list") + public Wrapper> tree(SysMenu menu) { + return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.tree(menu)); + } + + @ApiOperation(value = "详情", notes = "详情") + @Log(modul = "菜单管理-详情", type = Constants.SELECT, desc = "详情") + @GetMapping("/getById/{id}") + @SaCheckPermission("menu:view") + public Wrapper getById(@PathVariable String id) { + return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.getById(id)); + } + + @ApiOperation(value = "添加", notes = "添加") + @Log(modul = "菜单管理-添加", type = Constants.INSERT, desc = "添加") + @GetMapping("/save") + @SaCheckPermission("menu:save") + public Wrapper save(@RequestBody SysMenu menu) { + return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.save(menu)); + } + + @ApiOperation(value = "删除", notes = "删除") + @Log(modul = "菜单管理-删除", type = Constants.DELETE, desc = "删除") + @GetMapping("/delete/{id}") + @SaCheckPermission("menu:delete") + public Wrapper delete(@PathVariable String id) { + return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.removeById(id)); + } + + @ApiOperation(value = "修改", notes = "修改") + @Log(modul = "菜单管理-修改", type = Constants.UPDATE, desc = "修改") + @PostMapping("/update") + @SaCheckPermission("menu:update") + public Wrapper update(@RequestBody SysMenu menu) { + return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysMenuService.updateById(menu)); + } + } diff --git a/tansci-boot/src/main/java/com/tansci/domain/vo/SysUserSessionVo.java b/tansci-boot/src/main/java/com/tansci/domain/vo/SysUserSessionVo.java index 0d07e5a..1f31d54 100644 --- a/tansci-boot/src/main/java/com/tansci/domain/vo/SysUserSessionVo.java +++ b/tansci-boot/src/main/java/com/tansci/domain/vo/SysUserSessionVo.java @@ -7,8 +7,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /** * @ClassName: SysUserSession.java * @ClassPath: com.tansci.domain.vo.SysUserSession.java @@ -35,7 +33,4 @@ public class SysUserSessionVo { @ApiModelProperty(value = "用户类型:1、管理员,2、普通用户") private Integer type; - @ApiModelProperty(value = "权限IDS") - private List roleIds; - } diff --git a/tansci-boot/src/main/java/com/tansci/handler/StpInterfaceHandler.java b/tansci-boot/src/main/java/com/tansci/handler/StpInterfaceHandler.java new file mode 100644 index 0000000..74f73f2 --- /dev/null +++ b/tansci-boot/src/main/java/com/tansci/handler/StpInterfaceHandler.java @@ -0,0 +1,93 @@ +package com.tansci.handler; + +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.tansci.common.constant.Constants; +import com.tansci.domain.SysMenu; +import com.tansci.domain.SysRoleMenu; +import com.tansci.domain.SysUserRole; +import com.tansci.service.SysMenuService; +import com.tansci.service.SysRoleMenuService; +import com.tansci.service.SysUserRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @ClassName: StpInterfaceHandler.java + * @ClassPath: com.tansci.handler.StpInterfaceHandler.java + * @Description: 自定义权限验证 + * @Author: tanyp + * @Date: 2023/4/7 15:07 + **/ +@Component +public class StpInterfaceHandler implements StpInterface { + + @Autowired + private SysUserRoleService sysUserRoleService; + @Autowired + private SysRoleMenuService sysRoleMenuService; + @Autowired + private SysMenuService sysMenuService; + + /** + * @MonthName: getPermissionList + * @Description: 返回一个账号所拥有的权限码集合 + * @Author: tanyp + * @Date: 2023/4/7 15:08 + * @Param: [o, s] + * @return: java.util.List + **/ + @Override + public List getPermissionList(Object o, String s) { + if (Objects.nonNull(StpUtil.getSession().get(Constants.PERMISSION_KEY))) { + return (List) StpUtil.getSession().get(Constants.PERMISSION_KEY); + } else { + List roles = sysUserRoleService.list(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, StpUtil.getLoginId())); + if (Objects.nonNull(roles) && roles.size() > 0) { + List roleIds = roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + List roleMenus = sysRoleMenuService.list(Wrappers.lambdaQuery().in(SysRoleMenu::getRoleId, roleIds)); + if (Objects.nonNull(roleMenus) && roleMenus.size() > 0) { + List menus = sysMenuService.list( + Wrappers.lambdaQuery() + .in(SysMenu::getId, roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList())) + .eq(SysMenu::getIsDel, Constants.NOT_DEL_FALG) + .ne(SysMenu::getPermission, "") + .isNotNull(SysMenu::getPermission) + ); + List permissions = menus.stream().map(SysMenu::getPermission).collect(Collectors.toList()); + StpUtil.getSession().set(Constants.ROLE_KEY, permissions); + return permissions; + } + } + } + return null; + } + + /** + * @MonthName: getRoleList + * @Description: 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验) + * @Author: tanyp + * @Date: 2023/4/7 15:08 + * @Param: [o, s] + * @return: java.util.List + **/ + @Override + public List getRoleList(Object o, String s) { + if (Objects.nonNull(StpUtil.getSession().get(Constants.ROLE_KEY))) { + return (List) StpUtil.getSession().get(Constants.ROLE_KEY); + } else { + List roles = sysUserRoleService.list(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, StpUtil.getLoginId())); + if (Objects.nonNull(roles) && roles.size() > 0) { + List roleIds = roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + StpUtil.getSession().set(Constants.ROLE_KEY, roleIds); + return roleIds; + } + } + return null; + } +} diff --git a/tansci-boot/src/main/java/com/tansci/service/impl/SysMenuServiceImpl.java b/tansci-boot/src/main/java/com/tansci/service/impl/SysMenuServiceImpl.java index 484f280..f387ef0 100644 --- a/tansci-boot/src/main/java/com/tansci/service/impl/SysMenuServiceImpl.java +++ b/tansci-boot/src/main/java/com/tansci/service/impl/SysMenuServiceImpl.java @@ -8,7 +8,6 @@ import com.tansci.common.constant.Constants; import com.tansci.domain.SysMenu; import com.tansci.domain.SysRoleMenu; import com.tansci.domain.vo.SysMenuVo; -import com.tansci.domain.vo.SysUserSessionVo; import com.tansci.mapper.SysMenuMapper; import com.tansci.service.SysMenuService; import com.tansci.service.SysRoleMenuService; @@ -35,12 +34,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List tree(SysMenu menu) { - // 菜单权限 - String userId = String.valueOf(StpUtil.getLoginId()); - SysUserSessionVo sessionVo = (SysUserSessionVo) StpUtil.getSession().get(userId); List menuIds = Lists.newArrayList(); - if (Objects.nonNull(sessionVo) && Objects.nonNull(sessionVo.getRoleIds()) && sessionVo.getRoleIds().size() > 0) { - List menus = sysRoleMenuService.list(Wrappers.lambdaQuery().eq(SysRoleMenu::getRoleId, sessionVo.getRoleIds())); + if (Objects.nonNull(StpUtil.getRoleList()) && StpUtil.getRoleList().size() > 0) { + List menus = sysRoleMenuService.list(Wrappers.lambdaQuery().eq(SysRoleMenu::getRoleId, StpUtil.getRoleList())); menuIds.addAll(menus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList())); } @@ -63,18 +59,16 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List menus() { - // 菜单权限 - String userId = String.valueOf(StpUtil.getLoginId()); - SysUserSessionVo sessionVo = (SysUserSessionVo) StpUtil.getSession().get(userId); List menuIds = Lists.newArrayList(); - if (Objects.nonNull(sessionVo) && Objects.nonNull(sessionVo.getRoleIds()) && sessionVo.getRoleIds().size() > 0) { - List menus = sysRoleMenuService.list(Wrappers.lambdaQuery().eq(SysRoleMenu::getRoleId, sessionVo.getRoleIds())); + if (Objects.nonNull(StpUtil.getRoleList()) && StpUtil.getRoleList().size() > 0) { + List menus = sysRoleMenuService.list(Wrappers.lambdaQuery().eq(SysRoleMenu::getRoleId, StpUtil.getRoleList())); menuIds.addAll(menus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList())); } List list = this.baseMapper.selectList( Wrappers.lambdaQuery() .eq(SysMenu::getIsDel, Constants.NOT_DEL_FALG) + .eq(SysMenu::getIsShow, 1) .eq(Objects.nonNull(menuIds) && menuIds.size() > 0, SysMenu::getId, menuIds) ); diff --git a/tansci-boot/src/main/java/com/tansci/service/impl/SysUserServiceImpl.java b/tansci-boot/src/main/java/com/tansci/service/impl/SysUserServiceImpl.java index c1f4512..8f27aa1 100644 --- a/tansci-boot/src/main/java/com/tansci/service/impl/SysUserServiceImpl.java +++ b/tansci-boot/src/main/java/com/tansci/service/impl/SysUserServiceImpl.java @@ -27,7 +27,6 @@ import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; /** * @ClassName: SysUserServiceImpl.java @@ -131,22 +130,17 @@ public class SysUserServiceImpl extends ServiceImpl impl // 生成token StpUtil.login(sysUser.getId()); - // 登录日志记录 loginLog.setToken(StpUtil.getTokenInfo().getTokenValue()); - // 用户角色到session - List roles = sysUserRoleService.list(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, sysUser.getId())); - if (Objects.nonNull(roles) && roles.size() > 0) { - StpUtil.getSession().set(sysUser.getId(), - SysUserSessionVo.builder() - .id(sysUser.getId()) - .username(sysUser.getUsername()) - .nickname(sysUser.getNickname()) - .type(sysUser.getType()) - .roleIds(roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList())) - .build() - ); - } + // 存储session + StpUtil.getSession().set(sysUser.getId(), + SysUserSessionVo.builder() + .id(sysUser.getId()) + .username(sysUser.getUsername()) + .nickname(sysUser.getNickname()) + .type(sysUser.getType()) + .build() + ); return SysUserVo.builder() .username(sysUser.getUsername())