From 986bb47b0798d48e6087f3d5591350b249e755db Mon Sep 17 00:00:00 2001 From: aeizzz Date: Thu, 8 Dec 2022 15:52:06 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86=E5=92=8C?= =?UTF-8?q?app=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 完成角色管理 2. 完成菜单管理 3. 完成app用户登录,使用app的用户信息 --- .../pigx/app/api/dto/AppUserInfo.java | 55 +++++++ .../app/api/feign/RemoteAppUserService.java | 70 +++++++++ .../pig4cloud/pigx/app/api/vo/AppRoleVO.java | 41 ++++++ .../app/controller/AppMenuController.java | 126 +++++++++------- .../app/controller/AppRoleController.java | 15 +- .../app/controller/AppUserController.java | 31 ++++ .../pigx/app/mapper/AppMenuMapper.java | 3 + .../pigx/app/service/AppMenuService.java | 45 ++++++ .../pigx/app/service/AppRoleMenuService.java | 1 + .../pigx/app/service/AppRoleService.java | 7 + .../pigx/app/service/AppUserService.java | 2 + .../app/service/impl/AppMenuServiceImpl.java | 138 ++++++++++++++++++ .../service/impl/AppRoleMenuServiceImpl.java | 24 +++ .../app/service/impl/AppRoleServiceImpl.java | 16 ++ .../app/service/impl/AppUserServiceImpl.java | 34 +++++ .../main/resources/mapper/AppMenuMapper.xml | 19 +++ pigx-common/pigx-common-bom/pom.xml | 7 + .../core/constant/ServiceNameConstants.java | 5 + .../common/core/exception/ErrorCodes.java | 6 + .../resources/i18n/messages_zh_CN.properties | 1 + pigx-common/pigx-common-security/pom.xml | 5 + .../PigxAppUserDetailsServiceImpl.java | 83 +++++++++-- 22 files changed, 661 insertions(+), 73 deletions(-) create mode 100644 pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java create mode 100644 pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java create mode 100644 pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java diff --git a/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java new file mode 100644 index 000000000..07188837d --- /dev/null +++ b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/dto/AppUserInfo.java @@ -0,0 +1,55 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.app.api.dto; + +import com.pig4cloud.pigx.app.api.entity.AppUser; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author lengleng + * @date 2017/11/11 + */ +@Data +@ApiModel(value = "用户信息") +public class AppUserInfo implements Serializable { + + /** + * 用户基本信息 + */ + @ApiModelProperty(value = "用户基本信息") + private AppUser appUser; + + /** + * 权限标识集合 + */ + @ApiModelProperty(value = "权限标识集合") + private String[] permissions; + + /** + * 角色集合 + */ + @ApiModelProperty(value = "角色标识集合") + private Long[] roles; + +} diff --git a/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java new file mode 100644 index 000000000..4d4679e32 --- /dev/null +++ b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/feign/RemoteAppUserService.java @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + * + */ + +package com.pig4cloud.pigx.app.api.feign; + + +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; +import com.pig4cloud.pigx.common.core.util.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * @author lengleng + * @date 2018/6/22 + */ +@FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_SERVER) +public interface RemoteAppUserService { + + /** + * 通过用户名查询用户、角色信息 + * + * @param username 用户名 + * @param from 调用标志 + * @return R + */ + @GetMapping("/appuser/info/{username}") + R info(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + +// /** +// * 通过社交账号或手机号查询用户、角色信息 +// * @param inStr appid@code +// * @param from 调用标志 +// * @return +// */ +// @GetMapping("/social/info/{inStr}") +// R social(@PathVariable("inStr") String inStr, @RequestHeader(SecurityConstants.FROM) String from); +// + + /** + * 锁定用户 + * + * @param username 用户名 + * @param from 调用标识 + * @return + */ + @PutMapping("/user/lock/{username}") + R lockUser(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM) String from); + +} diff --git a/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java new file mode 100644 index 000000000..6cfb2390d --- /dev/null +++ b/pigx-app-server/pigx-app-server-api/src/main/java/com/pig4cloud/pigx/app/api/vo/AppRoleVO.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.app.api.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * @author lengleng + * @date 2020/2/10 + */ +@Data +@ApiModel(value = "前端角色展示对象") +public class AppRoleVO { + + /** + * 角色id + */ + private Long roleId; + + /** + * 菜单列表 + */ + private String menuIds; + +} diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMenuController.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMenuController.java index 378d3e693..32f73746e 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMenuController.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppMenuController.java @@ -19,10 +19,12 @@ package com.pig4cloud.pigx.app.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; import com.pig4cloud.pigx.app.api.entity.AppMenu; import com.pig4cloud.pigx.app.service.AppMenuService; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; import org.springframework.security.access.prepost.PreAuthorize; import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; import io.swagger.annotations.Api; @@ -30,7 +32,11 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * 菜单权限表 @@ -47,79 +53,87 @@ public class AppMenuController { private final AppMenuService appMenuService; /** - * 分页查询 - * @param page 分页对象 - * @param appMenu 菜单权限表 - * @return + * 返回当前用户的树形菜单集合 + * @param type 类型 + * @param parentId 父节点ID + * @return 当前用户的树形菜单 */ - @ApiOperation(value = "分页查询", notes = "分页查询") - @GetMapping("/page") - @PreAuthorize("@pms.hasPermission('app_appmenu_view')") - public R getAppMenuPage(Page page, AppMenu appMenu) { - return R.ok(appMenuService.page(page, Wrappers.query(appMenu))); + @GetMapping + public R getUserMenu(String type, Long parentId) { + + // 获取符合条件的菜单 + Set all = new HashSet<>(); + SecurityUtils.getRoles().forEach(roleId -> all.addAll(appMenuService.findMenuByRoleId(roleId))); + return R.ok(appMenuService.filterMenu(all, type, parentId)); } /** - * 通过id查询菜单权限表 - * @param menuId id - * @return R + * 返回全部树形菜单集合 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return 树形菜单 */ - @ApiOperation(value = "通过id查询", notes = "通过id查询") - @GetMapping("/{menuId}") - @PreAuthorize("@pms.hasPermission('app_appmenu_view')") - public R getById(@PathVariable("menuId") Long menuId) { - return R.ok(appMenuService.getById(menuId)); + @GetMapping(value = "/tree") + public R getTree(Long parentId, String menuName) { + return R.ok(appMenuService.treeMenu(parentId, menuName)); } /** - * 新增菜单权限表 - * @param appMenu 菜单权限表 - * @return R + * 返回角色的菜单集合授权 + * @param roleId 角色ID + * @return 属性集合 */ - @ApiOperation(value = "新增菜单权限表", notes = "新增菜单权限表") - @SysLog("新增菜单权限表") + @GetMapping("/tree/{roleId}") + public R getRoleTree(@PathVariable Long roleId) { + return R.ok( + appMenuService.findMenuByRoleId(roleId).stream().map(AppMenu::getMenuId).collect(Collectors.toList())); + } + + /** + * 通过ID查询菜单的详细信息 + * @param id 菜单ID + * @return 菜单详细信息 + */ + @GetMapping("/{id}") + public R getById(@PathVariable Long id) { + return R.ok(appMenuService.getById(id)); + } + + /** + * 新增菜单 + * @param appMenu 菜单信息 + * @return success/false + */ + @SysLog("新增菜单") @PostMapping @PreAuthorize("@pms.hasPermission('app_appmenu_add')") - public R save(@RequestBody AppMenu appMenu) { - return R.ok(appMenuService.save(appMenu)); + public R save(@Valid @RequestBody AppMenu appMenu) { + appMenuService.save(appMenu); + return R.ok(appMenu); } /** - * 修改菜单权限表 - * @param appMenu 菜单权限表 - * @return R + * 删除菜单 + * @param id 菜单ID + * @return success/false */ - @ApiOperation(value = "修改菜单权限表", notes = "修改菜单权限表") - @SysLog("修改菜单权限表") + @SysLog("删除菜单") + @DeleteMapping("/{id}") + @PreAuthorize("@pms.hasPermission('app_appmenu_del')") + public R removeById(@PathVariable Long id) { + return appMenuService.removeMenuById(id); + } + + /** + * 更新菜单 + * @param appMenu + * @return + */ + @SysLog("更新菜单") @PutMapping @PreAuthorize("@pms.hasPermission('app_appmenu_edit')") - public R updateById(@RequestBody AppMenu appMenu) { - return R.ok(appMenuService.updateById(appMenu)); - } - - /** - * 通过id删除菜单权限表 - * @param menuId id - * @return R - */ - @ApiOperation(value = "通过id删除菜单权限表", notes = "通过id删除菜单权限表") - @SysLog("通过id删除菜单权限表") - @DeleteMapping("/{menuId}") - @PreAuthorize("@pms.hasPermission('app_appmenu_del')") - public R removeById(@PathVariable Long menuId) { - return R.ok(appMenuService.removeById(menuId)); - } - - /** - * 导出excel 表格 - * @param appMenu 查询条件 - * @return excel 文件流 - */ - @ResponseExcel - @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('app_appmenu_export')") - public List export(AppMenu appMenu) { - return appMenuService.list(Wrappers.query(appMenu)); + public R update(@Valid @RequestBody AppMenu appMenu) { + return R.ok(appMenuService.updateMenuById(appMenu)); } } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java index 4ffc99d5d..d9a9b415d 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppRoleController.java @@ -19,6 +19,8 @@ package com.pig4cloud.pigx.app.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.vo.RoleVO; +import com.pig4cloud.pigx.app.api.vo.AppRoleVO; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; import com.pig4cloud.pigx.app.api.entity.AppRole; @@ -54,7 +56,6 @@ public class AppRoleController { */ @ApiOperation(value = "分页查询", notes = "分页查询") @GetMapping("/page") - @PreAuthorize("@pms.hasPermission('app_approle_view')") public R getAppRolePage(Page page, AppRole appRole) { return R.ok(appRoleService.page(page, Wrappers.query(appRole))); } @@ -120,6 +121,18 @@ public class AppRoleController { return R.ok(appRoleService.removeById(roleId)); } + + /** + * 更新角色菜单 + * @param roleVo 角色对象 + * @return success、false + */ + @SysLog("更新角色菜单") + @PutMapping("/menu") + @PreAuthorize("@pms.hasPermission('app_approle_perm')") + public R saveRoleMenus(@RequestBody AppRoleVO roleVo) { + return R.ok(appRoleService.updateRoleMenus(roleVo)); + } /** * 导出excel 表格 * @param appRole 查询条件 diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java index 3c37a259b..1b94dbff4 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/controller/AppUserController.java @@ -17,13 +17,19 @@ package com.pig4cloud.pigx.app.controller; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.app.api.dto.AppUserDTO; import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; import com.pig4cloud.pigx.app.api.entity.AppUser; import com.pig4cloud.pigx.app.service.AppUserService; +import com.pig4cloud.pigx.common.security.annotation.Inner; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; import org.springframework.security.access.prepost.PreAuthorize; import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; import io.swagger.annotations.Api; @@ -47,6 +53,31 @@ public class AppUserController { private final AppUserService appUserService; + + @Inner + @GetMapping("/info/{username}") + public R info(@PathVariable String username) { + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUsername, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.APP_USER_USERINFO_EMPTY, username)); + } + return R.ok(appUserService.findUserInfo(user)); + } + + /** + * 获取当前用户全部信息 + * @return 用户信息 + */ + @GetMapping(value = { "/info" }) + public R info() { + String username = SecurityUtils.getUser().getUsername(); + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUsername, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); + } + return R.ok(appUserService.findUserInfo(user)); + } + /** * 分页查询 * @param page 分页对象 diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppMenuMapper.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppMenuMapper.java index d015ef12c..428140125 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppMenuMapper.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/mapper/AppMenuMapper.java @@ -21,6 +21,8 @@ import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper; import com.pig4cloud.pigx.app.api.entity.AppMenu; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 菜单权限表 * @@ -30,4 +32,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface AppMenuMapper extends PigxBaseMapper { + List listMenusByRoleId(Long roleId); } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMenuService.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMenuService.java index e491e0b72..edcc09ff6 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMenuService.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppMenuService.java @@ -17,8 +17,14 @@ package com.pig4cloud.pigx.app.service; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; import com.pig4cloud.pigx.app.api.entity.AppMenu; +import com.pig4cloud.pigx.common.core.util.R; + +import java.util.List; +import java.util.Set; /** * 菜单权限表 @@ -28,4 +34,43 @@ import com.pig4cloud.pigx.app.api.entity.AppMenu; */ public interface AppMenuService extends IService { + + /** + * 通过角色编号查询URL 权限 + * @param roleId 角色ID + * @return 菜单列表 + */ + List findMenuByRoleId(Long roleId); + + /** + * 级联删除菜单 + * @param id 菜单ID + * @return 成功、失败 + */ + R removeMenuById(Long id); + + /** + * 更新菜单信息 + * @param appMenu 菜单信息 + * @return 成功、失败 + */ + Boolean updateMenuById(AppMenu appMenu); + + /** + * 构建树 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return + */ + List> treeMenu(Long parentId, String menuName); + + /** + * 查询菜单 + * @param voSet + * @param parentId + * @return + */ + List> filterMenu(Set voSet, String type, Long parentId); + + } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleMenuService.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleMenuService.java index 18d8590bf..f8c9fd7f2 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleMenuService.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleMenuService.java @@ -28,4 +28,5 @@ import com.pig4cloud.pigx.app.api.entity.AppRoleMenu; */ public interface AppRoleMenuService extends IService { + Boolean saveRoleMenus(Long roleId, String menuIds); } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java index 595723d4a..627858e94 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppRoleService.java @@ -19,6 +19,10 @@ package com.pig4cloud.pigx.app.service; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.vo.AppRoleVO; + +import java.util.Arrays; +import java.util.List; /** * app角色表 @@ -28,4 +32,7 @@ import com.pig4cloud.pigx.app.api.entity.AppRole; */ public interface AppRoleService extends IService { + Boolean updateRoleMenus(AppRoleVO roleVo); + + List findRolesByUserId(Long userId); } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java index 67f97ceeb..e7e6153da 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/AppUserService.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; import com.pig4cloud.pigx.app.api.entity.AppUser; import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; @@ -44,4 +45,5 @@ public interface AppUserService extends IService { Boolean deleteUserById(Long userId); + AppUserInfo findUserInfo(AppUser user); } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMenuServiceImpl.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMenuServiceImpl.java index e787cfa15..b5b4b648a 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMenuServiceImpl.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppMenuServiceImpl.java @@ -16,11 +16,41 @@ */ package com.pig4cloud.pigx.app.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; import com.pig4cloud.pigx.app.api.entity.AppMenu; +import com.pig4cloud.pigx.app.api.entity.AppRoleMenu; import com.pig4cloud.pigx.app.mapper.AppMenuMapper; +import com.pig4cloud.pigx.app.mapper.AppRoleMenuMapper; import com.pig4cloud.pigx.app.service.AppMenuService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.enums.MenuTypeEnum; +import com.pig4cloud.pigx.common.core.exception.ErrorCodes; +import com.pig4cloud.pigx.common.core.util.MsgUtils; +import com.pig4cloud.pigx.common.core.util.R; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.validation.constraints.NotNull; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * 菜单权限表 @@ -29,6 +59,114 @@ import org.springframework.stereotype.Service; * @date 2022-12-07 09:52:03 */ @Service +@AllArgsConstructor public class AppMenuServiceImpl extends ServiceImpl implements AppMenuService { + private final AppRoleMenuMapper appRoleMenuMapper; + + @Override + public List findMenuByRoleId(Long roleId) { + return baseMapper.listMenusByRoleId(roleId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = CacheConstants.MENU_DETAILS, allEntries = true) + public R removeMenuById(Long id) { + // 查询父节点为当前节点的节点 + List menuList = this.list(Wrappers.query().lambda().eq(AppMenu::getParentId, id)); + if (CollUtil.isNotEmpty(menuList)) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_MENU_DELETE_EXISTING)); + } + + appRoleMenuMapper.delete(Wrappers.query().lambda().eq(AppRoleMenu::getMenuId, id)); + // 删除当前菜单及其子菜单 + return R.ok(this.removeById(id)); + } + + @Override + public Boolean updateMenuById(AppMenu appMenu) { + return this.updateById(appMenu); + } + + /** + * 构建树查询 1. 不是懒加载情况,查询全部 2. 是懒加载,根据parentId 查询 2.1 父节点为空,则查询ID -1 + * @param parentId 父节点ID + * @param menuName 菜单名称 + * @return + */ + @Override + public List> treeMenu(Long parentId, String menuName) { + Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; + + List> collect = baseMapper + .selectList( + Wrappers.lambdaQuery().like(StrUtil.isNotBlank(menuName), AppMenu::getName, menuName) + .orderByAsc(AppMenu::getSortOrder)) + .stream().map(getNodeFunction()).collect(Collectors.toList()); + + // 模糊查询 不组装树结构 直接返回 表格方便编辑 + if (StrUtil.isNotBlank(menuName)) { + return collect.stream().map(node -> { + Tree tree = new Tree<>(); + tree.putAll(node.getExtra()); + BeanUtils.copyProperties(node, tree); + return tree; + }).collect(Collectors.toList()); + } + + return TreeUtil.build(collect, parent); + } + + /** + * 查询菜单 + * @param all 全部菜单 + * @param type 类型 + * @param parentId 父节点ID + * @return + */ + @Override + public List> filterMenu(Set all, String type, Long parentId) { + List> collect = all.stream().filter(menuTypePredicate(type)).map(getNodeFunction()) + .collect(Collectors.toList()); + Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; + return TreeUtil.build(collect, parent); + } + + @NotNull + private Function> getNodeFunction() { + return menu -> { + TreeNode node = new TreeNode<>(); + node.setId(menu.getMenuId()); + node.setName(menu.getName()); + node.setParentId(menu.getParentId()); + node.setWeight(menu.getSortOrder()); + // 扩展属性 + Map extra = new HashMap<>(); + extra.put("path", menu.getPath()); + extra.put("menuType", menu.getMenuType()); + extra.put("permission", menu.getPermission()); + extra.put("label", menu.getName()); + extra.put("sortOrder", menu.getSortOrder()); + extra.put("visible", menu.getVisible()); + node.setExtra(extra); + return node; + }; + } + + /** + * menu 类型断言 + * @param type 类型 + * @return Predicate + */ + private Predicate menuTypePredicate(String type) { + return vo -> { + if (MenuTypeEnum.TOP_MENU.getDescription().equals(type)) { + return MenuTypeEnum.TOP_MENU.getType().equals(vo.getMenuType()); + } + // 其他查询 左侧 + 顶部 + return !MenuTypeEnum.BUTTON.getType().equals(vo.getMenuType()); + }; + } + } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleMenuServiceImpl.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleMenuServiceImpl.java index e17370a43..e8f63be4b 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleMenuServiceImpl.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleMenuServiceImpl.java @@ -16,12 +16,20 @@ */ package com.pig4cloud.pigx.app.service.impl; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysRoleMenu; import com.pig4cloud.pigx.app.api.entity.AppRoleMenu; import com.pig4cloud.pigx.app.mapper.AppRoleMenuMapper; import com.pig4cloud.pigx.app.service.AppRoleMenuService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; import org.springframework.stereotype.Service; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + /** * 角色菜单表 * @@ -31,4 +39,20 @@ import org.springframework.stereotype.Service; @Service public class AppRoleMenuServiceImpl extends ServiceImpl implements AppRoleMenuService { + @Override + public Boolean saveRoleMenus(Long roleId, String menuIds) { + this.remove(Wrappers.query().lambda().eq(AppRoleMenu::getRoleId, roleId)); + + if (StrUtil.isBlank(menuIds)) { + return Boolean.TRUE; + } + List roleMenuList = Arrays.stream(menuIds.split(StrUtil.COMMA)).map(menuId -> { + AppRoleMenu roleMenu = new AppRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(Long.valueOf(menuId)); + return roleMenu; + }).collect(Collectors.toList()); + this.saveBatch(roleMenuList); + return Boolean.TRUE; + } } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java index ee855f4af..da91a32b1 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppRoleServiceImpl.java @@ -18,10 +18,15 @@ package com.pig4cloud.pigx.app.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pigx.app.api.entity.AppRole; +import com.pig4cloud.pigx.app.api.vo.AppRoleVO; import com.pig4cloud.pigx.app.mapper.AppRoleMapper; +import com.pig4cloud.pigx.app.service.AppRoleMenuService; import com.pig4cloud.pigx.app.service.AppRoleService; +import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + /** * app角色表 * @@ -29,6 +34,17 @@ import org.springframework.stereotype.Service; * @date 2022-12-07 09:52:03 */ @Service +@AllArgsConstructor public class AppRoleServiceImpl extends ServiceImpl implements AppRoleService { + private final AppRoleMenuService appRoleMenuService; + @Override + public Boolean updateRoleMenus(AppRoleVO roleVo) { + return appRoleMenuService.saveRoleMenus(roleVo.getRoleId(), roleVo.getMenuIds()); + } + + @Override + public List findRolesByUserId(Long userId) { + return baseMapper.listRolesByUserId(userId); + } } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java index b234549cd..9b5ee23fb 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java +++ b/pigx-app-server/pigx-app-server-biz/src/main/java/com/pig4cloud/pigx/app/service/impl/AppUserServiceImpl.java @@ -17,17 +17,24 @@ package com.pig4cloud.pigx.app.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysMenu; import com.pig4cloud.pigx.admin.api.entity.SysRole; import com.pig4cloud.pigx.admin.api.entity.SysUserRole; import com.pig4cloud.pigx.app.api.dto.AppUserDTO; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppMenu; +import com.pig4cloud.pigx.app.api.entity.AppRole; import com.pig4cloud.pigx.app.api.entity.AppUser; import com.pig4cloud.pigx.app.api.entity.AppUserRole; import com.pig4cloud.pigx.app.mapper.AppUserMapper; +import com.pig4cloud.pigx.app.service.AppMenuService; +import com.pig4cloud.pigx.app.service.AppRoleService; import com.pig4cloud.pigx.app.service.AppUserRoleService; import com.pig4cloud.pigx.app.service.AppUserService; import com.pig4cloud.pigx.app.api.vo.AppUserExcelVO; @@ -40,7 +47,9 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** @@ -57,6 +66,10 @@ public class AppUserServiceImpl extends ServiceImpl impl private final AppUserRoleService appUserRoleService; + private final AppRoleService appRoleService; + + private final AppMenuService appMenuService; + /** * 更新用户 * @param userDTO @@ -136,4 +149,25 @@ public class AppUserServiceImpl extends ServiceImpl impl return Boolean.TRUE; } + @Override + public AppUserInfo findUserInfo(AppUser user) { + AppUserInfo info = new AppUserInfo(); + info.setAppUser(user); + // 设置角色列表 (ID) + List roleIds = appRoleService.findRolesByUserId(user.getUserId()).stream().map(AppRole::getRoleId) + .collect(Collectors.toList()); + info.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + + // 设置权限列表(menu.permission) + Set permissions = new HashSet<>(); + roleIds.forEach(roleId -> { + List permissionList = appMenuService.findMenuByRoleId(roleId).stream() + .filter(menu -> StrUtil.isNotEmpty(menu.getPermission())).map(AppMenu::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); + info.setPermissions(ArrayUtil.toArray(permissions, String.class)); + return info; + } + } diff --git a/pigx-app-server/pigx-app-server-biz/src/main/resources/mapper/AppMenuMapper.xml b/pigx-app-server/pigx-app-server-biz/src/main/resources/mapper/AppMenuMapper.xml index 51381d063..d98b45b9e 100644 --- a/pigx-app-server/pigx-app-server-biz/src/main/resources/mapper/AppMenuMapper.xml +++ b/pigx-app-server/pigx-app-server-biz/src/main/resources/mapper/AppMenuMapper.xml @@ -39,4 +39,23 @@ + + diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml index f6b1bcc57..24eb7f8ea 100644 --- a/pigx-common/pigx-common-bom/pom.xml +++ b/pigx-common/pigx-common-bom/pom.xml @@ -152,6 +152,13 @@ pigx-upms-api ${pigx.version} + + + com.pig4cloud + pigx-app-server-api + ${pigx.version} + + org.ow2.asm asm diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java index ff006a16a..3ee3d48ce 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/ServiceNameConstants.java @@ -40,4 +40,9 @@ public interface ServiceNameConstants { */ String TX_MANAGER = "pigx-tx-manager"; + /** + * app服务 + */ + String APP_SERVER = "pigx-app-server-biz"; + } diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java index c6680897d..0a327101e 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/exception/ErrorCodes.java @@ -100,4 +100,10 @@ public interface ErrorCodes { */ String SYS_CONNECT_CP_USER_SYNC_ERROR = "sys.connect.cp.user.sync.error"; + + /** + * 用户信息为空 + */ + String APP_USER_USERINFO_EMPTY = "app.user.userInfo.empty"; + } diff --git a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties index d0d3430fc..6938c101b 100644 --- a/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/pigx-common/pigx-common-core/src/main/resources/i18n/messages_zh_CN.properties @@ -17,3 +17,4 @@ sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u8 sys.dict.update.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u4FEE\u6539 sys.connect.cp.dept.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u90E8\u95E8\u5217\u8868\u5931\u8D25 sys.connect.cp.user.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u7528\u6237\u5217\u8868\u5931\u8D25 +app.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A diff --git a/pigx-common/pigx-common-security/pom.xml b/pigx-common/pigx-common-security/pom.xml index 8b55c1f53..dae0d9695 100644 --- a/pigx-common/pigx-common-security/pom.xml +++ b/pigx-common/pigx-common-security/pom.xml @@ -68,5 +68,10 @@ com.pig4cloud pigx-upms-api + + + com.pig4cloud + pigx-app-server-api + diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxAppUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxAppUserDetailsServiceImpl.java index 5e916f155..d62659f8d 100755 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxAppUserDetailsServiceImpl.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxAppUserDetailsServiceImpl.java @@ -16,15 +16,32 @@ package com.pig4cloud.pigx.common.security.service; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ArrayUtil; import com.pig4cloud.pigx.admin.api.dto.UserInfo; -import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; +import com.pig4cloud.pigx.admin.api.entity.SysUser; +import com.pig4cloud.pigx.app.api.dto.AppUserInfo; +import com.pig4cloud.pigx.app.api.entity.AppUser; +import com.pig4cloud.pigx.app.api.feign.RemoteAppUserService; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.core.util.RetOps; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; /** * 用户详细信息 @@ -35,30 +52,64 @@ import org.springframework.security.core.userdetails.UserDetailsService; @RequiredArgsConstructor public class PigxAppUserDetailsServiceImpl implements PigxUserDetailsService { - private final UserDetailsService pigxDefaultUserDetailsServiceImpl; - - private final RemoteUserService remoteUserService; + private final CacheManager cacheManager; + private final RemoteAppUserService remoteAppUserService; /** - * 手机号登录 - * @param phone 手机号 + * 用户密码登录 + * @param username 用户密码登录 * @return */ @Override @SneakyThrows - public UserDetails loadUserByUsername(String phone) { - R result = remoteUserService.social(phone, SecurityConstants.FROM_IN); - return getUserDetails(result); + public UserDetails loadUserByUsername(String username) { + Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); + if (cache != null && cache.get(username) != null) { + return cache.get(username, PigxUser.class); + } + R info = remoteAppUserService.info(username, SecurityConstants.FROM_IN); + return this.getUserDetailsAppUser(info); + } + + + + UserDetails getUserDetailsAppUser(R result) { + // @formatter:off + return RetOps.of(result) + .getData() + .map(this::convertUserDetailsAppUser) + .orElseThrow(() -> new UsernameNotFoundException("用户不存在")); + // @formatter:on } /** - * check-token 使用 - * @param pigxUser user - * @return UserDetails + * UserInfo 转 UserDetails + * @param info + * @return 返回UserDetails对象 */ + UserDetails convertUserDetailsAppUser(AppUserInfo info) { + Set dbAuthsSet = new HashSet<>(); + if (ArrayUtil.isNotEmpty(info.getRoles())) { + // 获取角色 + Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); + // 获取资源 + dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); + + } + Collection authorities = AuthorityUtils + .createAuthorityList(dbAuthsSet.toArray(new String[0])); + AppUser user = info.getAppUser(); + // 构造security用户 + + return new PigxUser(user.getUserId(), user.getUsername(), null, user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), + SecurityConstants.BCRYPT + user.getPassword(), true, true, true, + !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); + } + @Override - public UserDetails loadUserByUser(PigxUser pigxUser) { - return pigxDefaultUserDetailsServiceImpl.loadUserByUsername(pigxUser.getUsername()); + public int getOrder() { + return 10; } /** @@ -69,7 +120,7 @@ public class PigxAppUserDetailsServiceImpl implements PigxUserDetailsService { */ @Override public boolean support(String clientId, String grantType) { - return SecurityConstants.GRANT_MOBILE.equals(grantType); + return clientId.equals("app"); } }