feat: 添加管理员密码修改功能
This commit is contained in:
@@ -9,4 +9,6 @@ public interface IAuthService
|
||||
Task LogoutAsync(string token, CancellationToken cancellationToken = default);
|
||||
|
||||
Task<AuthenticatedUser?> ValidateTokenAsync(string token, CancellationToken cancellationToken = default);
|
||||
|
||||
Task ChangePasswordAsync(Guid userId, ChangePasswordRequest request, CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
@@ -109,6 +109,8 @@ public interface IUserAccountRepository
|
||||
Task<UserAccount?> GetByUsernameAsync(string username, CancellationToken cancellationToken = default);
|
||||
|
||||
Task AddAsync(UserAccount userAccount, CancellationToken cancellationToken = default);
|
||||
|
||||
void Update(UserAccount userAccount);
|
||||
}
|
||||
|
||||
public interface IUserSessionRepository
|
||||
|
||||
@@ -28,3 +28,10 @@ public sealed class LoginResponse
|
||||
|
||||
public required AuthenticatedUser User { get; init; }
|
||||
}
|
||||
|
||||
public sealed class ChangePasswordRequest
|
||||
{
|
||||
public string CurrentPassword { get; set; } = string.Empty;
|
||||
|
||||
public string NewPassword { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
@@ -112,4 +112,31 @@ public sealed class AuthService : IAuthService
|
||||
ExpiresAt = session.ExpiresAt
|
||||
};
|
||||
}
|
||||
|
||||
public async Task ChangePasswordAsync(Guid userId, ChangePasswordRequest request, CancellationToken cancellationToken = default)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(request);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(request.CurrentPassword) || string.IsNullOrWhiteSpace(request.NewPassword))
|
||||
{
|
||||
throw new InvalidOperationException("当前密码和新密码不能为空。");
|
||||
}
|
||||
|
||||
if (request.NewPassword.Length < 6)
|
||||
{
|
||||
throw new InvalidOperationException("新密码长度不能少于 6 位。");
|
||||
}
|
||||
|
||||
var user = await _userAccountRepository.GetByIdAsync(userId, cancellationToken)
|
||||
?? throw new InvalidOperationException("用户不存在。");
|
||||
|
||||
if (!PasswordHasher.Verify(request.CurrentPassword, user.PasswordHash))
|
||||
{
|
||||
throw new InvalidOperationException("当前密码不正确。");
|
||||
}
|
||||
|
||||
user.UpdatePassword(PasswordHasher.Hash(request.NewPassword));
|
||||
_userAccountRepository.Update(user);
|
||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,6 +323,9 @@ public sealed class UserAccountRepository : IUserAccountRepository
|
||||
|
||||
public Task AddAsync(UserAccount userAccount, CancellationToken cancellationToken = default) =>
|
||||
_dbContext.UserAccounts.AddAsync(userAccount, cancellationToken).AsTask();
|
||||
|
||||
public void Update(UserAccount userAccount) =>
|
||||
_dbContext.UserAccounts.Update(userAccount);
|
||||
}
|
||||
|
||||
public sealed class UserSessionRepository : IUserSessionRepository
|
||||
|
||||
@@ -33,4 +33,14 @@ public sealed class AuthController : ControllerBase
|
||||
await _authService.LogoutAsync(token, cancellationToken);
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpPost("change-password")]
|
||||
public async Task<IActionResult> ChangePassword([FromBody] ChangePasswordRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var currentUser = HttpContext.Items["CurrentUser"] as AuthenticatedUser
|
||||
?? throw new InvalidOperationException("未登录。");
|
||||
|
||||
await _authService.ChangePasswordAsync(currentUser.UserId, request, cancellationToken);
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user