392 lines
14 KiB
C#
392 lines
14 KiB
C#
/*******************************************************************************
|
||
* Copyright © 2020 HT.Cloud.Framework 版权所有
|
||
* Author: HT.Cloud
|
||
* Description: WaterCloud快速开发平台
|
||
* Website:
|
||
*********************************************************************************/
|
||
|
||
using SqlSugar;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using HT.Cloud.Code;
|
||
using HT.Cloud.Domain.SystemManage;
|
||
using HT.Cloud.Domain.SystemOrganize;
|
||
using HT.Cloud.Domain.ViewModel;
|
||
using HT.Cloud.Service.SystemManage;
|
||
|
||
namespace HT.Cloud.Service.SystemOrganize
|
||
{
|
||
public class RoleAuthorizeService : BaseService<RoleAuthorizeEntity>, IDenpendency
|
||
{
|
||
public ModuleService moduleApp { get; set; }
|
||
public ModuleButtonService moduleButtonApp { get; set; }
|
||
public ModuleFieldsService moduleFieldsApp { get; set; }
|
||
public UserService userApp { get; set; }
|
||
public RoleService roleApp { get; set; }
|
||
|
||
/// <summary>
|
||
/// 缓存操作类
|
||
/// </summary>
|
||
private string cacheKey = GlobalContext.SystemConfig.ProjectPrefix + "_authorizeurldata_";// +权限
|
||
|
||
public RoleAuthorizeService(ISqlSugarClient context) : base(context)
|
||
{
|
||
}
|
||
|
||
public async Task<List<RoleAuthorizeEntity>> GetList(string ObjectId)
|
||
{
|
||
var query = repository.IQueryable();
|
||
query = query.Where(a => a.F_ObjectId == ObjectId);
|
||
return await query.ToListAsync();
|
||
}
|
||
|
||
public async Task<List<ModuleEntity>> GetMenuList(string roleId)
|
||
{
|
||
var data = new List<ModuleEntity>();
|
||
if (currentuser.IsAdmin)
|
||
{
|
||
data = await moduleApp.GetList();
|
||
data = data.Where(a => a.F_IsMenu == true && a.F_EnabledMark == true).ToList();
|
||
}
|
||
else
|
||
{
|
||
var rolelist = roleId.Split(',');
|
||
var moduledata = await moduleApp.GetList();
|
||
moduledata = moduledata.Where(a => a.F_IsMenu == true && a.F_EnabledMark == true).ToList();
|
||
var role = repository.Db.Queryable<RoleEntity>().Where(a => rolelist.Contains(a.F_Id) && a.F_EnabledMark == true).ToList();
|
||
if (role.Count == 0)
|
||
{
|
||
return data;
|
||
}
|
||
var authorizedata = repository.IQueryable().Where(a => rolelist.Contains(a.F_ObjectId) && a.F_ItemType == 1).Distinct().ToList();
|
||
foreach (var item in authorizedata)
|
||
{
|
||
ModuleEntity moduleEntity = moduledata.Find(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false);
|
||
if (moduleEntity != null && data.Find(a => a.F_Id == moduleEntity.F_Id) == null)
|
||
{
|
||
data.Add(moduleEntity);
|
||
}
|
||
}
|
||
data.AddRange(moduledata.Where(a => a.F_IsPublic == true));
|
||
}
|
||
return data.OrderBy(a => a.F_SortCode).ToList();
|
||
}
|
||
|
||
public async Task<List<ModuleButtonEntity>> GetButtonList(string roleId)
|
||
{
|
||
var data = new List<ModuleButtonEntity>();
|
||
if (currentuser.IsAdmin)
|
||
{
|
||
data = await moduleButtonApp.GetListNew();
|
||
}
|
||
else
|
||
{
|
||
var buttondata = await moduleButtonApp.GetListNew();
|
||
var role = await roleApp.GetForm(roleId);
|
||
if (role == null || role.F_EnabledMark == false)
|
||
{
|
||
return data;
|
||
}
|
||
var authorizedata = repository.IQueryable().Where(a => a.F_ObjectId == roleId && a.F_ItemType == 2).ToList();
|
||
foreach (var item in authorizedata)
|
||
{
|
||
ModuleButtonEntity moduleButtonEntity = buttondata.Find(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false);
|
||
if (moduleButtonEntity != null)
|
||
{
|
||
data.Add(moduleButtonEntity);
|
||
}
|
||
}
|
||
data.AddRange(buttondata.Where(a => a.F_IsPublic == true));
|
||
}
|
||
return data.OrderBy(a => a.F_SortCode).ToList();
|
||
}
|
||
|
||
public async Task<List<ModuleFieldsEntity>> GetFieldsList(string roleId)
|
||
{
|
||
var data = new List<ModuleFieldsEntity>();
|
||
if (currentuser.IsAdmin)
|
||
{
|
||
data = await moduleFieldsApp.GetListNew();
|
||
}
|
||
else
|
||
{
|
||
var fieldsdata = await moduleFieldsApp.GetListNew();
|
||
var role = await roleApp.GetForm(roleId);
|
||
if (role == null || role.F_EnabledMark == false)
|
||
{
|
||
return data;
|
||
}
|
||
var authorizedata = repository.IQueryable().Where(a => a.F_ObjectId == roleId && a.F_ItemType == 3).ToList();
|
||
foreach (var item in authorizedata)
|
||
{
|
||
ModuleFieldsEntity moduleFieldsEntity = fieldsdata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleFieldsEntity != null)
|
||
{
|
||
data.Add(moduleFieldsEntity);
|
||
}
|
||
}
|
||
data.AddRange(fieldsdata.Where(a => a.F_IsPublic == true));
|
||
}
|
||
return data.OrderByDescending(a => a.F_CreatorTime).ToList();
|
||
}
|
||
|
||
public async Task<bool> ActionValidate(string action, bool isAuthorize = false)
|
||
{
|
||
var user = await userApp.GetForm(currentuser.UserId);
|
||
var temps = isAuthorize ? action.Split(',') : new string[0];
|
||
if (user == null || user.F_EnabledMark == false)
|
||
{
|
||
return false;
|
||
}
|
||
var authorizeurldata = new List<AuthorizeActionModel>();
|
||
var cachedata = await CacheHelper.GetAsync<Dictionary<string, List<AuthorizeActionModel>>>(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
if (cachedata == null)
|
||
{
|
||
cachedata = new Dictionary<string, List<AuthorizeActionModel>>();
|
||
}
|
||
if (user.F_IsAdmin == true)
|
||
{
|
||
if (await repository.Db.Queryable<ModuleEntity>().Where(a => a.F_UrlAddress == action || temps.Contains(a.F_Authorize)).AnyAsync()
|
||
|| await repository.Db.Queryable<ModuleButtonEntity>().Where(a => a.F_UrlAddress == action || temps.Contains(a.F_Authorize)).AnyAsync())
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
var rolelist = user.F_RoleId.Split(',');
|
||
foreach (var roles in rolelist)
|
||
{
|
||
if (!cachedata.ContainsKey(roles))
|
||
{
|
||
var moduledata = await moduleApp.GetList();
|
||
moduledata = moduledata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var buttondata = await moduleButtonApp.GetList();
|
||
buttondata = buttondata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var role = await roleApp.GetForm(roles);
|
||
if (role != null && role.F_EnabledMark == true)
|
||
{
|
||
var authdata = new List<AuthorizeActionModel>();
|
||
var authorizedata = await GetList(roles);
|
||
foreach (var item in authorizedata)
|
||
{
|
||
try
|
||
{
|
||
if (item.F_ItemType == 1)
|
||
{
|
||
ModuleEntity moduleEntity = moduledata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleEntity.F_Id, F_UrlAddress = moduleEntity.F_UrlAddress, F_Authorize = moduleEntity.F_Authorize });
|
||
}
|
||
}
|
||
else if (item.F_ItemType == 2)
|
||
{
|
||
ModuleButtonEntity moduleButtonEntity = buttondata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleButtonEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleButtonEntity.F_ModuleId, F_UrlAddress = moduleButtonEntity.F_UrlAddress, F_Authorize = moduleButtonEntity.F_Authorize });
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
string e = ex.Message;
|
||
continue;
|
||
}
|
||
}
|
||
authdata.AddRange(moduledata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_Id, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
authdata.AddRange(buttondata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_ModuleId, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
cachedata.Add(roles, authdata);
|
||
authorizeurldata.AddRange(authdata);
|
||
await CacheHelper.RemoveAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
await CacheHelper.SetAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list", cachedata);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
authorizeurldata.AddRange(cachedata[roles]);
|
||
}
|
||
}
|
||
}
|
||
var module = authorizeurldata.Find(a => a.F_UrlAddress == action || temps.Contains(a.F_Authorize));
|
||
if (module != null)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public async Task<bool> CheckReturnUrl(string userId, string url, bool isAll = false)
|
||
{
|
||
var user = await userApp.GetForm(userId);
|
||
if (isAll == false && (user == null || user.F_EnabledMark == false))
|
||
{
|
||
return false;
|
||
}
|
||
if (isAll == true || user.F_IsAdmin == true)
|
||
{
|
||
if (repository.Db.Queryable<ModuleEntity>().Where(a => a.F_UrlAddress == url).Any() || repository.Db.Queryable<ModuleButtonEntity>().Where(a => a.F_UrlAddress == url).Any())
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
var authorizeurldata = new List<AuthorizeActionModel>();
|
||
var rolelist = user.F_RoleId.Split(',');
|
||
var cachedata = await CacheHelper.GetAsync<Dictionary<string, List<AuthorizeActionModel>>>(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
if (cachedata == null)
|
||
{
|
||
cachedata = new Dictionary<string, List<AuthorizeActionModel>>();
|
||
}
|
||
foreach (var roles in rolelist)
|
||
{
|
||
if (!cachedata.ContainsKey(roles))
|
||
{
|
||
var moduledata = await moduleApp.GetList();
|
||
moduledata = moduledata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var buttondata = await moduleButtonApp.GetList();
|
||
buttondata = buttondata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var role = await roleApp.GetForm(roles);
|
||
if (role != null && role.F_EnabledMark == true)
|
||
{
|
||
var authdata = new List<AuthorizeActionModel>();
|
||
var authorizedata = await GetList(roles);
|
||
foreach (var item in authorizedata)
|
||
{
|
||
try
|
||
{
|
||
if (item.F_ItemType == 1)
|
||
{
|
||
ModuleEntity moduleEntity = moduledata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleEntity.F_Id, F_UrlAddress = moduleEntity.F_UrlAddress, F_Authorize = moduleEntity.F_Authorize });
|
||
}
|
||
}
|
||
else if (item.F_ItemType == 2)
|
||
{
|
||
ModuleButtonEntity moduleButtonEntity = buttondata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleButtonEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleButtonEntity.F_ModuleId, F_UrlAddress = moduleButtonEntity.F_UrlAddress, F_Authorize = moduleButtonEntity.F_Authorize });
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
string e = ex.Message;
|
||
continue;
|
||
}
|
||
}
|
||
authdata.AddRange(moduledata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_Id, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
authdata.AddRange(buttondata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_ModuleId, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
cachedata.Add(roles, authdata);
|
||
authorizeurldata.AddRange(authdata);
|
||
await CacheHelper.RemoveAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
await CacheHelper.SetAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list", cachedata);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
authorizeurldata.AddRange(cachedata[roles]);
|
||
}
|
||
}
|
||
var module = authorizeurldata.Find(a => a.F_UrlAddress == url);
|
||
if (module != null)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public async Task<bool> RoleValidate()
|
||
{
|
||
var current = OperatorProvider.Provider.GetCurrent();
|
||
if (current == null || string.IsNullOrEmpty(current.UserId))
|
||
{
|
||
return false;
|
||
}
|
||
var user = await userApp.GetForm(current.UserId);
|
||
if (user == null || user.F_EnabledMark == false)
|
||
{
|
||
return false;
|
||
}
|
||
if (user.F_IsAdmin == true)
|
||
{
|
||
return true;
|
||
}
|
||
var authorizeurldata = new List<AuthorizeActionModel>();
|
||
var rolelist = user.F_RoleId.Split(',');
|
||
var cachedata = await CacheHelper.GetAsync<Dictionary<string, List<AuthorizeActionModel>>>(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
if (cachedata == null)
|
||
{
|
||
cachedata = new Dictionary<string, List<AuthorizeActionModel>>();
|
||
}
|
||
foreach (var roles in rolelist)
|
||
{
|
||
if (!cachedata.ContainsKey(roles))
|
||
{
|
||
var moduledata = await moduleApp.GetList();
|
||
moduledata = moduledata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var buttondata = await moduleButtonApp.GetList();
|
||
buttondata = buttondata.Where(a => a.F_EnabledMark == true).ToList();
|
||
var role = await roleApp.GetForm(roles);
|
||
if (role != null && role.F_EnabledMark == true)
|
||
{
|
||
var authdata = new List<AuthorizeActionModel>();
|
||
var authorizedata = await GetList(roles);
|
||
foreach (var item in authorizedata)
|
||
{
|
||
try
|
||
{
|
||
if (item.F_ItemType == 1)
|
||
{
|
||
ModuleEntity moduleEntity = moduledata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleEntity.F_Id, F_UrlAddress = moduleEntity.F_UrlAddress, F_Authorize = moduleEntity.F_Authorize });
|
||
}
|
||
}
|
||
else if (item.F_ItemType == 2)
|
||
{
|
||
ModuleButtonEntity moduleButtonEntity = buttondata.Where(a => a.F_Id == item.F_ItemId && a.F_IsPublic == false).FirstOrDefault();
|
||
if (moduleButtonEntity != null)
|
||
{
|
||
authdata.Add(new AuthorizeActionModel { F_Id = moduleButtonEntity.F_ModuleId, F_UrlAddress = moduleButtonEntity.F_UrlAddress, F_Authorize = moduleButtonEntity.F_Authorize });
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
string e = ex.Message;
|
||
continue;
|
||
}
|
||
}
|
||
authdata.AddRange(moduledata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_Id, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
authdata.AddRange(buttondata.Where(a => a.F_IsPublic == true).Select(a => new AuthorizeActionModel { F_Id = a.F_ModuleId, F_UrlAddress = a.F_UrlAddress, F_Authorize = a.F_Authorize }).ToList());
|
||
cachedata.Add(roles, authdata);
|
||
authorizeurldata.AddRange(authdata);
|
||
await CacheHelper.RemoveAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list");
|
||
await CacheHelper.SetAsync(cacheKey + repository.Db.CurrentConnectionConfig.ConfigId + "_list", cachedata);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
authorizeurldata.AddRange(cachedata[roles]);
|
||
}
|
||
}
|
||
if (authorizeurldata.Count > 0)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
} |