ow
This commit is contained in:
1 parent
31fbe199c1
commit
1c0c83af5f
469 files changed
+62544
-5
No files matched your search
@@ -0,0 +1,353 @@
|
||||
using CloudBuilder.Core.DatabaseAccessor;
|
||||
using CloudBuilder.Core.DatabaseAccessor.Entity;
|
||||
using CloudBuilder.Core.Extensions;
|
||||
using CloudBuilder.Core.Policy;
|
||||
using CloudBuilder.Core.Service;
|
||||
using CloudBuilder.Security.Data;
|
||||
using CloudBuilder.Security.Entity;
|
||||
using CloudBuilder.Security.Policy;
|
||||
using CloudBuilder.Security.SearchCriteria;
|
||||
using CloudBuilder.Security.Service.Authorization;
|
||||
using CloudBuilder.Security.Utility;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Security.Permissions;
|
||||
namespace CloudBuilder.Security.Service
|
||||
{
|
||||
public class SecurityUserService : ISecurityUserService
|
||||
{
|
||||
private readonly IApplicationService service;
|
||||
private readonly IHttpContextAccessor httpContextAccessor;
|
||||
private IRepository<SecurityUserEntity> repository;
|
||||
public SecurityUserService(IApplicationService service, IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
this.service = service;
|
||||
this.httpContextAccessor = httpContextAccessor;
|
||||
repository = service.GetRepository<IRepository<SecurityUserEntity>>();
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Find)]
|
||||
public SecurityUserEntity FindByStaffId(string staffid)
|
||||
{
|
||||
return repository.DetachedEntities.Where(x => x.UserName == staffid).FirstOrDefault();
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Find)]
|
||||
public SecurityUserData FindByKey(string key)
|
||||
{
|
||||
SecurityUserData data = new SecurityUserData();
|
||||
if (string.IsNullOrEmpty(key)) return data;
|
||||
|
||||
SecurityUserEntity user = repository.DetachedEntities.Where(x => x.UserName == key).FirstOrDefault();
|
||||
|
||||
if (user == null) return data;
|
||||
|
||||
string uid = service.UserId;
|
||||
|
||||
PermissionContext permissionContext = new PermissionContext(service);
|
||||
|
||||
if (user.UserName != uid && permissionContext.CanView(SecurityPermissionPolicy.CanSeeAllUser))
|
||||
{
|
||||
return data;
|
||||
}
|
||||
|
||||
data.SecurityUser = new SecurityUserDisplayData(user);
|
||||
|
||||
IRepository<SecurityUserActorViewEntity> repositoryUav = repository.GetRepository<IRepository<SecurityUserActorViewEntity>>();
|
||||
|
||||
data.SecurityUserActors = repositoryUav.DetachedEntities.Where(x => x.UserName == key).ToArray();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Find)]
|
||||
public SecurityUserEntity[] FindAll()
|
||||
{
|
||||
return repository.DetachedEntities.ToArray();
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Find)]
|
||||
public SecurityUserResultData FindBySearchCriteria(SecurityUserSearchCriteria criteria)
|
||||
{
|
||||
SecurityUserResultData data = new SecurityUserResultData();
|
||||
SecurityUserEntity[] list = null;
|
||||
|
||||
int count = 0;
|
||||
|
||||
string sqlWhere = null;
|
||||
|
||||
if (criteria.Filter != null && criteria.Filter.Length > 0)
|
||||
{
|
||||
sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
|
||||
}
|
||||
|
||||
//sqlWhere = sqlWhere + string.Format(" and {0} ='{1}' ", SecurityUserEntity.DB_USER_IS_VALID_INDC, YesNoPolicy.YES);
|
||||
|
||||
SecurityUserEntity entity = SecurityUserEntity.GetInstance();
|
||||
string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
|
||||
|
||||
|
||||
|
||||
string err = null;
|
||||
try
|
||||
{
|
||||
list = repository.FromSql(sql).ToArray();
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
err = ex.Message;
|
||||
}
|
||||
|
||||
|
||||
if (list != null && list.Length > 0)
|
||||
{
|
||||
sql = entity.GetSelectCountFrom(sqlWhere);
|
||||
count = (int)repository.ExecuteScalar(sql);
|
||||
}
|
||||
|
||||
data.Limit = criteria.limit;
|
||||
data.Page = criteria.page;
|
||||
data.Datas = list;
|
||||
data.Total = count;
|
||||
//data.Sql = sql;
|
||||
data.ErrorMessage = err;
|
||||
return data;
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Print)]
|
||||
public dynamic PrintBySearchCriteria(SecurityUserSearchCriteria criteria)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Insert)]
|
||||
[UnitOfWork]
|
||||
public SecurityUserData Insert(SecurityUserData data)
|
||||
{
|
||||
SecurityUserEntity securityUser = repository.DetachedEntities.Where(x => x.UserName == data.SecurityUser.UserName).FirstOrDefault();
|
||||
if (securityUser != null)
|
||||
{
|
||||
throw new ValidatedException("记录已存在.");
|
||||
}
|
||||
|
||||
ValidateHelper.Validate(service, data.SecurityUser, SecurityUserEntity.DB_NAME_SECURITY_USER);
|
||||
|
||||
securityUser = new SecurityUserEntity();
|
||||
|
||||
ObjectCopyHelper.Copy(data.SecurityUser, securityUser);
|
||||
if (!string.IsNullOrEmpty(data.SecurityUser.OrgUserPassword))
|
||||
securityUser.UserPassword = data.SecurityUser.OrgUserPassword.GetMd5();
|
||||
|
||||
securityUser.UserIsValidIndc = YesNoPolicy.YES;
|
||||
repository.InsertNow(securityUser);
|
||||
|
||||
SaveSecurityUserActor(data);
|
||||
|
||||
return FindByKey(data.SecurityUser.UserName);
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Update)]
|
||||
[UnitOfWork]
|
||||
public SecurityUserData Update(SecurityUserData data)
|
||||
{
|
||||
SecurityUserEntity SecurityUser = repository.DetachedEntities.Where(x => x.UserName == data.SecurityUser.UserName).FirstOrDefault();
|
||||
if (SecurityUser == null)
|
||||
{
|
||||
throw new ValidatedException("记录不存在.");
|
||||
}
|
||||
|
||||
ValidateHelper.Validate(service, data.SecurityUser, SecurityUserEntity.DB_NAME_SECURITY_USER);
|
||||
|
||||
ObjectCopyHelper.Copy(data.SecurityUser, SecurityUser);
|
||||
|
||||
if (!string.IsNullOrEmpty(data.SecurityUser.OrgUserPassword))
|
||||
{
|
||||
SecurityUser.UserPassword = data.SecurityUser.OrgUserPassword.GetMd5();
|
||||
}
|
||||
|
||||
repository.UpdateNow(SecurityUser);
|
||||
|
||||
SaveSecurityUserActor(data);
|
||||
|
||||
return FindByKey(data.SecurityUser.UserName);
|
||||
}
|
||||
|
||||
private void SaveSecurityUserActor(SecurityUserData data)
|
||||
{
|
||||
IRepository<SecurityUserActorEntity> repositoryUa = repository.GetRepository<IRepository<SecurityUserActorEntity>>();
|
||||
|
||||
SecurityUserActorEntity[] olds = repositoryUa.Entities.Where(x => x.UserName == data.SecurityUser.UserName).ToArray();
|
||||
if (olds != null && olds.Length > 0)
|
||||
{
|
||||
foreach (SecurityUserActorEntity old in olds)
|
||||
{
|
||||
repositoryUa.DeleteNow(old);
|
||||
}
|
||||
}
|
||||
|
||||
if (data.SecurityUserActors != null && data.SecurityUserActors.Length > 0)
|
||||
foreach (SecurityUserActorViewEntity dto in data.SecurityUserActors)
|
||||
{
|
||||
repositoryUa.InsertNow(new SecurityUserActorEntity()
|
||||
{
|
||||
UserName = data.SecurityUser.UserName,
|
||||
ActorName = dto.ActorName,
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Delete)]
|
||||
[UnitOfWork]
|
||||
public void Delete(string key)
|
||||
{
|
||||
SecurityUserEntity securityUser = repository.DetachedEntities.Where(x => x.UserName == key).FirstOrDefault();
|
||||
if (securityUser == null)
|
||||
{
|
||||
throw new ValidatedException("记录不存在.");
|
||||
}
|
||||
|
||||
securityUser.UserIsValidIndc = "N";
|
||||
repository.UpdateNow(securityUser);
|
||||
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.Delete)]
|
||||
[UnitOfWork]
|
||||
public void Deletes(string[] keys)
|
||||
{
|
||||
foreach (string key in keys)
|
||||
{
|
||||
Delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
[PermissionOperate(name: SecurityPermissionPolicy.SecurityUser, operate: Operate.None)]
|
||||
public SecurityFunctionResultData FindMenuByUsername()
|
||||
{
|
||||
string username = service.UserId;
|
||||
|
||||
if (string.IsNullOrEmpty(username)) return null;
|
||||
|
||||
SecurityFunctionResultData data = new SecurityFunctionResultData();
|
||||
|
||||
var userActors = service.GetRepository<IRepository<SecurityUserActorEntity>>().DetachedEntities.Where(x => x.UserName == username);
|
||||
|
||||
var actorGroups = service.GetRepository<IRepository<SecurityActorGroupEntity>>().DetachedEntities.Where(x => userActors.Select(x => x.ActorName).Contains(x.ActorName));
|
||||
|
||||
var groupPermissions = service.GetRepository<IRepository<SecurityGroupPermissionEntity>>().DetachedEntities.Where(x => actorGroups.Select(x => x.GroupName).Contains(x.GroupName));
|
||||
|
||||
var pfMaps = service.GetRepository<IRepository<SecurityPermissionFunctionMapEntity>>().DetachedEntities.Where(x => groupPermissions.Select(x => x.PermissionName).Contains(x.PermissionName));
|
||||
|
||||
SecurityFunctionEntity[] securityFunctions = service.GetRepository<IRepository<SecurityFunctionEntity>>().DetachedEntities.Where(x => pfMaps.Select(x => x.FunctionName).Contains(x.FunctionName)).ToArray();
|
||||
if (securityFunctions == null || securityFunctions.Length == 0) return null;
|
||||
|
||||
SecurityFunctionMapEntity[] securityFunctionMaps = service.GetRepository<IRepository<SecurityFunctionMapEntity>>().DetachedEntities.ToArray();
|
||||
|
||||
SecurityFunctionEntity[] functions = service.GetRepository<IRepository<SecurityFunctionEntity>>().DetachedEntities.ToArray();
|
||||
|
||||
if (securityFunctionMaps == null || securityFunctionMaps.Length == 0) return null;
|
||||
|
||||
List<SecurityFunctionDisplayData> displayDatas = new List<SecurityFunctionDisplayData>();
|
||||
List<SecurityFunctionMapEntity> maps = new List<SecurityFunctionMapEntity>();
|
||||
|
||||
foreach (var securityFunction in securityFunctions)
|
||||
{
|
||||
PackSecurityFunction(displayDatas, maps, securityFunction, functions, securityFunctionMaps);
|
||||
}
|
||||
|
||||
data.SecurityFunctionMaps = maps.ToArray();
|
||||
data.SecurityFunctionDisplayDatas = displayDatas.OrderBy(x => x.Orderby).ToArray();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
private int GetOrderBy(string functionName, ref int level, SecurityFunctionEntity[] securityFunctions, SecurityFunctionMapEntity[] securityFunctionMaps, int baseOrderBy)
|
||||
{
|
||||
SecurityFunctionMapEntity[] parents = securityFunctionMaps.Where(x => x.FunctionNameSon == functionName).ToArray();
|
||||
int orderBy = 0;
|
||||
if (parents != null && parents.Length > 0)
|
||||
{
|
||||
if (level > 0)
|
||||
return parents.FirstOrDefault().Orderby * 10000 + baseOrderBy;
|
||||
else
|
||||
orderBy = baseOrderBy * 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
return baseOrderBy * 1000000;
|
||||
}
|
||||
|
||||
foreach (var parent in parents)
|
||||
{
|
||||
level = 0;
|
||||
SecurityFunctionEntity f = securityFunctions.Where(x => x.FunctionName == parent.FunctionNameParent).FirstOrDefault()!;
|
||||
if (f == null || f.FunctionName == SecurityFunctionResultData.BOOTUP) continue;
|
||||
level += 1;
|
||||
SecurityFunctionMapEntity[] ps = securityFunctionMaps.Where(x => x.FunctionNameSon == functionName).ToArray();
|
||||
|
||||
orderBy = GetOrderBy(f.FunctionName, ref level, securityFunctions, securityFunctionMaps, parents.FirstOrDefault().Orderby * 100 + baseOrderBy);
|
||||
}
|
||||
|
||||
if (level == 0) orderBy = parents.FirstOrDefault().Orderby * 10000 + orderBy;
|
||||
|
||||
return orderBy;
|
||||
}
|
||||
|
||||
private void PackSecurityFunction(List<SecurityFunctionDisplayData> displayDatas, List<SecurityFunctionMapEntity> maps, SecurityFunctionEntity securityFunction, SecurityFunctionEntity[] securityFunctions, SecurityFunctionMapEntity[] securityFunctionMaps)
|
||||
{
|
||||
if (!displayDatas.Select(x => x.FunctionName).Contains(securityFunction.FunctionName))
|
||||
{
|
||||
SecurityFunctionMapEntity[] parents = securityFunctionMaps.Where(x => x.FunctionNameSon == securityFunction.FunctionName).ToArray();
|
||||
|
||||
int orderby = 0;
|
||||
if (parents != null && parents.Length > 0)
|
||||
{
|
||||
foreach (var parent in parents)
|
||||
{
|
||||
int level = 0;
|
||||
orderby = GetOrderBy(parent.FunctionNameParent, ref level, securityFunctions, securityFunctionMaps, parent.Orderby);
|
||||
|
||||
displayDatas.Add(new SecurityFunctionDisplayData(securityFunction) { Orderby = orderby, FunctionNameParent = parent.FunctionNameParent });
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//顶级菜单
|
||||
orderby = 1000000;
|
||||
displayDatas.Add(new SecurityFunctionDisplayData(securityFunction) { Orderby = orderby });
|
||||
}
|
||||
|
||||
|
||||
|
||||
foreach (var parent in parents)
|
||||
{
|
||||
SecurityFunctionEntity f = securityFunctions.Where(x => x.FunctionName == parent.FunctionNameParent).FirstOrDefault()!;
|
||||
if (f == null) continue;
|
||||
maps.Add(parent);
|
||||
PackSecurityFunction(displayDatas, maps, f, securityFunctions, securityFunctionMaps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[AllowAnonymous]
|
||||
public void UpdateLocalName(string localName)
|
||||
{
|
||||
SecurityUserEntity securityUser = repository.DetachedEntities.Where(x => x.UserName == service.UserId && x.UserIsValidIndc == YesNoPolicy.YES).FirstOrDefault();
|
||||
if (securityUser == null)
|
||||
{
|
||||
throw new ValidatedException("用户不存在.");
|
||||
}
|
||||
securityUser.UserLocalName = localName;
|
||||
repository.UpdateNow(securityUser);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user