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 repository; public SecurityUserService(IApplicationService service, IHttpContextAccessor httpContextAccessor) { this.service = service; this.httpContextAccessor = httpContextAccessor; repository = service.GetRepository>(); } [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 repositoryUav = repository.GetRepository>(); 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 repositoryUa = repository.GetRepository>(); 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); } } [AllowAnonymous] public SecurityFunctionResultData FindMenuByUsername() { string username = service.UserId; if (string.IsNullOrEmpty(username)) return null; SecurityFunctionResultData data = new SecurityFunctionResultData(); var userActors = service.GetRepository>().DetachedEntities.Where(x => x.UserName == username); var actorGroups = service.GetRepository>().DetachedEntities.Where(x => userActors.Select(x => x.ActorName).Contains(x.ActorName)); var groupPermissions = service.GetRepository>().DetachedEntities.Where(x => actorGroups.Select(x => x.GroupName).Contains(x.GroupName)); var pfMaps = service.GetRepository>().DetachedEntities.Where(x => groupPermissions.Select(x => x.PermissionName).Contains(x.PermissionName)); SecurityFunctionEntity[] securityFunctions = service.GetRepository>().DetachedEntities.Where(x => pfMaps.Select(x => x.FunctionName).Contains(x.FunctionName)).ToArray(); if (securityFunctions == null || securityFunctions.Length == 0) return null; SecurityFunctionMapEntity[] securityFunctionMaps = service.GetRepository>().DetachedEntities.ToArray(); SecurityFunctionEntity[] functions = service.GetRepository>().DetachedEntities.ToArray(); if (securityFunctionMaps == null || securityFunctionMaps.Length == 0) return null; List displayDatas = new List(); List maps = new List(); 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 displayDatas, List 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); } } }