refactor: 项目结构优化

This commit is contained in:
haoxr
2022-12-13 00:34:08 +08:00
parent 2b0f08ad31
commit d257c411c1
38 changed files with 171 additions and 115 deletions

View File

@@ -1,18 +0,0 @@
package com.youlai.system.common.constant;
/**
* Security常量
*
* @author haoxr
* @date 2022/10/22
*/
public interface SecurityConstants {
/**
* 授权角色的前缀
* <p>
* 区分角色与权限标识
*/
String ROLE_PREFIX = "ROLE_";
}

View File

@@ -17,7 +17,7 @@ public interface SystemConstants {
/** /**
* 系统默认密码 * 系统默认密码
*/ */
String DEFAULT_USER_PASSWORD = "123456"; String DEFAULT_PASSWORD = "123456";
/** /**
* 超级管理员角色编码 * 超级管理员角色编码

View File

@@ -22,7 +22,6 @@ import javax.servlet.ServletException;
import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import java.sql.SQLSyntaxErrorException; import java.sql.SQLSyntaxErrorException;
import java.util.concurrent.CompletionException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;

View File

@@ -25,7 +25,7 @@ public enum ResultCode implements IResultCode, Serializable {
USERNAME_OR_PASSWORD_ERROR("A0210", "用户名或密码错误"), USERNAME_OR_PASSWORD_ERROR("A0210", "用户名或密码错误"),
PASSWORD_ENTER_EXCEED_LIMIT("A0211", "用户输入密码次数超限"), PASSWORD_ENTER_EXCEED_LIMIT("A0211", "用户输入密码次数超限"),
CLIENT_AUTHENTICATION_FAILED("A0212", "客户端认证失败"), CLIENT_AUTHENTICATION_FAILED("A0212", "客户端认证失败"),
TOKEN_INVALID_OR_EXPIRED("A0230", "token无效或已过期"), TOKEN_INVALID("A0230", "token无效或已过期"),
TOKEN_ACCESS_FORBIDDEN("A0231", "token已被禁止访问"), TOKEN_ACCESS_FORBIDDEN("A0231", "token已被禁止访问"),
AUTHORIZED_ERROR("A0300", "访问权限异常"), AUTHORIZED_ERROR("A0300", "访问权限异常"),

View File

@@ -1,6 +1,6 @@
package com.youlai.system.config; package com.youlai.system.config;
import com.youlai.system.filter.JwtAuthenticationFilter; import com.youlai.system.security.filter.JwtAuthenticationFilter;
import com.youlai.system.security.exception.MyAccessDeniedHandler; import com.youlai.system.security.exception.MyAccessDeniedHandler;
import com.youlai.system.security.exception.MyAuthenticationEntryPoint; import com.youlai.system.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.security.jwt.JwtTokenManager; import com.youlai.system.security.jwt.JwtTokenManager;

View File

@@ -1,6 +1,6 @@
package com.youlai.system.controller; package com.youlai.system.controller;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.form.DeptForm; import com.youlai.system.pojo.form.DeptForm;
import com.youlai.system.pojo.query.DeptQuery; import com.youlai.system.pojo.query.DeptQuery;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.controller; package com.youlai.system.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.common.result.PageResult; import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.form.DictTypeForm; import com.youlai.system.pojo.form.DictTypeForm;

View File

@@ -1,6 +1,6 @@
package com.youlai.system.controller; package com.youlai.system.controller;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.pojo.query.MenuQuery;

View File

@@ -1,12 +1,11 @@
package com.youlai.system.controller; package com.youlai.system.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.common.result.PageResult; import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.entity.SysRole; import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.form.RoleForm; import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.form.RoleResourceForm;
import com.youlai.system.pojo.query.RolePageQuery; import com.youlai.system.pojo.query.RolePageQuery;
import com.youlai.system.pojo.vo.role.RolePageVO; import com.youlai.system.pojo.vo.role.RolePageVO;
import com.youlai.system.service.SysRoleService; import com.youlai.system.service.SysRoleService;

View File

@@ -63,7 +63,7 @@ public class SysUserController {
@ApiOperation(value = "新增用户") @ApiOperation(value = "新增用户")
@PostMapping @PostMapping
@PreAuthorize("hasAuthority('sys:user:add')") @PreAuthorize("@pms.hasPermission('sys:user:add')")
public Result saveUser( public Result saveUser(
@RequestBody @Valid UserForm userForm @RequestBody @Valid UserForm userForm
) { ) {
@@ -73,7 +73,7 @@ public class SysUserController {
@ApiOperation(value = "修改用户") @ApiOperation(value = "修改用户")
@PutMapping(value = "/{userId}") @PutMapping(value = "/{userId}")
@PreAuthorize("hasAuthority('sys:user:edit')") @PreAuthorize("@pms.hasPermission('sys:user:edit')")
public Result updateUser( public Result updateUser(
@ApiParam("用户ID") @PathVariable Long userId, @ApiParam("用户ID") @PathVariable Long userId,
@RequestBody @Validated UserForm userForm) { @RequestBody @Validated UserForm userForm) {
@@ -83,7 +83,7 @@ public class SysUserController {
@ApiOperation(value = "删除用户") @ApiOperation(value = "删除用户")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
@PreAuthorize("hasAuthority('sys:user:delete')") @PreAuthorize("@pms.hasPermission('sys:user:delete')")
public Result deleteUsers( public Result deleteUsers(
@ApiParam("用户ID多个以英文逗号(,)分割") @PathVariable String ids @ApiParam("用户ID多个以英文逗号(,)分割") @PathVariable String ids
) { ) {
@@ -152,6 +152,7 @@ public class SysUserController {
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
List<UserExportVO> exportUserList = userService.listExportUsers(queryParams); List<UserExportVO> exportUserList = userService.listExportUsers(queryParams);
EasyExcel.write(response.getOutputStream(), UserExportVO.class).sheet("用户列表").doWrite(exportUserList); EasyExcel.write(response.getOutputStream(), UserExportVO.class).sheet("用户列表")
.doWrite(exportUserList);
} }
} }

View File

@@ -15,5 +15,4 @@ public interface MenuConverter {
MenuVO entity2VO(SysMenu entity); MenuVO entity2VO(SysMenu entity);
} }

View File

@@ -1,7 +1,7 @@
package com.youlai.system.converter; package com.youlai.system.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.pojo.entity.SysRole; import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.form.RoleForm; import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.vo.role.RolePageVO; import com.youlai.system.pojo.vo.role.RolePageVO;

View File

@@ -22,7 +22,7 @@ import org.mapstruct.Mappings;
public interface UserConverter { public interface UserConverter {
@Mappings({ @Mappings({
@Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(po.getGender(), com.youlai.system.common.enums.GenderEnum.class))") @Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(po.getGender(), com.youlai.system.enums.GenderEnum.class))")
}) })
UserVO po2Vo(UserBO po); UserVO po2Vo(UserBO po);

View File

@@ -1,4 +1,4 @@
package com.youlai.system.common.enums; package com.youlai.system.enums;
import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.base.IBaseEnum;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.common.enums; package com.youlai.system.enums;
import com.baomidou.mybatisplus.annotation.EnumValue; import com.baomidou.mybatisplus.annotation.EnumValue;
import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.base.IBaseEnum;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.common.enums; package com.youlai.system.enums;
import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.base.IBaseEnum;
import lombok.Getter; import lombok.Getter;

View File

@@ -4,8 +4,17 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysRole; import com.youlai.system.pojo.entity.SysRole;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.Set;
@Mapper @Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> { public interface SysRoleMapper extends BaseMapper<SysRole> {
/**
* 获取最大范围的数据权限
*
* @param roles
* @return
*/
Integer getMaximumDataScope(Set<String> roles);
} }

