´´´´ package com.lambarki.book.auth;
import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
@Service @RequiredArgsConstructor public class AuthenticationService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; private final RoleRepository roleRepository;
@Transactional
public void register(registrationRequest request) {
var userRole = roleRepository.findByName("USER")
.orElseThrow(() -> new IllegalStateException("ROLE USER was not initialized"));
var user = User.builder()
.firstname(request.getFirstname())
.lastname(request.getLastname())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.accountLocked(false)
.enabled(false)
.roles(List.of(userRole))
.build();
userRepository.save(user);
}
} ´´´´
´´´´
package com.lambarki.book.auth;
import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*;
import static org.springframework.http.HttpStatus.ACCEPTED;
@RestController @RequestMapping("auth") @RequiredArgsConstructor public class AuthenticationController {
private final AuthenticationService service;
@PostMapping("/register")
@ResponseStatus(ACCEPTED)
public ResponseEntity<?> register(@RequestBody @Valid registrationRequest request) {
service.register(request);
return ResponseEntity.accepted().build();
}
@PostMapping("/authenticate")
public ResponseEntity<AuthenticationResponse> authenticate(@RequestBody @Valid AuthenticationRequest request) {
return ResponseEntity.ok(service.authenticate(request));
}
}
´´´´
´´´´
package com.lambarki.book.auth;
import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.util.HashMap; import java.util.List;
@Service @RequiredArgsConstructor public class AuthenticationService { private final RoleRepository roleRepository; private final PasswordEncoder passwordEncoder; private final UserRepository userRepository; private final AuthenticationManager authenticationManager; private final JwtService jwtService;
@Transactional
public void register(registrationRequest request) {
var userRole = roleRepository.findByName("USER")
.orElseThrow(() -> new IllegalStateException("ROLE USER was not initialized"));
var user = User.builder()
.firstname(request.getFirstname())
.lastname(request.getLastname())
.email(request.getEmail())
.password(passwordEncoder.encode(request.getPassword()))
.accountLocked(false)
.enabled(true) // Immediately enable the account on registration
.roles(List.of(userRole))
.build();
userRepository.save(user);
}
public AuthenticationResponse authenticate(AuthenticationRequest request) {
var auth = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
request.getEmail(),
request.getPassword()
)
);
var claims = new HashMap<String, Object>();
var user = ((User)auth.getPrincipal());
claims.put("fullName", user.fullName());
var jwtToken = jwtService.generateToken(claims, user);
return AuthenticationResponse.builder()
.token(jwtToken)
.build();
}
public void activateAccount(String token) {
var user = userRepository.findById(Integer.parseInt(token))
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
user.setEnabled(true);
userRepository.save(user);
}
}
´´´´