auth_service.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package service
  2. import (
  3. "errors"
  4. "github.com/2930134478/AI-CS/backend/models"
  5. "github.com/2930134478/AI-CS/backend/repository"
  6. "golang.org/x/crypto/bcrypt"
  7. "gorm.io/gorm"
  8. )
  9. // ErrInvalidCredentials indicates login attempt failed.
  10. var (
  11. ErrInvalidCredentials = errors.New("invalid username or password")
  12. ErrUsernameExists = errors.New("username already exists")
  13. )
  14. // AuthService 负责认证相关的业务逻辑。
  15. type AuthService struct {
  16. users *repository.UserRepository
  17. }
  18. // NewAuthService 创建 AuthService 实例。
  19. func NewAuthService(users *repository.UserRepository) *AuthService {
  20. return &AuthService{users: users}
  21. }
  22. // Login 校验账号密码并返回用户信息。
  23. func (s *AuthService) Login(username, password string) (*models.User, error) {
  24. user, err := s.users.FindByUsername(username)
  25. if err != nil {
  26. if errors.Is(err, gorm.ErrRecordNotFound) {
  27. return nil, ErrInvalidCredentials
  28. }
  29. return nil, err
  30. }
  31. if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
  32. return nil, ErrInvalidCredentials
  33. }
  34. return user, nil
  35. }
  36. func (s *AuthService) CreateAgent(input CreateAgentInput) (*models.User, error) {
  37. if input.Username == "" || input.Password == "" {
  38. return nil, errors.New("username and password are required")
  39. }
  40. if _, err := s.users.FindByUsername(input.Username); err == nil {
  41. return nil, ErrUsernameExists
  42. } else if !errors.Is(err, gorm.ErrRecordNotFound) {
  43. return nil, err
  44. }
  45. hash, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost)
  46. if err != nil {
  47. return nil, err
  48. }
  49. role := input.Role
  50. if role == "" {
  51. role = "agent"
  52. }
  53. user := &models.User{
  54. Username: input.Username,
  55. Password: string(hash),
  56. Role: role,
  57. }
  58. if err := s.users.Create(user); err != nil {
  59. return nil, err
  60. }
  61. return user, nil
  62. }