authenticationController defined in file [.../AuthenticationController.class]
↓
authenticationServiceImpl defined in file [.../AuthenticationServiceImpl.class]
┌─────┐
| userRepositoryImpl defined in file [.../UserRepositoryImpl.class]
└─────┘
< /code>
Структура проекта: < /p>
├── application/
│ ├── service/
│ │ ├── AuthenticationServiceImpl.java
| | ├── JwtService.java
│
├── domain/
│ ├── model/
│ │ ├── User.java
| | ├── Role.java
│
├── ports/
│ ├── AuthenticationServicePort.java
│ ├── UserRepositoryPort.java
│ ├── TokenPort.java
│
├── adapters/
│ ├── inbound/
│ │ ├── controller/
│ │ │ ├── AuthenticationController.java
│ ├── outbound/
│ │ ├── repository/
│ │ │ ├── RoleEntity.java
│ │ │ ├── UserEntity.java
│ │ │ ├── UserRepositoryImpl.java
│ │ │ ├── UserRepository.java
│ │ ├── security/
│ │ │ ├── UserDetailsAdapter.java
│
├── config/
│ ├── ApplicationConfig.java
├── utils/
│ ├── Mapper.java
< /code>
контроллер: < /p>
@RestController
@RequestMapping("/api/v1/auth")
public class AuthenticationController {
private final AuthenticationServicePort authenticationServicePort;
public AuthenticationController(AuthenticationServicePort authenticationServicePort) {
this.authenticationServicePort = authenticationServicePort;
}
@PostMapping("/register")
public ResponseEntity register(
@Valid @RequestBody RegisterRequestDto request
) {
return ResponseEntity.ok(authenticationServicePort.register(request));
}
@PostMapping("/login")
public ResponseEntity authenticate(
@RequestBody AuthenticationRequestDto request
) {
return ResponseEntity.ok(authenticationServicePort.authenticate(request));
}
}
< /code>
service < /p>
@Service
public class AuthenticationServiceImpl implements AuthenticationServicePort {
private final UserRepositoryPort userRepositoryPort;
private final PasswordEncoder passwordEncoder;
private final TokenPort tokenPort;
private final AuthenticationManager authenticationManager;
public AuthenticationServiceImpl(UserRepositoryPort userRepositoryPort, PasswordEncoder passwordEncoder, TokenPort tokenPort, AuthenticationManager authenticationManager) {
this.userRepositoryPort = userRepositoryPort;
this.passwordEncoder = passwordEncoder;
this.tokenPort = tokenPort;
this.authenticationManager = authenticationManager;
}
@Override
public AuthenticationResponseDto register(RegisterRequestDto request) {
User user = new User(
null,
request.getFirstname(),
request.getLastname(),
request.getEmail(),
passwordEncoder.encode(request.getPassword()),
Role.USER,
null, null,
request.getPhoneNumber(),
null, null
);
userRepositoryPort.save(user);
Map extraClaims = new HashMap();
extraClaims.put("ROLE", Role.USER);
String jwtToken = tokenPort.generateToken(extraClaims, new UserDetailsAdapter(user));
return new AuthenticationResponseDto(jwtToken);
}
@Override
public AuthenticationResponseDto authenticate(AuthenticationRequestDto request) {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
request.getEmail(),
request.getPassword()
)
);
User user = userRepositoryPort.findByEmail(request.getEmail())
.orElseThrow();
Map extraClaims = new HashMap();
extraClaims.put("ROLE", user.getRole());
String jwtToken = tokenPort.generateToken(extraClaims, new UserDetailsAdapter(user));
return new AuthenticationResponseDto(jwtToken);
}
}
< /code>
userRepositoryImpl < /p>
@Repository
public class UserRepositoryImpl implements UserRepositoryPort {
private final UserRepository userRepository;
public UserRepositoryImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Optional findByEmail(String email) {
return userRepository.findByEmail(email).map(Mapper::toDomain);
}
@Override
public User save(User user) {
UserEntity entity = toEntity(user);
return toDomain(userRepository.save(entity));
< /code>
userRepository < /p>
public interface UserRepository extends JpaRepository {
Optional findByEmail(String email);
}
< /code>
userRepositoryport: < /p>
public interface UserRepositoryPort {
Optional findByEmail(String email);
User save(User user);
}
< /code>
Что я попробовал
удалить @repository из userRepositoryImpl и вводил его вручную в приложении.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... repository