package services import ( "errors" "time" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" "oidc-oauth2-server/models" ) type AuthService struct { db *gorm.DB } func NewAuthService(db *gorm.DB) *AuthService { return &AuthService{db: db} } func (s *AuthService) Authenticate(username, password string) (*models.User, error) { user := &models.User{} if err := s.db.Where("username = ?", username).First(user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("invalid username or password") } return nil, err } if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { return nil, errors.New("invalid username or password") } // 更新最后登录时间 user.LastLogin = time.Now() s.db.Save(user) return user, nil } func (s *AuthService) CreateUser(username, password, email string) (*models.User, error) { // 检查用户名是否已存在 var count int64 s.db.Model(&models.User{}).Where("username = ?", username).Count(&count) if count > 0 { return nil, errors.New("username already exists") } // 加密密码 hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { return nil, err } user := &models.User{ Username: username, Password: string(hashedPassword), Email: email, IsActive: true, } if err := s.db.Create(user).Error; err != nil { return nil, err } return user, nil } // GetUserByID 根据用户 ID 获取用户信息 func (s *AuthService) GetUserByID(id uint, user *models.User) error { result := s.db.First(user, id) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return errors.New("user not found") } return result.Error } return nil }