From 61dea507011159f2fd341db4fb6c95d548e5d22e Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Wed, 3 Mar 2021 14:44:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E6=96=B0=E5=89=8D?= =?UTF-8?q?=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/auth/api/AuthApi.java | 2 +- .../io/dataease/auth/api/DynamicMenuApi.java | 21 ++++++ .../dataease/auth/api/dto/DynamicMenuDto.java | 28 ++++++++ .../io/dataease/auth/api/dto/MenuMeta.java | 14 ++++ .../io/dataease/auth/config/ShiroConfig.java | 2 +- .../io/dataease/auth/server/AuthServer.java | 6 +- .../auth/server/DynamicMenuServer.java | 20 ++++++ .../auth/service/DynamicMenuService.java | 10 +++ .../service/impl/DynamicMenuServiceImpl.java | 69 +++++++++++++++++++ .../auth/service/impl/ShiroServiceImpl.java | 5 +- .../java/io/dataease/auth/util/JWTUtils.java | 2 + 11 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java create mode 100644 backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java create mode 100644 backend/src/main/java/io/dataease/auth/api/dto/MenuMeta.java create mode 100644 backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java create mode 100644 backend/src/main/java/io/dataease/auth/service/DynamicMenuService.java create mode 100644 backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java diff --git a/backend/src/main/java/io/dataease/auth/api/AuthApi.java b/backend/src/main/java/io/dataease/auth/api/AuthApi.java index b4bced4779..f27473767e 100644 --- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java +++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java @@ -14,7 +14,7 @@ public interface AuthApi { @PostMapping("/login") - void login(LoginDto loginDto); + Object login(LoginDto loginDto); @PostMapping("/userInfo") diff --git a/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java b/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java new file mode 100644 index 0000000000..cc127f46d5 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java @@ -0,0 +1,21 @@ +package io.dataease.auth.api; + + +import io.dataease.auth.api.dto.DynamicMenuDto; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import java.util.List; + +@Api(tags = "权限:动态菜单") +@RequestMapping("/api/dynamicMenu") +public interface DynamicMenuApi { + + /** + * 根据heads中获取的token 获取username 获取对应权限的菜单 + * @return + */ + @PostMapping("/menus") + List menus(); + +} diff --git a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java new file mode 100644 index 0000000000..5d0504f7d6 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java @@ -0,0 +1,28 @@ +package io.dataease.auth.api.dto; + +import lombok.Data; + + +import java.io.Serializable; +import java.util.List; + +@Data +public class DynamicMenuDto implements Serializable { + + private String path; + + private String component; + + private String redirect; + + private String name; + + private MenuMeta meta; + + private Long pid; + + private Long id; + + private List children; + +} diff --git a/backend/src/main/java/io/dataease/auth/api/dto/MenuMeta.java b/backend/src/main/java/io/dataease/auth/api/dto/MenuMeta.java new file mode 100644 index 0000000000..eefe8f2849 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/api/dto/MenuMeta.java @@ -0,0 +1,14 @@ +package io.dataease.auth.api.dto; + + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class MenuMeta implements Serializable { + + private String title; + + private String icon; +} diff --git a/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java b/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java index 07f6e16db5..11366f935c 100644 --- a/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java +++ b/backend/src/main/java/io/dataease/auth/config/ShiroConfig.java @@ -50,10 +50,10 @@ public class ShiroConfig { //filterMap.put("f2cRoles", new F2CRolesFilter()); filterMap.put("jwt", new JWTFilter()); filterMap.put("logout", new F2CLogoutFilter()); - factoryBean.setFilters(filterMap); factoryBean.setSecurityManager(securityManager); factoryBean.setUnauthorizedUrl("/permissionMiss"); factoryBean.setFilterChainDefinitionMap(shiroService.loadFilterChainDefinitionMap()); + factoryBean.setFilters(filterMap); return factoryBean; } diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java index 86359957f6..9d990ed342 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -14,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; - import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; @@ -28,7 +27,7 @@ public class AuthServer implements AuthApi { @Override - public void login(@RequestBody LoginDto loginDto) { + public Object login(@RequestBody LoginDto loginDto) { String username = loginDto.getUsername(); String password = loginDto.getPassword(); SysUserEntity user = authUserService.getUser(username); @@ -48,6 +47,9 @@ public class AuthServer implements AuthApi { result.put("token", JWTUtils.sign(username, realPwd));*/ String token = JWTUtils.sign(username, realPwd); ServletUtils.setToken(token); + Map result = new HashMap<>(); + result.put("token", token); + return result; } @Override diff --git a/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java b/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java new file mode 100644 index 0000000000..4ed2eb0270 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java @@ -0,0 +1,20 @@ +package io.dataease.auth.server; + +import io.dataease.auth.api.DynamicMenuApi; +import io.dataease.auth.api.dto.DynamicMenuDto; +import io.dataease.auth.service.DynamicMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +@RestController +public class DynamicMenuServer implements DynamicMenuApi { + @Autowired + private DynamicMenuService dynamicMenuService; + + @Override + public List menus() { + //ServletUtils.getToken() + return dynamicMenuService.load(null); + } +} diff --git a/backend/src/main/java/io/dataease/auth/service/DynamicMenuService.java b/backend/src/main/java/io/dataease/auth/service/DynamicMenuService.java new file mode 100644 index 0000000000..cdcd5ec308 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/service/DynamicMenuService.java @@ -0,0 +1,10 @@ +package io.dataease.auth.service; + +import io.dataease.auth.api.dto.DynamicMenuDto; + +import java.util.List; + +public interface DynamicMenuService { + + List load(String userId); +} diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java new file mode 100644 index 0000000000..aed036b9bb --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java @@ -0,0 +1,69 @@ +package io.dataease.auth.service.impl; + +import io.dataease.auth.api.dto.DynamicMenuDto; +import io.dataease.auth.api.dto.MenuMeta; +import io.dataease.auth.service.DynamicMenuService; +import io.dataease.base.domain.SysMenu; +import io.dataease.base.domain.SysMenuExample; +import io.dataease.base.mapper.SysMenuMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class DynamicMenuServiceImpl implements DynamicMenuService { + + @Autowired(required = false) + private SysMenuMapper sysMenuMapper; + + @Override + public List load(String userId) { + SysMenuExample sysMenuExample = new SysMenuExample(); + sysMenuExample.setOrderByClause(" menu_sort "); + List sysMenus = sysMenuMapper.selectByExample(sysMenuExample); + List dynamicMenuDtos = sysMenus.stream().map(this::convert).collect(Collectors.toList()); + List result = buildTree(dynamicMenuDtos); + return result; + } + + private DynamicMenuDto convert(SysMenu sysMenu){ + DynamicMenuDto dynamicMenuDto = new DynamicMenuDto(); + dynamicMenuDto.setId(sysMenu.getMenuId()); + dynamicMenuDto.setPid(sysMenu.getPid()); + dynamicMenuDto.setName(sysMenu.getName()); + dynamicMenuDto.setPath(sysMenu.getPath()); + dynamicMenuDto.setRedirect(null); + dynamicMenuDto.setComponent(sysMenu.getComponent()); + MenuMeta menuMeta = new MenuMeta(); + menuMeta.setTitle(sysMenu.getTitle()); + menuMeta.setIcon(sysMenu.getIcon()); + dynamicMenuDto.setMeta(menuMeta); + return dynamicMenuDto; + } + + private List buildTree(List lists){ + List rootNodes = new ArrayList<>(); + lists.forEach(node -> { + if (isParent(node.getPid())) { + rootNodes.add(node); + } + lists.forEach(tNode -> { + if (tNode.getPid() == node.getId()) { + if (node.getChildren() == null) { + node.setChildren(new ArrayList()); + node.setRedirect(node.getPath()+"/"+tNode.getPath());//第一个子节点的path + } + node.getChildren().add(tNode); + } + }); + }); + return rootNodes; + + } + + private Boolean isParent(Long pid){ + return null == pid || pid==0L; + } +} diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 55bd573940..fb271b508a 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -21,14 +21,17 @@ public class ShiroServiceImpl implements ShiroService { // 放行Swagger2页面,需要放行这些 filterChainDefinitionMap.put("/swagger-ui.html","anon"); + filterChainDefinitionMap.put("/swagger-ui/**","anon"); + filterChainDefinitionMap.put("/swagger/**","anon"); filterChainDefinitionMap.put("/webjars/**", "anon"); filterChainDefinitionMap.put("/swagger-resources/**","anon"); filterChainDefinitionMap.put("/v2/**","anon"); + filterChainDefinitionMap.put("/v3/**","anon"); filterChainDefinitionMap.put("/static/**", "anon"); // 登陆 - filterChainDefinitionMap.put("/api/auth/**", "anon"); + filterChainDefinitionMap.put("/api/auth/login", "anon"); // 退出 //filterChainDefinitionMap.put("/logout", "anon"); // 放行未授权接口,重定向使用 diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index 48bb10f1e2..53a277ac1f 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -40,6 +40,7 @@ public class JWTUtils { DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("username").asString(); } catch (JWTDecodeException e) { + e.printStackTrace(); return null; } } @@ -56,6 +57,7 @@ public class JWTUtils { DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("exp").asDate(); } catch (JWTDecodeException e) { + e.printStackTrace(); return null; } }