@Service
@RequiredArgsConstructor
public class AuthenticationService {
private final UserRepository repository;
private final PasswordEncoder passwordEncoder;
private final JwtService jwtService;
private final AuthenticationManager authenticationManager;
public AuthenticationResponse register(RegisterRequest request) {
var userAuth = UserAuth.builder()
.account(request.getFirstname())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.role(Rule.USER)
.build();
repository.save(userAuth);
var jwtToken = jwtService.generateToken(userAuth);
return AuthenticationResponse.builder()
.token(jwtToken)
.build();
}
public AuthenticationResponse authenticate(AuthenticationRequest request) {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
request.getEmail(),
request.getPassword()
)
);
var user = repository.findByEmail(request.getEmail()).orElseThrow();
var jwtToken = jwtService.generateToken(user);
return AuthenticationResponse.builder()
.token(jwtToken)
.build();
}
}
註冊功能 (register):
1. 創建一個新的 UserAuth對象,此對象包含用戶賬戶信息、編碼後的密碼和用戶角色。
2. 將此 UserAuth 對象保存到數據庫中。
3. 使用 JwtService 生成一個包含用戶信息的 JWT 令牌。
4. 將生成的 JWT 令牌封裝到 AuthenticationResponse 對象中,並返回給前端。
驗證功能 (authenticate)
AuthenticationService 的 authenticate方法用於處理用戶登錄。這個方法接受一個 AuthenticationRequest 對象,包含了用戶的電子郵件和密碼。具體步驟如下:
1. 使用 AuthenticationManager 進行用戶身份驗證,這裡會檢查用戶提供的電子郵件和密碼是否正確。
2. 從數據庫中查找對應的用戶,如果用戶不存在則拋出異常。
3. 使用 JwtService 為該用戶生成一個新的 JWT 令牌。
4. 將生成的 JWT 令牌封裝到 AuthenticationResponse 對象中,並返回給前端。