diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java index 52bf3414b..bcf7bedbe 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java @@ -27,6 +27,7 @@ import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.TenantUtils; import com.pig4cloud.pigx.common.security.service.PigxUser; import lombok.AllArgsConstructor; +import org.springframework.cache.CacheManager; import org.springframework.data.redis.core.ConvertingCursor; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisTemplate; @@ -39,7 +40,6 @@ import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -60,6 +60,7 @@ public class PigxTokenEndpoint { private static final String PIGX_OAUTH_ACCESS = SecurityConstants.PIGX_PREFIX + SecurityConstants.OAUTH_PREFIX + "access:"; private final TokenStore tokenStore; private final RedisTemplate redisTemplate; + private final CacheManager cacheManager; /** * 认证页面 @@ -78,15 +79,20 @@ public class PigxTokenEndpoint { */ @DeleteMapping("/logout") public R logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) { - if (StringUtils.hasText(authHeader)) { - String tokenValue = authHeader.replace("Bearer", "").trim(); - OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue); - if (accessToken == null || StrUtil.isBlank(accessToken.getValue())) { - return new R<>(false, "退出失败,token 为空"); - } - tokenStore.removeAccessToken(accessToken); + if (StrUtil.isBlank(authHeader)) { + return new R<>(false, "退出失败,token 为空"); } + String tokenValue = authHeader.replace("Bearer", "").trim(); + OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue); + if (accessToken == null || StrUtil.isBlank(accessToken.getValue())) { + return new R<>(false, "退出失败,token 无效"); + } + + OAuth2Authentication auth2Authentication = tokenStore.readAuthentication(accessToken); + cacheManager.getCache("user_details") + .evict(auth2Authentication.getName()); + tokenStore.removeAccessToken(accessToken); return new R<>(Boolean.TRUE); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RoleController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RoleController.java index e6fd6f379..3a15b08a6 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RoleController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RoleController.java @@ -84,7 +84,7 @@ public class RoleController { @DeleteMapping("/{id}") @PreAuthorize("@pms.hasPermission('sys_role_del')") public R roleDel(@PathVariable Integer id) { - return new R<>(sysRoleService.deleteById(id)); + return new R<>(sysRoleService.deleteRoleById(id)); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java index 694ff28b3..9e98670ca 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java @@ -41,4 +41,12 @@ public interface SysRoleService extends IService { * @return */ List findRolesByUserId(Integer userId); + + /** + * 通过角色ID,删除角色 + * + * @param id + * @return + */ + Boolean deleteRoleById(Integer id); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java index 422e02bfb..f45989f01 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java @@ -22,14 +22,18 @@ package com.pig4cloud.pigx.admin.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; import com.pig4cloud.pigx.admin.api.vo.MenuVO; import com.pig4cloud.pigx.admin.mapper.SysMenuMapper; +import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pigx.admin.service.SysMenuService; +import lombok.AllArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -40,7 +44,9 @@ import java.util.List; * @since 2017-10-29 */ @Service +@AllArgsConstructor public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + private final SysRoleMenuMapper sysRoleMenuMapper; @Override @Cacheable(value = "menu_details", key = "#roleId + '_menu'") @@ -51,13 +57,22 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override @CacheEvict(value = "menu_details", allEntries = true) public Boolean deleteMenu(Integer id) { - // 删除当前节点 - this.deleteById(id); + // 查询父节点为当前节点的节点 + SysMenu conditon = new SysMenu(); + conditon.setParentId(id); + List menuIdList = this.selectList(new EntityWrapper<>(conditon)) + .stream().map(SysMenu::getMenuId) + .collect(Collectors.toList()); + menuIdList.add(id); - // 删除父节点为当前节点的节点 - SysMenu conditon2 = new SysMenu(); - conditon2.setParentId(id); - return this.delete(new EntityWrapper<>(conditon2)); + //删除关联ROLE_MENU 数据 + menuIdList.forEach(menu -> { + SysRoleMenu conditon2 = new SysRoleMenu(); + conditon2.setMenuId(menu); + sysRoleMenuMapper.delete(new EntityWrapper<>(conditon2)); + }); + //删除当前菜单及其子菜单 + return this.deleteBatchIds(menuIdList); } @Override diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java index 1802b821e..673ec8551 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleServiceImpl.java @@ -19,11 +19,17 @@ package com.pig4cloud.pigx.admin.service.impl; +import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; import com.pig4cloud.pigx.admin.mapper.SysRoleMapper; +import com.pig4cloud.pigx.admin.mapper.SysRoleMenuMapper; import com.pig4cloud.pigx.admin.service.SysRoleService; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -36,7 +42,9 @@ import java.util.List; * @since 2017-10-29 */ @Service +@AllArgsConstructor public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + private SysRoleMenuMapper sysRoleMenuMapper; /** * 通过用户ID,查询角色信息 @@ -48,4 +56,21 @@ public class SysRoleServiceImpl extends ServiceImpl impl public List findRolesByUserId(Integer userId) { return baseMapper.findRolesByUserId(userId); } + + /** + * 通过角色ID,删除角色,并清空角色菜单缓存 + * + * @param id + * @return + */ + @Override + @CacheEvict(value = "menu_details", allEntries = true) + @Transactional(rollbackFor = Exception.class) + public Boolean deleteRoleById(Integer id) { + SysRoleMenu condition = new SysRoleMenu(); + condition.setRoleId(id); + + sysRoleMenuMapper.delete(new EntityWrapper<>(condition)); + return this.deleteById(id); + } }