View File

@@ -1,4 +1,4 @@
package com.youlai.system.common.model; package com.youlai.system.pojo;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;

View File

@@ -2,7 +2,7 @@ package com.youlai.system.pojo.bo;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.enums.MenuTypeEnum;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;

View File

@@ -1,14 +1,11 @@
package com.youlai.system.pojo.entity; package com.youlai.system.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import com.youlai.system.common.base.BaseEntity; import com.youlai.system.common.base.BaseEntity;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.enums.MenuTypeEnum;
import lombok.Data; import lombok.Data;
/** /**

View File

@@ -58,4 +58,9 @@ public class SysRole implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 数据权限
*/
private Integer dataScope;
} }

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.vo.menu; package com.youlai.system.pojo.vo.menu;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.enums.MenuTypeEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;

View File

@@ -21,6 +21,6 @@ import java.io.IOException;
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override @Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
ResponseUtils.writeErrMsg(response, ResultCode.TOKEN_INVALID_OR_EXPIRED); ResponseUtils.writeErrMsg(response, ResultCode.TOKEN_INVALID);
} }
} }

View File

@@ -15,6 +15,7 @@ import java.util.stream.Collectors;
/** /**
* Spring Security * Spring Security
*
* @author haoxr * @author haoxr
*/ */
@Data @Data
@@ -30,10 +31,12 @@ public class SysUserDetails implements UserDetails {
private Collection<SimpleGrantedAuthority> authorities; private Collection<SimpleGrantedAuthority> authorities;
private String authorityStr;
private Set<String> perms; private Set<String> perms;
private Long deptId;
private Integer dataScope;
public SysUserDetails() { public SysUserDetails() {
} }
@@ -53,7 +56,9 @@ public class SysUserDetails implements UserDetails {
this.username = user.getUsername(); this.username = user.getUsername();
this.password = user.getPassword(); this.password = user.getPassword();
this.enabled = ObjectUtil.equal(user.getStatus(), 1); this.enabled = ObjectUtil.equal(user.getStatus(), 1);
this.perms=user.getPerms(); this.perms = user.getPerms();
this.deptId = user.getDeptId();
this.dataScope = user.getDataScope();
} }
public Long getUserId() { public Long getUserId() {

View File

@@ -9,11 +9,13 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* 用户认证信息实现类
*
* @author haoxr * @author haoxr
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class SysUserDetailsServiceImpl implements UserDetailsService { public class SysUserDetailsService implements UserDetailsService {
private final SysUserService sysUserService; private final SysUserService sysUserService;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.service; package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.pojo.entity.SysDept; import com.youlai.system.pojo.entity.SysDept;
import com.youlai.system.pojo.form.DeptForm; import com.youlai.system.pojo.form.DeptForm;
import com.youlai.system.pojo.query.DeptQuery; import com.youlai.system.pojo.query.DeptQuery;

View File

@@ -2,7 +2,7 @@ package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.pojo.entity.SysDictType; import com.youlai.system.pojo.entity.SysDictType;
import com.youlai.system.pojo.form.DictTypeForm; import com.youlai.system.pojo.form.DictTypeForm;
import com.youlai.system.pojo.query.DictTypePageQuery; import com.youlai.system.pojo.query.DictTypePageQuery;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.service; package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.query.MenuQuery; import com.youlai.system.pojo.query.MenuQuery;
import com.youlai.system.pojo.vo.menu.MenuVO; import com.youlai.system.pojo.vo.menu.MenuVO;

View File

@@ -3,14 +3,14 @@ package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.pojo.entity.SysRole; import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.form.RoleForm; import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.form.RoleResourceForm;
import com.youlai.system.pojo.query.RolePageQuery; import com.youlai.system.pojo.query.RolePageQuery;
import com.youlai.system.pojo.vo.role.RolePageVO; import com.youlai.system.pojo.vo.role.RolePageVO;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 角色业务接口层 * 角色业务接口层
@@ -78,4 +78,12 @@ public interface SysRoleService extends IService<SysRole> {
* @return * @return
*/ */
boolean updateRoleMenus(Long roleId, List<Long> menuIds); boolean updateRoleMenus(Long roleId, List<Long> menuIds);
/**
* 获取最大范围的数据权限
*
* @param roles
* @return
*/
Integer getMaximumDataScope(Set<String> roles);
} }

View File

@@ -7,8 +7,8 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.StatusEnum; import com.youlai.system.enums.StatusEnum;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.converter.DeptConverter; import com.youlai.system.converter.DeptConverter;
import com.youlai.system.mapper.SysDeptMapper; import com.youlai.system.mapper.SysDeptMapper;
import com.youlai.system.pojo.entity.SysDept; import com.youlai.system.pojo.entity.SysDept;

View File

@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.converter.DictTypeConverter; import com.youlai.system.converter.DictTypeConverter;
import com.youlai.system.mapper.SysDictTypeMapper; import com.youlai.system.mapper.SysDictTypeMapper;
import com.youlai.system.pojo.entity.SysDictItem; import com.youlai.system.pojo.entity.SysDictItem;

View File

@@ -7,9 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.enums.MenuTypeEnum;
import com.youlai.system.common.enums.StatusEnum; import com.youlai.system.enums.StatusEnum;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.converter.MenuConverter; import com.youlai.system.converter.MenuConverter;
import com.youlai.system.mapper.SysMenuMapper; import com.youlai.system.mapper.SysMenuMapper;
import com.youlai.system.pojo.entity.SysMenu; import com.youlai.system.pojo.entity.SysMenu;

View File

@@ -8,14 +8,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.model.Option; import com.youlai.system.pojo.Option;
import com.youlai.system.converter.RoleConverter; import com.youlai.system.converter.RoleConverter;
import com.youlai.system.mapper.SysRoleMapper; import com.youlai.system.mapper.SysRoleMapper;
import com.youlai.system.pojo.entity.SysRole; import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.entity.SysRoleMenu; import com.youlai.system.pojo.entity.SysRoleMenu;
import com.youlai.system.pojo.entity.SysUserRole; import com.youlai.system.pojo.entity.SysUserRole;
import com.youlai.system.pojo.form.RoleForm; import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.form.RoleResourceForm;
import com.youlai.system.pojo.query.RolePageQuery; import com.youlai.system.pojo.query.RolePageQuery;
import com.youlai.system.pojo.vo.role.RolePageVO; import com.youlai.system.pojo.vo.role.RolePageVO;
import com.youlai.system.service.SysRoleMenuService; import com.youlai.system.service.SysRoleMenuService;
@@ -27,10 +26,7 @@ import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -193,4 +189,16 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
return true; return true;
} }
/**
* 获取最大范围的数据权限
*
* @param roles
* @return
*/
@Override
public Integer getMaximumDataScope(Set<String> roles) {
Integer dataScope = this.baseMapper.getMaximumDataScope(roles);
return dataScope;
}
} }

