using Yi.Framework.Infrastructure.Const; using Yi.Framework.Infrastructure.Ddd.Repositories; using Yi.Framework.Infrastructure.Exceptions; using Yi.Framework.Infrastructure.Helper; using Yi.Furion.Core.Rbac.Consts; using Yi.Furion.Core.Rbac.Dtos; using Yi.Furion.Core.Rbac.Entities; namespace Yi.Furion.Application.Rbac.Domain { /// /// 用户领域服务 /// public class AccountManager : ITransient { private readonly IRepository _repository; public AccountManager(IRepository repository) { _repository = repository; } /// /// 登录效验 /// /// /// /// /// public async Task LoginValidationAsync(string userName, string password, Action userAction = null) { var user = new UserEntity(); if (await ExistAsync(userName, o => user = o)) { if (userAction is not null) { userAction.Invoke(user); } if (user.Password == MD5Helper.SHA2Encode(password, user.Salt)) { return; } throw new UserFriendlyException(UserConst.登录失败_错误); } throw new UserFriendlyException(UserConst.登录失败_不存在); } /// /// 判断账户合法存在 /// /// /// /// public async Task ExistAsync(string userName, Action userAction = null) { var user = await _repository.GetFirstAsync(u => u.UserName == userName && u.State == true); if (userAction is not null) { userAction.Invoke(user); } if (user == null) { return false; } return true; } /// /// 令牌转换 /// /// /// public Dictionary UserInfoToClaim(UserRoleMenuDto dto) { var claims = new Dictionary(); claims.Add(TokenTypeConst.Id, dto.User.Id); claims.Add(TokenTypeConst.UserName, dto.User.UserName); if (dto.User.DeptId is not null) { claims.Add(TokenTypeConst.DeptId, dto.User.DeptId); } if (dto.User.Email is not null) { claims.Add(TokenTypeConst.Email, dto.User.Email); } if (dto.User.Phone is not null) { claims.Add(TokenTypeConst.PhoneNumber, dto.User.Phone); } if (UserConst.Admin.Equals(dto.User.UserName)) { claims.Add(TokenTypeConst.Permission, UserConst.AdminPermissionCode); claims.Add(TokenTypeConst.Roles, UserConst.AdminRolesCode); } else { claims.Add(TokenTypeConst.Permission, dto.PermissionCodes.Where(x => !string.IsNullOrEmpty(x))); claims.Add(TokenTypeConst.Roles, dto.RoleCodes.Where(x => !string.IsNullOrEmpty(x))); } return claims; } /// /// 更新密码 /// /// /// /// /// /// public async Task UpdatePasswordAsync(long userId, string newPassword, string oldPassword) { var user = await _repository.GetByIdAsync(userId); if (!user.JudgePassword(oldPassword)) { throw new UserFriendlyException("无效更新!原密码错误!"); } user.Password = newPassword; user.BuildPassword(); await _repository.UpdateAsync(user); } /// /// 重置密码 /// /// /// /// public async Task RestPasswordAsync(long userId, string password) { var user = await _repository.GetByIdAsync(userId); user.Id = userId; user.Password = password; user.BuildPassword(); return await _repository.UpdateAsync(user); } } }