using Mapster; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Yi.Framework.Core.CurrentUsers; using Yi.Framework.Core.Exceptions; using Yi.Framework.Ddd.Repositories; using Yi.RBAC.Domain.Identity.Dtos; using Yi.RBAC.Domain.Identity.Entities; using Yi.RBAC.Domain.Shared.Identity.ConstClasses; namespace Yi.RBAC.Domain.Identity { /// /// 用户领域服务 /// [AppService] public class AccountManager { 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(nameof(ICurrentUser.Id), dto.User.Id); claims.Add(nameof(ICurrentUser.UserName), dto.User.UserName); if (dto.User.Email is not null) { claims.Add(nameof(ICurrentUser.Email), dto.User.Email); } if (dto.User.Phone is not null) { claims.Add(nameof(ICurrentUser.PhoneNumber), dto.User.Phone); } if (UserConst.Admin.Equals(dto.User.UserName)) { claims.Add(nameof(ICurrentUser.Permission), UserConst.AdminPermissionCode); } else { claims.Add(nameof(ICurrentUser.Permission), dto.PermissionCodes.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); } } }