update: UserManager用户权限
This commit is contained in:
@@ -23,5 +23,18 @@ namespace Ewide.Core
|
|||||||
Task<List<SysRole>> GetUserRoleList(string userId);
|
Task<List<SysRole>> GetUserRoleList(string userId);
|
||||||
Task<List<SysRole>> GetUserRoleList();
|
Task<List<SysRole>> GetUserRoleList();
|
||||||
Task<List<string>> GetLoginPermissionList();
|
Task<List<string>> GetLoginPermissionList();
|
||||||
|
//获取用户额外授权的组织信息
|
||||||
|
Task<List<string>> GetUserExtraDataScopeList();
|
||||||
|
Task<List<string>> GetUserExtraDataScopeList(string userId);
|
||||||
|
//获取用户额外授权的区域信息
|
||||||
|
Task<List<string>> GetUserExtraAreaScopeList();
|
||||||
|
Task<List<string>> GetUserExtraAreaScopeList(string userId);
|
||||||
|
//获取角色额外授权的组织信息
|
||||||
|
Task<List<string>> GetRoleExtraDataScopeList(string roleId);
|
||||||
|
//获取角色额外授权的区域信息
|
||||||
|
Task<List<string>> GetRoleExtraAreaScopeList(string roleId);
|
||||||
|
//获取用户的授权范围
|
||||||
|
Task<List<string>> GetUserAllDataScopeList();
|
||||||
|
Task<List<string>> GetUserAllDataScopeList(string userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,10 @@ namespace Ewide.Core
|
|||||||
private readonly IRepository<SysOrg> _sysOrgRep;
|
private readonly IRepository<SysOrg> _sysOrgRep;
|
||||||
private readonly IRepository<SysRoleMenu> _sysRoleMenuRep;
|
private readonly IRepository<SysRoleMenu> _sysRoleMenuRep;
|
||||||
private readonly IRepository<SysMenu> _sysMenuRep;
|
private readonly IRepository<SysMenu> _sysMenuRep;
|
||||||
|
private readonly IRepository<SysUserDataScope> _sysUserDataScopeRep;
|
||||||
|
private readonly IRepository<SysUserArea> _sysUserAreaRep;
|
||||||
|
private readonly IRepository<SysRoleDataScope> _sysRoleDataRep;
|
||||||
|
private readonly IRepository<SysRoleArea> _sysRoleAreaRep;
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly ISysCacheService _sysCacheService;
|
private readonly ISysCacheService _sysCacheService;
|
||||||
|
|
||||||
@@ -51,12 +55,16 @@ namespace Ewide.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
public UserManager(
|
public UserManager(
|
||||||
|
IHttpContextAccessor httpContextAccessor,
|
||||||
|
ISysCacheService sysCacheService,
|
||||||
IRepository<SysUser> sysUserRep,
|
IRepository<SysUser> sysUserRep,
|
||||||
IRepository<SysRole> sysRoleRep,
|
IRepository<SysRole> sysRoleRep,
|
||||||
IRepository<SysUserRole> sysUserRoleRep,
|
IRepository<SysUserRole> sysUserRoleRep,
|
||||||
IRepository<SysEmp> sysEmpRep,
|
IRepository<SysEmp> sysEmpRep,
|
||||||
IRepository<SysOrg> sysOrgRep,
|
IRepository<SysOrg> sysOrgRep,
|
||||||
IHttpContextAccessor httpContextAccessor, ISysCacheService sysCacheService, IRepository<SysRoleMenu> sysRoleMenuRep, IRepository<SysMenu> sysMenuRep)
|
IRepository<SysRoleMenu> sysRoleMenuRep,
|
||||||
|
IRepository<SysMenu> sysMenuRep,
|
||||||
|
IRepository<SysUserDataScope> sysUserDataScopeRep, IRepository<SysUserArea> sysUserAreaRep, IRepository<SysRoleDataScope> sysRoleDataRep, IRepository<SysRoleArea> sysRoleAreaRep)
|
||||||
{
|
{
|
||||||
_sysUserRep = sysUserRep;
|
_sysUserRep = sysUserRep;
|
||||||
_sysRoleRep = sysRoleRep;
|
_sysRoleRep = sysRoleRep;
|
||||||
@@ -67,6 +75,10 @@ namespace Ewide.Core
|
|||||||
_sysCacheService = sysCacheService;
|
_sysCacheService = sysCacheService;
|
||||||
_sysRoleMenuRep = sysRoleMenuRep;
|
_sysRoleMenuRep = sysRoleMenuRep;
|
||||||
_sysMenuRep = sysMenuRep;
|
_sysMenuRep = sysMenuRep;
|
||||||
|
_sysUserDataScopeRep = sysUserDataScopeRep;
|
||||||
|
_sysUserAreaRep = sysUserAreaRep;
|
||||||
|
_sysRoleDataRep = sysRoleDataRep;
|
||||||
|
_sysRoleAreaRep = sysRoleAreaRep;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -191,5 +203,126 @@ namespace Ewide.Core
|
|||||||
}
|
}
|
||||||
return permissions;
|
return permissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<List<string>> GetUserExtraDataScopeList()
|
||||||
|
{
|
||||||
|
return GetUserExtraDataScopeList(UserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<string>> GetUserExtraDataScopeList(string userId)
|
||||||
|
{
|
||||||
|
return await _sysUserDataScopeRep.DetachedEntities
|
||||||
|
.Where(u => u.SysUserId == userId)
|
||||||
|
.Select(u => u.SysOrgId).ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<List<string>> GetUserExtraAreaScopeList()
|
||||||
|
{
|
||||||
|
return GetUserExtraAreaScopeList(UserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<string>> GetUserExtraAreaScopeList(string userId)
|
||||||
|
{
|
||||||
|
return await _sysUserAreaRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.AreaCode).ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<List<string>> GetRoleExtraDataScopeList(string roleId)
|
||||||
|
{
|
||||||
|
return _sysRoleDataRep.DetachedEntities.Where(u => u.SysRoleId == roleId).Select(u => u.SysOrgId).ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<List<string>> GetRoleExtraAreaScopeList(string roleId)
|
||||||
|
{
|
||||||
|
return _sysRoleAreaRep.DetachedEntities.Where(u => u.SysRoleId == roleId).Select(u => u.AreaCode).ToListAsync();
|
||||||
|
}
|
||||||
|
public Task<List<string>> GetUserAllDataScopeList()
|
||||||
|
{
|
||||||
|
return GetUserAllDataScopeList(UserId);
|
||||||
|
}
|
||||||
|
public async Task<List<string>> GetDataScopeListByDataScopeType(int dataScopeType, string orgId)
|
||||||
|
{
|
||||||
|
var orgIdList = new List<string>();
|
||||||
|
if (string.IsNullOrEmpty(orgId))
|
||||||
|
return orgIdList;
|
||||||
|
|
||||||
|
// 如果是范围类型是全部数据,则获取当前所有的组织架构Id
|
||||||
|
if (dataScopeType == (int)DataScopeType.ALL)
|
||||||
|
{
|
||||||
|
orgIdList = await _sysOrgRep.DetachedEntities.Where(u => u.Status == (int)CommonStatus.ENABLE).Select(u => u.Id).ToListAsync();
|
||||||
|
}
|
||||||
|
// 如果范围类型是本部门及以下部门,则查询本节点和子节点集合,包含本节点
|
||||||
|
else if (dataScopeType == (int)DataScopeType.DEPT_WITH_CHILD)
|
||||||
|
{
|
||||||
|
orgIdList = await _sysOrgRep.DetachedEntities
|
||||||
|
.Where(u => u.Pids.Contains(orgId))
|
||||||
|
.Select(u => u.Id).ToListAsync();
|
||||||
|
orgIdList.Add(orgId);
|
||||||
|
}
|
||||||
|
// 如果数据范围是本部门,不含子节点,则直接返回本部门
|
||||||
|
else if (dataScopeType == (int)DataScopeType.DEPT)
|
||||||
|
{
|
||||||
|
orgIdList.Add(orgId);
|
||||||
|
}
|
||||||
|
return orgIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<string>> GetUserAllDataScopeList(string userId)
|
||||||
|
{
|
||||||
|
var dataScopes = await _sysCacheService.GetDataScope(userId); // 先从缓存里面读取
|
||||||
|
if (dataScopes != null && dataScopes.Count > 0)
|
||||||
|
{
|
||||||
|
return dataScopes;
|
||||||
|
}
|
||||||
|
var orgId = await _sysEmpRep.DetachedEntities.Where(e => e.Id == userId).Select(u => u.OrgId).SingleAsync();
|
||||||
|
var orgAreaCode = await _sysOrgRep.Where(o => o.Id == orgId).Select(o => o.AreaCode).SingleAsync();
|
||||||
|
//获取用户额外授权数据
|
||||||
|
var userExtraDataScope = await(from org in _sysOrgRep.DetachedEntities
|
||||||
|
join ua in _sysUserAreaRep.DetachedEntities on org.AreaCode equals ua.AreaCode
|
||||||
|
where ua.SysUserId == userId
|
||||||
|
select org.Id).Concat(from ud in _sysUserDataScopeRep.DetachedEntities
|
||||||
|
where ud.SysUserId == userId
|
||||||
|
select ud.SysOrgId).ToListAsync();
|
||||||
|
//获取用户所有角色
|
||||||
|
//获取其他类型中最大的角色
|
||||||
|
var areaScopeTypes = new[] { DataScopeType.AREA, DataScopeType.AREA_WITH_CHILD }.Cast<int>();
|
||||||
|
var strongerDataScopeType = (int)DataScopeType.SELF;
|
||||||
|
var strongerAreaType = (int)DataScopeType.SELF;
|
||||||
|
|
||||||
|
//获取区域相关的角色类型中最大的区域角色
|
||||||
|
var customDataScopeRoleIdList = new List<string>();
|
||||||
|
var roleList = from role in _sysRoleRep.DetachedEntities
|
||||||
|
join ur in _sysUserRoleRep.DetachedEntities on role.Id equals ur.SysRoleId
|
||||||
|
where ur.SysUserId == userId
|
||||||
|
select role;
|
||||||
|
foreach (var role in await roleList.ToListAsync())
|
||||||
|
{
|
||||||
|
if (role.DataScopeType == (int)DataScopeType.DEFINE)
|
||||||
|
customDataScopeRoleIdList.Add(role.Id);
|
||||||
|
if ((role.DataScopeType == (int)DataScopeType.AREA || role.DataScopeType == (int)DataScopeType.AREA_WITH_CHILD) && strongerAreaType < role.DataScopeType)
|
||||||
|
{
|
||||||
|
strongerAreaType = role.DataScopeType;
|
||||||
|
}
|
||||||
|
else if (role.DataScopeType <= strongerDataScopeType)
|
||||||
|
strongerDataScopeType = role.DataScopeType;
|
||||||
|
}
|
||||||
|
// 自定义数据范围的角色对应的数据范围
|
||||||
|
var roleDataScopeIdList = await _sysRoleDataRep.DetachedEntities.Where(rd => customDataScopeRoleIdList.Contains(rd.SysRoleId)).Select(rd => orgId).ToListAsync();
|
||||||
|
|
||||||
|
// 角色中拥有最大数据范围类型的数据范围
|
||||||
|
var dataScopeIdList = await GetDataScopeListByDataScopeType(strongerDataScopeType, orgId);
|
||||||
|
//角色区域数据范围
|
||||||
|
var areaOrgIdList = new List<string>();
|
||||||
|
if (strongerAreaType == (int)DataScopeType.AREA_WITH_CHILD)
|
||||||
|
areaOrgIdList = await _sysOrgRep.DetachedEntities.Where(p => p.AreaCode.StartsWith(orgAreaCode)).Select(p => p.Id).ToListAsync();
|
||||||
|
if (strongerAreaType == (int)DataScopeType.AREA)
|
||||||
|
areaOrgIdList = await _sysOrgRep.DetachedEntities.Where(p => p.AreaCode == orgAreaCode).Select(p => p.Id).ToListAsync();
|
||||||
|
//获取
|
||||||
|
var scope = userExtraDataScope.Concat(roleDataScopeIdList).Concat(dataScopeIdList).Concat(areaOrgIdList).Distinct().ToList();
|
||||||
|
#if DEBUG
|
||||||
|
#else
|
||||||
|
await _sysCacheService.SetDataScope(userId, scope);
|
||||||
|
#endif
|
||||||
|
return scope;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user