iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
@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 對象中,並返回給前端。

上一篇
Day 20 RegisterRequest
下一篇
Day 22 Spring boot Jwt Token TestEnable
系列文
Spring Boot微服務架構:API設計與實現30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言