View File

@@ -15,8 +15,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.base.IBaseEnum;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.GenderEnum;
import com.youlai.system.converter.UserConverter; import com.youlai.system.converter.UserConverter;
import com.youlai.system.enums.GenderEnum;
import com.youlai.system.listener.UserImportListener; import com.youlai.system.listener.UserImportListener;
import com.youlai.system.mapper.SysUserMapper; import com.youlai.system.mapper.SysUserMapper;
import com.youlai.system.pojo.bo.UserBO; import com.youlai.system.pojo.bo.UserBO;
@@ -31,15 +31,16 @@ import com.youlai.system.pojo.vo.user.UserExportVO;
import com.youlai.system.pojo.vo.user.UserLoginVO; import com.youlai.system.pojo.vo.user.UserLoginVO;
import com.youlai.system.pojo.vo.user.UserVO; import com.youlai.system.pojo.vo.user.UserVO;
import com.youlai.system.service.SysMenuService; import com.youlai.system.service.SysMenuService;
import com.youlai.system.service.SysRoleService;
import com.youlai.system.service.SysUserRoleService; import com.youlai.system.service.SysUserRoleService;
import com.youlai.system.service.SysUserService; import com.youlai.system.service.SysUserService;
import com.youlai.system.util.SecurityUtils; import com.youlai.system.util.SecurityUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
@@ -62,11 +63,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
private final SysUserRoleService userRoleService; private final SysUserRoleService userRoleService;
private final UserImportListener userImportListener; private final UserImportListener userImportListener;
@Resource private final UserConverter userConverter;
private UserConverter userConverter;
private final SysMenuService menuService; private final SysMenuService menuService;
private final SysRoleService roleService;
private final RedisTemplate redisTemplate;
/** /**
* 获取用户分页列表 * 获取用户分页列表
* *
@@ -122,7 +126,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
SysUser entity = userConverter.form2Entity(userForm); SysUser entity = userConverter.form2Entity(userForm);
// 设置默认加密密码 // 设置默认加密密码
String defaultEncryptPwd = passwordEncoder.encode(SystemConstants.DEFAULT_USER_PASSWORD); String defaultEncryptPwd = passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD);
entity.setPassword(defaultEncryptPwd); entity.setPassword(defaultEncryptPwd);
// 新增用户 // 新增用户
@@ -211,12 +215,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
@Override @Override
public UserAuthInfo getUserAuthInfo(String username) { public UserAuthInfo getUserAuthInfo(String username) {
UserAuthInfo userAuthInfo = this.baseMapper.getUserAuthInfo(username); UserAuthInfo userAuthInfo = this.baseMapper.getUserAuthInfo(username);
if(userAuthInfo!=null){ if (userAuthInfo != null) {
Set<String> roles = userAuthInfo.getRoles(); Set<String> roles = userAuthInfo.getRoles();
if(CollectionUtil.isNotEmpty(roles)){ if (CollectionUtil.isNotEmpty(roles)) {
Set<String> perms= menuService.listRolePerms(roles); Set<String> perms = menuService.listRolePerms(roles);
userAuthInfo.setPerms(perms); userAuthInfo.setPerms(perms);
} }
// 获取最大范围的数据权限
Integer dataScope = roleService.getMaximumDataScope(roles);
userAuthInfo.setDataScope(dataScope);
} }
return userAuthInfo; return userAuthInfo;
} }
@@ -281,7 +289,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
user.setEmail(userItem.getEmail()); user.setEmail(userItem.getEmail());
user.setDeptId(deptId); user.setDeptId(deptId);
// 默认密码 // 默认密码
user.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_USER_PASSWORD)); user.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD));
// 性别转换 // 性别转换
Integer gender = (Integer) IBaseEnum.getValueByLabel(userItem.getGender(), GenderEnum.class); Integer gender = (Integer) IBaseEnum.getValueByLabel(userItem.getGender(), GenderEnum.class);
user.setGender(gender); user.setGender(gender);
@@ -349,7 +357,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
userLoginVO.setRoles(roles); userLoginVO.setRoles(roles);
// 用户权限集合 // 用户权限集合
Set<String> perms = SecurityUtils.getPerms(); Set<String> perms = (Set<String>)redisTemplate.opsForValue().get("USER_PERMS:" + user.getId());
userLoginVO.setPerms(perms); userLoginVO.setPerms(perms);
return userLoginVO; return userLoginVO;

View File

@@ -27,7 +27,7 @@ public class ResponseUtils {
public static void writeErrMsg(HttpServletResponse response, ResultCode resultCode) throws IOException { public static void writeErrMsg(HttpServletResponse response, ResultCode resultCode) throws IOException {
switch (resultCode) { switch (resultCode) {
case ACCESS_UNAUTHORIZED: case ACCESS_UNAUTHORIZED:
case TOKEN_INVALID_OR_EXPIRED: case TOKEN_INVALID:
response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setStatus(HttpStatus.UNAUTHORIZED.value());
break; break;
case TOKEN_ACCESS_FORBIDDEN: case TOKEN_ACCESS_FORBIDDEN:

View File

@@ -1,15 +1,14 @@
package com.youlai.system.util; package com.youlai.system.util;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.security.userdetails.SysUserDetails; import com.youlai.system.security.userdetails.SysUserDetails;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.PatternMatchUtils; import org.springframework.util.PatternMatchUtils;
import org.springframework.util.StringUtils;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -34,6 +33,37 @@ public class SecurityUtils {
return null; return null;
} }
/**
* 获取用户ID
*
* @return
*/
public static Long getUserId() {
Long userId = Convert.toLong(getUser().getUserId());
return userId;
}
/**
* 获取部门ID
*
* @return
*/
public static Long getDeptId() {
Long userId = Convert.toLong(getUser().getDeptId());
return userId;
}
/**
* 获取数据权限范围
*
* @return DataScope
*/
public static Integer getDataScope() {
Integer dataScope = Convert.toInt(getUser().getDataScope());
return dataScope;
}
/** /**
* 获取用户角色集合 * 获取用户角色集合
* *
@@ -41,16 +71,16 @@ public class SecurityUtils {
*/ */
public static Set<String> getRoles() { public static Set<String> getRoles() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); if (authentication != null) {
Set<String> roles = null; Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
if (CollectionUtil.isNotEmpty(authorities)) { if (CollectionUtil.isNotEmpty(authorities)) {
roles = authorities.stream().filter(item -> item.getAuthority().startsWith("ROLE_")) Set<String> roles = authorities.stream().filter(item -> item.getAuthority().startsWith("ROLE_"))
.map(item -> StrUtil.removePrefix(item.getAuthority(), "ROLE_")) .map(item -> StrUtil.removePrefix(item.getAuthority(), "ROLE_"))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} else { return roles;
roles = Collections.EMPTY_SET; }
} }
return roles; return Collections.EMPTY_SET;
} }
/** /**
@@ -60,16 +90,16 @@ public class SecurityUtils {
*/ */
public static Set<String> getPerms() { public static Set<String> getPerms() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); if (authentication != null) {
Set<String> perms = null; Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
if (CollectionUtil.isNotEmpty(authorities)) { if (CollectionUtil.isNotEmpty(authorities)) {
perms = authorities.stream().filter(item -> !item.getAuthority().startsWith("ROLE_")) Set<String> perms = authorities.stream().filter(item -> !item.getAuthority().startsWith("ROLE_"))
.map(item -> item.getAuthority()) .map(item -> item.getAuthority())
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} else { return perms;
perms = Collections.EMPTY_SET; }
} }
return perms; return Collections.EMPTY_SET;
} }
/** /**

View File

@@ -40,7 +40,7 @@
LEFT JOIN sys_role_menu t2 ON t1.id = t2.menu_id LEFT JOIN sys_role_menu t2 ON t1.id = t2.menu_id
LEFT JOIN sys_role t3 ON t2.role_id = t3.id LEFT JOIN sys_role t3 ON t2.role_id = t3.id
WHERE WHERE
t1.type != '${@com.youlai.system.common.enums.MenuTypeEnum@BUTTON.getValue()}' t1.type != '${@com.youlai.system.enums.MenuTypeEnum@BUTTON.getValue()}'
ORDER BY t1.sort asc ORDER BY t1.sort asc
</select> </select>
@@ -53,7 +53,7 @@
INNER JOIN sys_role_menu t2 INNER JOIN sys_role_menu t2
INNER JOIN sys_role t3 INNER JOIN sys_role t3
WHERE WHERE
t1.type = '${@com.youlai.system.common.enums.MenuTypeEnum@BUTTON.getValue()}' t1.type = '${@com.youlai.system.enums.MenuTypeEnum@BUTTON.getValue()}'
AND t1.perm IS NOT NULL AND t1.perm IS NOT NULL
<choose> <choose>
<when test="roles!=null and roles.size()>0"> <when test="roles!=null and roles.size()>0">

View File

@@ -4,20 +4,24 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.youlai.system.mapper.SysRoleMapper"> <mapper namespace="com.youlai.system.mapper.SysRoleMapper">
<resultMap id="BaseResultMap" type="com.youlai.system.pojo.entity.SysRole"> <!-- 获取最大范围的数据权限 -->
<id property="id" column="id" jdbcType="BIGINT"/> <select id="getMaximumDataScope" resultType="java.lang.Integer">
<result property="name" column="name" jdbcType="VARCHAR"/> SELECT
<result property="code" column="code" jdbcType="VARCHAR"/> min(data_scope)
<result property="sort" column="sort" jdbcType="INTEGER"/> FROM
<result property="status" column="status" jdbcType="TINYINT"/> sys_role
<result property="deleted" column="deleted" jdbcType="TINYINT"/> <where>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <choose>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> <when test="roles!=null and roles.size>0">
</resultMap> AND code IN
<foreach collection="roles" item="role" separator="," open="(" close=")">
<sql id="Base_Column_List"> #{role}
id,name,code, </foreach>
sort,status,deleted, </when>
create_time,update_time <otherwise>
</sql> id = -1
</otherwise>
</choose>
</where>
</select>
</mapper> </mapper>