86 lines
3.5 KiB
Java
86 lines
3.5 KiB
Java
package com.displaynone.acss.components.auth;
|
|
|
|
import com.displaynone.acss.components.auth.internal_utils.JWTUtils;
|
|
import com.displaynone.acss.components.auth.models.AuthTokenPair;
|
|
import com.displaynone.acss.components.auth.models.user.UserModel;
|
|
import com.displaynone.acss.components.auth.models.user.service.UserService;
|
|
import com.displaynone.acss.exception.generics.UnauthorizedHTTPException;
|
|
import com.displaynone.acss.utils.Pair;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.lang.NonNull;
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
import org.springframework.security.core.userdetails.UserDetails;
|
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.util.Optional;
|
|
|
|
@Component
|
|
@RequiredArgsConstructor
|
|
public class AuthComponent implements UserDetailsService {
|
|
private JWTUtils jwtUtils;
|
|
private final UserService userService;
|
|
private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
|
|
|
@Autowired
|
|
public AuthComponent(JWTUtils jwtUtils, UserService userService) {
|
|
this.jwtUtils = jwtUtils;
|
|
this.userService = userService;
|
|
}
|
|
|
|
public AuthTokenPair _generateTokenPair(@NonNull UserDetails user) {
|
|
String accessToken = jwtUtils.generateAccessToken(user);
|
|
String refreshToken = jwtUtils.generateRefreshToken(user);
|
|
|
|
return new AuthTokenPair(accessToken, refreshToken);
|
|
}
|
|
|
|
public Optional<UserModel> getUserByLogin(@NonNull String login) {
|
|
return userService.findByLogin(login);
|
|
}
|
|
|
|
public UserModel getUserByLoginStrict(@NonNull String login) {
|
|
return userService.findByLoginStrict(login);
|
|
}
|
|
|
|
public UsernamePasswordAuthenticationToken authenticateByAccessToken(@NonNull String accessToken) {
|
|
if (!jwtUtils.validateToken(accessToken)) throw new UnauthorizedHTTPException("Invalid access token");
|
|
|
|
String username = jwtUtils.getLogin(accessToken);
|
|
UserModel userModel = getUserByLoginStrict(username);
|
|
|
|
return new UsernamePasswordAuthenticationToken(userModel, null, userModel.getAuthorities());
|
|
}
|
|
|
|
public AuthTokenPair refresh(@NonNull String refreshToken) {
|
|
if (!jwtUtils.validateToken(refreshToken)) throw new UnauthorizedHTTPException("Invalid refresh token");
|
|
|
|
String login = jwtUtils.getLogin(refreshToken);
|
|
UserModel userModel = getUserByLoginStrict(login);
|
|
|
|
return _generateTokenPair(userModel);
|
|
}
|
|
|
|
public Pair<UserModel, AuthTokenPair> authenticate(@NonNull String login, @NonNull String password) {
|
|
UserModel userModel = userService.findByLoginStrict(login);
|
|
if (passwordEncoder.matches(password, userModel.getPassword())) return Pair.of(userModel, authenticate(userModel));
|
|
throw new UnauthorizedHTTPException("Wrong auth credentials");
|
|
}
|
|
|
|
public AuthTokenPair authenticate(@NonNull UserDetails user) {
|
|
return _generateTokenPair(user);
|
|
}
|
|
|
|
@Override
|
|
public UserDetails loadUserByUsername(@NonNull String username) throws UsernameNotFoundException {
|
|
return getUserByLoginStrict(username);
|
|
}
|
|
|
|
public void updateUserByLogin(String login, UserModel userUpdated) {
|
|
userService.updateUserByLogin(login, userUpdated);
|
|
}
|
|
}
|