Explorar o código

:sparkles: 添加新特性。 logout remove cache details

冷冷 %!s(int64=6) %!d(string=hai) anos
pai
achega
c77668bd0a

+ 14 - 8
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<Boolean> 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);
 	}
 

+ 1 - 1
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<Boolean> roleDel(@PathVariable Integer id) {
-		return new R<>(sysRoleService.deleteById(id));
+		return new R<>(sysRoleService.deleteRoleById(id));
 	}
 
 	/**

+ 8 - 0
pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRoleService.java

@@ -41,4 +41,12 @@ public interface SysRoleService extends IService<SysRole> {
 	 * @return
 	 */
 	List<SysRole> findRolesByUserId(Integer userId);
+
+	/**
+	 * 通过角色ID,删除角色
+	 *
+	 * @param id
+	 * @return
+	 */
+	Boolean deleteRoleById(Integer id);
 }

+ 21 - 6
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;
 
 /**
  * <p>
@@ -40,7 +44,9 @@ import java.util.List;
  * @since 2017-10-29
  */
 @Service
+@AllArgsConstructor
 public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
+	private final SysRoleMenuMapper sysRoleMenuMapper;
 
 	@Override
 	@Cacheable(value = "menu_details", key = "#roleId  + '_menu'")
@@ -51,13 +57,22 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
 	@Override
 	@CacheEvict(value = "menu_details", allEntries = true)
 	public Boolean deleteMenu(Integer id) {
-		// 删除当前节点
-		this.deleteById(id);
+		// 查询父节点为当前节点的节点
+		SysMenu conditon = new SysMenu();
+		conditon.setParentId(id);
+		List<Integer> 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

+ 25 - 0
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<SysRoleMapper, SysRole> implements SysRoleService {
+	private SysRoleMenuMapper sysRoleMenuMapper;
 
 	/**
 	 * 通过用户ID,查询角色信息
@@ -48,4 +56,21 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
 	public List<SysRole> 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);
+	}
 }