mirror of https://github.com/elunez/eladmin
[代码完善](v2.5): v2.5 beta 数据权限使升级,现可通过注解[@DataPermission]控制
DataPermission 类中有详细说明和使用示例 SecurityUtils 中加入获取当前用户的数据权限的方法 2.5 Beta 详情:https://www.ydyno.com/archives/1225.htmlpull/361/head^2
parent
fa26d67469
commit
921c462b12
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package me.zhengjie.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用于判断是否过滤数据权限
|
||||||
|
* 1、如果没有用到 @OneToOne 这种关联关系,只需要填写 fieldName [参考:DeptQueryCriteria.class]
|
||||||
|
* 2、如果用到了 @OneToOne ,fieldName 和 joinName 都需要填写,拿UserQueryCriteria.class举例:
|
||||||
|
* 应该是 @DataPermission(joinName = "dept", fieldName = "id")
|
||||||
|
* </p>
|
||||||
|
* @author Zheng Jie
|
||||||
|
* @website https://docs.auauz.net
|
||||||
|
* @date 2020-05-07
|
||||||
|
**/
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface DataPermission {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entity 中的字段名称
|
||||||
|
*/
|
||||||
|
String fieldName() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entity 中与部门关联的字段名称
|
||||||
|
*/
|
||||||
|
String joinName() default "";
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package me.zhengjie.modules.system.service.impl;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import me.zhengjie.modules.system.domain.Dept;
|
||||||
|
import me.zhengjie.modules.system.service.DataService;
|
||||||
|
import me.zhengjie.modules.system.service.DeptService;
|
||||||
|
import me.zhengjie.modules.system.service.RoleService;
|
||||||
|
import me.zhengjie.modules.system.service.dto.RoleSmallDto;
|
||||||
|
import me.zhengjie.modules.system.service.dto.UserDto;
|
||||||
|
import me.zhengjie.utils.enums.DataScopeEnum;
|
||||||
|
import org.springframework.cache.annotation.CacheConfig;
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Zheng Jie
|
||||||
|
* @website https://docs.auauz.net
|
||||||
|
* @description 数据权限服务实现
|
||||||
|
* @date 2020-05-07
|
||||||
|
**/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@CacheConfig(cacheNames = "role")
|
||||||
|
public class DataServiceImpl implements DataService {
|
||||||
|
|
||||||
|
private final RoleService roleService;
|
||||||
|
private final DeptService deptService;
|
||||||
|
|
||||||
|
@Cacheable
|
||||||
|
public List<Long> getDeptIds(UserDto user) {
|
||||||
|
// 用于存储部门id
|
||||||
|
Set<Long> deptIds = new HashSet<>();
|
||||||
|
// 查询用户角色
|
||||||
|
List<RoleSmallDto> roleSet = roleService.findByUsersId(user.getId());
|
||||||
|
// 获取对应的部门ID
|
||||||
|
for (RoleSmallDto role : roleSet) {
|
||||||
|
DataScopeEnum dataScopeEnum = DataScopeEnum.find(role.getDataScope());
|
||||||
|
switch (Objects.requireNonNull(dataScopeEnum)) {
|
||||||
|
case THIS_LEVEL:
|
||||||
|
deptIds.add(user.getDept().getId());
|
||||||
|
break;
|
||||||
|
case CUSTOMIZE:
|
||||||
|
deptIds.addAll(getCustomize(deptIds, role));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new ArrayList<>(deptIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取自定义的数据权限
|
||||||
|
* @param deptIds 部门ID
|
||||||
|
* @param role 角色
|
||||||
|
* @return 数据权限ID
|
||||||
|
*/
|
||||||
|
public Set<Long> getCustomize(Set<Long> deptIds, RoleSmallDto role){
|
||||||
|
Set<Dept> depts = deptService.findByRoleIds(role.getId());
|
||||||
|
for (Dept dept : depts) {
|
||||||
|
deptIds.add(dept.getId());
|
||||||
|
List<Dept> deptChildren = deptService.findByPid(dept.getId());
|
||||||
|
if (deptChildren != null && deptChildren.size() != 0) {
|
||||||
|
deptIds.addAll(getDeptChildren(deptChildren));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return deptIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归获取子级部门
|
||||||
|
* @param deptList 部门
|
||||||
|
* @return 数据权限
|
||||||
|
*/
|
||||||
|
@Cacheable
|
||||||
|
public List<Long> getDeptChildren(List<Dept> deptList) {
|
||||||
|
List<Long> list = new ArrayList<>();
|
||||||
|
deptList.forEach(dept -> {
|
||||||
|
if (dept!=null && dept.getEnabled()){
|
||||||
|
List<Dept> depts = deptService.findByPid(dept.getId());
|
||||||
|
if(deptList.size() != 0){
|
||||||
|
list.addAll(getDeptChildren(depts));
|
||||||
|
}
|
||||||
|
list.add(dept.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019-2020 Zheng Jie
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package me.zhengjie.utils.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 数据权限枚举
|
||||||
|
* </p>
|
||||||
|
* @author Zheng Jie
|
||||||
|
* @date 2020-05-07
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum DataScopeEnum {
|
||||||
|
|
||||||
|
ALL("全部", "全部的数据权限"),
|
||||||
|
|
||||||
|
THIS_LEVEL("本级", "自己部门的数据权限"),
|
||||||
|
|
||||||
|
CUSTOMIZE("自定义", "自定义的数据权限");
|
||||||
|
|
||||||
|
private final String value;
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
public static DataScopeEnum find(String val) {
|
||||||
|
for (DataScopeEnum dataScopeEnum : DataScopeEnum.values()) {
|
||||||
|
if (val.equals(dataScopeEnum.getValue())) {
|
||||||
|
return dataScopeEnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue