auth gateway refact
This commit is contained in:
@@ -19,7 +19,7 @@ public class R2dbcConfig {
|
||||
@Bean
|
||||
public R2dbcCustomConversions r2dbcCustomConversions() {
|
||||
return R2dbcCustomConversions.of(
|
||||
PostgresDialect.INSTANCE.getStoreConversions(),
|
||||
PostgresDialect.INSTANCE,
|
||||
List.of(
|
||||
new RegistrationStatusReadConverter(),
|
||||
new RegistrationStatusWriteConverter(),
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
package com.posthub.gateway.controller;
|
||||
|
||||
import com.posthub.gateway.model.request.LoginUserRequest;
|
||||
import com.posthub.gateway.model.request.LoginRequest;
|
||||
import com.posthub.gateway.model.request.RegistrationUserRequest;
|
||||
import com.posthub.gateway.model.response.JwtResponse;
|
||||
import com.posthub.gateway.model.response.RagResponse;
|
||||
import com.posthub.gateway.model.response.UserProfileDTO;
|
||||
import com.posthub.gateway.service.AuthService;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseCookie;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -19,22 +21,46 @@ public class AuthController {
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
@PostMapping("/register")
|
||||
public Mono<ResponseEntity<JwtResponse>> register(@Valid @RequestBody RegistrationUserRequest request) {
|
||||
return authService.register(request)
|
||||
.map(response -> ResponseEntity.status(HttpStatus.CREATED).body(response));
|
||||
@PostMapping("/login")
|
||||
public Mono<ResponseEntity<RagResponse<UserProfileDTO>>> login(
|
||||
@RequestBody @Valid LoginRequest request,
|
||||
ServerHttpResponse response) {
|
||||
return authService.login(request)
|
||||
.map(result -> {
|
||||
addAuthCookie(response, result.getPayload().getToken());
|
||||
return ResponseEntity.ok(result);
|
||||
});
|
||||
}
|
||||
|
||||
@PostMapping("/login")
|
||||
public Mono<ResponseEntity<JwtResponse>> login(@Valid @RequestBody LoginUserRequest request) {
|
||||
return authService.login(request)
|
||||
.map(ResponseEntity::ok);
|
||||
@PostMapping("/register")
|
||||
public Mono<ResponseEntity<RagResponse<UserProfileDTO>>> register(
|
||||
@RequestBody @Valid RegistrationUserRequest request,
|
||||
ServerHttpResponse response) {
|
||||
return authService.register(request)
|
||||
.map(result -> {
|
||||
addAuthCookie(response, result.getPayload().getToken());
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(result);
|
||||
});
|
||||
}
|
||||
|
||||
@GetMapping("/refresh/token")
|
||||
public Mono<ResponseEntity<JwtResponse>> refreshToken(
|
||||
@RequestHeader(HttpHeaders.AUTHORIZATION) String authHeader) {
|
||||
return authService.refreshToken(authHeader)
|
||||
.map(ResponseEntity::ok);
|
||||
public Mono<ResponseEntity<RagResponse<UserProfileDTO>>> refreshToken(
|
||||
@RequestParam(name = "token") String refreshToken,
|
||||
ServerHttpResponse response) {
|
||||
return authService.refreshAccessToken(refreshToken)
|
||||
.map(result -> {
|
||||
addAuthCookie(response, result.getPayload().getToken());
|
||||
return ResponseEntity.ok(result);
|
||||
});
|
||||
}
|
||||
|
||||
private void addAuthCookie(ServerHttpResponse response, String token) {
|
||||
ResponseCookie cookie = ResponseCookie.from("Authorization", token)
|
||||
.httpOnly(true)
|
||||
.secure(true)
|
||||
.path("/")
|
||||
.maxAge(300)
|
||||
.build();
|
||||
response.addCookie(cookie);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.posthub.gateway.model.constants;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class ApiConstants {
|
||||
|
||||
public static final String DASH = "-";
|
||||
|
||||
public static final String PASSWORD_ALL_CHARACTERS =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~`!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?";
|
||||
public static final String PASSWORD_LETTERS_UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
public static final String PASSWORD_LETTERS_LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
|
||||
public static final String PASSWORD_DIGITS = "0123456789";
|
||||
public static final String PASSWORD_CHARACTERS = "~`!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?";
|
||||
public static final Integer REQUIRED_MIN_PASSWORD_LENGTH = 8;
|
||||
public static final Integer REQUIRED_MIN_LETTERS_NUMBER_EVERY_CASE_IN_PASSWORD = 1;
|
||||
public static final Integer REQUIRED_MIN_DIGITS_NUMBER_IN_PASSWORD = 1;
|
||||
public static final Integer REQUIRED_MIN_CHARACTERS_NUMBER_IN_PASSWORD = 1;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.posthub.gateway.model.constants;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public enum ApiErrorMessage {
|
||||
|
||||
USERNAME_ALREADY_EXISTS("Username: %s already exists"),
|
||||
EMAIL_ALREADY_EXISTS("Email: %s already exists"),
|
||||
INVALID_USER_OR_PASSWORD("Invalid email or password. Try again"),
|
||||
NOT_FOUND_REFRESH_TOKEN("Refresh token not found"),
|
||||
MISMATCH_PASSWORDS("Password does not match"),
|
||||
INVALID_PASSWORD("Invalid password. It must have: "
|
||||
+ "length at least " + ApiConstants.REQUIRED_MIN_PASSWORD_LENGTH + ", including "
|
||||
+ ApiConstants.REQUIRED_MIN_LETTERS_NUMBER_EVERY_CASE_IN_PASSWORD + " letter(s) in upper and lower cases, "
|
||||
+ ApiConstants.REQUIRED_MIN_CHARACTERS_NUMBER_IN_PASSWORD + " character(s), "
|
||||
+ ApiConstants.REQUIRED_MIN_DIGITS_NUMBER_IN_PASSWORD + " digit(s). "),
|
||||
ACCOUNT_NOT_ACTIVE("Account is not active"),
|
||||
;
|
||||
|
||||
private final String message;
|
||||
|
||||
public String getMessage(Object... args) {
|
||||
return String.format(message, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.posthub.gateway.model.entity;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Table("refresh_token")
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
public class RefreshToken {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String token;
|
||||
|
||||
private LocalDateTime created;
|
||||
|
||||
@Column("session_id")
|
||||
private String sessionId;
|
||||
|
||||
@Column("user_id")
|
||||
private Integer userId;
|
||||
}
|
||||
@@ -1,18 +1,19 @@
|
||||
package com.posthub.gateway.model.request;
|
||||
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class LoginUserRequest {
|
||||
public class LoginRequest {
|
||||
|
||||
@NotBlank
|
||||
@Email
|
||||
@NotNull
|
||||
private String email;
|
||||
|
||||
@NotBlank
|
||||
@NotEmpty
|
||||
private String password;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.posthub.gateway.model.response;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class JwtResponse {
|
||||
|
||||
private String token;
|
||||
private String refreshToken;
|
||||
private String email;
|
||||
private String username;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.posthub.gateway.model.response;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class RagResponse<P> {
|
||||
|
||||
private String message;
|
||||
private P payload;
|
||||
private boolean success;
|
||||
|
||||
public static <P> RagResponse<P> createSuccessful(P payload) {
|
||||
return new RagResponse<>("", payload, true);
|
||||
}
|
||||
|
||||
public static <P> RagResponse<P> createSuccessfulWithNewToken(P payload) {
|
||||
return new RagResponse<>("Token created or updated", payload, true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.posthub.gateway.model.response;
|
||||
|
||||
import com.posthub.gateway.model.enums.RegistrationStatus;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@AllArgsConstructor
|
||||
public class UserProfileDTO {
|
||||
|
||||
private Integer id;
|
||||
private String username;
|
||||
private String email;
|
||||
private RegistrationStatus registrationStatus;
|
||||
private LocalDateTime lastLogin;
|
||||
private String token;
|
||||
private String refreshToken;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.posthub.gateway.repository;
|
||||
|
||||
import com.posthub.gateway.model.entity.RefreshToken;
|
||||
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public interface RefreshTokenRepository extends ReactiveCrudRepository<RefreshToken, Integer> {
|
||||
|
||||
Mono<RefreshToken> findByToken(String token);
|
||||
|
||||
Mono<RefreshToken> findByUserId(Integer userId);
|
||||
}
|
||||
@@ -1,13 +1,18 @@
|
||||
package com.posthub.gateway.service;
|
||||
|
||||
import com.posthub.gateway.model.constants.ApiErrorMessage;
|
||||
import com.posthub.gateway.model.entity.RefreshToken;
|
||||
import com.posthub.gateway.model.entity.User;
|
||||
import com.posthub.gateway.model.enums.RegistrationStatus;
|
||||
import com.posthub.gateway.model.enums.UserRole;
|
||||
import com.posthub.gateway.model.request.LoginUserRequest;
|
||||
import com.posthub.gateway.model.request.LoginRequest;
|
||||
import com.posthub.gateway.model.request.RegistrationUserRequest;
|
||||
import com.posthub.gateway.model.response.JwtResponse;
|
||||
import com.posthub.gateway.model.response.RagResponse;
|
||||
import com.posthub.gateway.model.response.UserProfileDTO;
|
||||
import com.posthub.gateway.repository.RefreshTokenRepository;
|
||||
import com.posthub.gateway.repository.UserRepository;
|
||||
import com.posthub.gateway.security.JwtTokenProvider;
|
||||
import com.posthub.gateway.util.PasswordUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
@@ -25,84 +30,117 @@ import java.util.UUID;
|
||||
public class AuthService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final RefreshTokenRepository refreshTokenRepository;
|
||||
private final JwtTokenProvider jwtTokenProvider;
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
|
||||
public Mono<JwtResponse> register(RegistrationUserRequest request) {
|
||||
if (!request.getPassword().equals(request.getConfirmPassword())) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, "Passwords do not match"));
|
||||
}
|
||||
|
||||
return userRepository.existsByEmail(request.getEmail())
|
||||
.flatMap(exists -> {
|
||||
if (exists) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.CONFLICT, "Email already registered"));
|
||||
}
|
||||
|
||||
User user = new User();
|
||||
user.setUsername(request.getUsername());
|
||||
user.setEmail(request.getEmail());
|
||||
user.setPassword(passwordEncoder.encode(request.getPassword()));
|
||||
user.setRegistrationStatus(RegistrationStatus.ACTIVE);
|
||||
user.setRole(UserRole.USER);
|
||||
user.setCreated(LocalDateTime.now());
|
||||
user.setUpdated(LocalDateTime.now());
|
||||
user.setDeleted(false);
|
||||
|
||||
return userRepository.save(user);
|
||||
})
|
||||
.map(savedUser -> {
|
||||
String sessionId = UUID.randomUUID().toString();
|
||||
String token = jwtTokenProvider.generateToken(savedUser, sessionId);
|
||||
String refreshToken = jwtTokenProvider.refreshToken(token);
|
||||
log.info("User registered: {}", savedUser.getEmail());
|
||||
return new JwtResponse(token, refreshToken, savedUser.getEmail(), savedUser.getUsername());
|
||||
});
|
||||
}
|
||||
|
||||
public Mono<JwtResponse> login(LoginUserRequest request) {
|
||||
public Mono<RagResponse<UserProfileDTO>> login(LoginRequest request) {
|
||||
return userRepository.findByEmail(request.getEmail())
|
||||
.switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid credentials")))
|
||||
.switchIfEmpty(Mono.error(new ResponseStatusException(
|
||||
HttpStatus.UNAUTHORIZED, ApiErrorMessage.INVALID_USER_OR_PASSWORD.getMessage())))
|
||||
.flatMap(user -> {
|
||||
if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid credentials"));
|
||||
return Mono.error(new ResponseStatusException(
|
||||
HttpStatus.UNAUTHORIZED, ApiErrorMessage.INVALID_USER_OR_PASSWORD.getMessage()));
|
||||
}
|
||||
if (user.getRegistrationStatus() != RegistrationStatus.ACTIVE) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.FORBIDDEN, "Account is not active"));
|
||||
return Mono.error(new ResponseStatusException(
|
||||
HttpStatus.FORBIDDEN, ApiErrorMessage.ACCOUNT_NOT_ACTIVE.getMessage()));
|
||||
}
|
||||
|
||||
user.setLastLogin(LocalDateTime.now());
|
||||
user.setUpdated(LocalDateTime.now());
|
||||
|
||||
return userRepository.save(user);
|
||||
})
|
||||
.map(user -> {
|
||||
String sessionId = UUID.randomUUID().toString();
|
||||
String token = jwtTokenProvider.generateToken(user, sessionId);
|
||||
String refreshToken = jwtTokenProvider.refreshToken(token);
|
||||
log.info("User logged in: {}", user.getEmail());
|
||||
return new JwtResponse(token, refreshToken, user.getEmail(), user.getUsername());
|
||||
.flatMap(this::generateTokensAndBuildResponse);
|
||||
}
|
||||
|
||||
public Mono<RagResponse<UserProfileDTO>> register(RegistrationUserRequest request) {
|
||||
if (!request.getPassword().equals(request.getConfirmPassword())) {
|
||||
return Mono.error(new ResponseStatusException(
|
||||
HttpStatus.BAD_REQUEST, ApiErrorMessage.MISMATCH_PASSWORDS.getMessage()));
|
||||
}
|
||||
if (PasswordUtils.isNotValidPassword(request.getPassword())) {
|
||||
return Mono.error(new ResponseStatusException(
|
||||
HttpStatus.BAD_REQUEST, ApiErrorMessage.INVALID_PASSWORD.getMessage()));
|
||||
}
|
||||
|
||||
return userRepository.findByUsername(request.getUsername())
|
||||
.flatMap(existing -> Mono.<User>error(new ResponseStatusException(
|
||||
HttpStatus.CONFLICT, ApiErrorMessage.USERNAME_ALREADY_EXISTS.getMessage(request.getUsername()))))
|
||||
.switchIfEmpty(userRepository.existsByEmail(request.getEmail())
|
||||
.flatMap(exists -> {
|
||||
if (exists) {
|
||||
return Mono.<User>error(new ResponseStatusException(
|
||||
HttpStatus.CONFLICT, ApiErrorMessage.EMAIL_ALREADY_EXISTS.getMessage(request.getEmail())));
|
||||
}
|
||||
User user = new User();
|
||||
user.setUsername(request.getUsername());
|
||||
user.setEmail(request.getEmail());
|
||||
user.setPassword(passwordEncoder.encode(request.getPassword()));
|
||||
user.setRegistrationStatus(RegistrationStatus.ACTIVE);
|
||||
user.setRole(UserRole.USER);
|
||||
user.setCreated(LocalDateTime.now());
|
||||
user.setUpdated(LocalDateTime.now());
|
||||
user.setDeleted(false);
|
||||
return userRepository.save(user);
|
||||
}))
|
||||
.flatMap(this::generateTokensAndBuildResponse);
|
||||
}
|
||||
|
||||
public Mono<RagResponse<UserProfileDTO>> refreshAccessToken(String refreshTokenValue) {
|
||||
return refreshTokenRepository.findByToken(refreshTokenValue)
|
||||
.switchIfEmpty(Mono.error(new ResponseStatusException(
|
||||
HttpStatus.UNAUTHORIZED, ApiErrorMessage.NOT_FOUND_REFRESH_TOKEN.getMessage())))
|
||||
.flatMap(refreshToken -> {
|
||||
refreshToken.setCreated(LocalDateTime.now());
|
||||
refreshToken.setToken(generateUuid());
|
||||
return refreshTokenRepository.save(refreshToken)
|
||||
.flatMap(saved -> userRepository.findById(saved.getUserId())
|
||||
.flatMap(user -> {
|
||||
String accessToken = jwtTokenProvider.generateToken(user, saved.getSessionId());
|
||||
UserProfileDTO dto = toUserProfileDto(user, accessToken, saved.getToken());
|
||||
return Mono.just(RagResponse.createSuccessfulWithNewToken(dto));
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
public Mono<JwtResponse> refreshToken(String authHeader) {
|
||||
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Missing or invalid Authorization header"));
|
||||
}
|
||||
|
||||
String token = authHeader.substring(7);
|
||||
if (!jwtTokenProvider.validateToken(token)) {
|
||||
return Mono.error(new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid or expired token"));
|
||||
}
|
||||
|
||||
String email = jwtTokenProvider.getUserEmail(token);
|
||||
return userRepository.findByEmail(email)
|
||||
.switchIfEmpty(Mono.error(new ResponseStatusException(HttpStatus.UNAUTHORIZED, "User not found")))
|
||||
.map(user -> {
|
||||
String sessionId = jwtTokenProvider.getSessionId(token);
|
||||
String newToken = jwtTokenProvider.generateToken(user, sessionId);
|
||||
String newRefreshToken = jwtTokenProvider.refreshToken(newToken);
|
||||
return new JwtResponse(newToken, newRefreshToken, user.getEmail(), user.getUsername());
|
||||
private Mono<RagResponse<UserProfileDTO>> generateTokensAndBuildResponse(User user) {
|
||||
return refreshTokenRepository.findByUserId(user.getId())
|
||||
.flatMap(existing -> {
|
||||
existing.setCreated(LocalDateTime.now());
|
||||
existing.setToken(generateUuid());
|
||||
existing.setSessionId(generateUuid());
|
||||
return refreshTokenRepository.save(existing);
|
||||
})
|
||||
.switchIfEmpty(Mono.defer(() -> {
|
||||
RefreshToken newToken = new RefreshToken();
|
||||
newToken.setUserId(user.getId());
|
||||
newToken.setCreated(LocalDateTime.now());
|
||||
newToken.setToken(generateUuid());
|
||||
newToken.setSessionId(generateUuid());
|
||||
return refreshTokenRepository.save(newToken);
|
||||
}))
|
||||
.map(refreshToken -> {
|
||||
String accessToken = jwtTokenProvider.generateToken(user, refreshToken.getSessionId());
|
||||
UserProfileDTO dto = toUserProfileDto(user, accessToken, refreshToken.getToken());
|
||||
log.info("Auth success for user: {}", user.getEmail());
|
||||
return RagResponse.createSuccessfulWithNewToken(dto);
|
||||
});
|
||||
}
|
||||
|
||||
private UserProfileDTO toUserProfileDto(User user, String token, String refreshToken) {
|
||||
return new UserProfileDTO(
|
||||
user.getId(),
|
||||
user.getUsername(),
|
||||
user.getEmail(),
|
||||
user.getRegistrationStatus(),
|
||||
user.getLastLogin(),
|
||||
token,
|
||||
refreshToken
|
||||
);
|
||||
}
|
||||
|
||||
private String generateUuid() {
|
||||
return UUID.randomUUID().toString().replace("-", "");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.posthub.gateway.util;
|
||||
|
||||
import com.posthub.gateway.model.constants.ApiConstants;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public final class PasswordUtils {
|
||||
|
||||
public static boolean isNotValidPassword(String password) {
|
||||
if (password == null || password.isEmpty() || password.trim().isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
String trim = password.trim();
|
||||
if (trim.length() < ApiConstants.REQUIRED_MIN_PASSWORD_LENGTH) {
|
||||
return true;
|
||||
}
|
||||
int charactersNumber = ApiConstants.REQUIRED_MIN_CHARACTERS_NUMBER_IN_PASSWORD;
|
||||
int lettersUCaseNumber = ApiConstants.REQUIRED_MIN_LETTERS_NUMBER_EVERY_CASE_IN_PASSWORD;
|
||||
int lettersLCaseNumber = ApiConstants.REQUIRED_MIN_LETTERS_NUMBER_EVERY_CASE_IN_PASSWORD;
|
||||
int digitsNumber = ApiConstants.REQUIRED_MIN_DIGITS_NUMBER_IN_PASSWORD;
|
||||
for (int i = 0; i < trim.length(); i++) {
|
||||
String currentLetter = String.valueOf(trim.charAt(i));
|
||||
if (!ApiConstants.PASSWORD_ALL_CHARACTERS.contains(currentLetter)) {
|
||||
return true;
|
||||
}
|
||||
charactersNumber -= ApiConstants.PASSWORD_CHARACTERS.contains(currentLetter) ? 1 : 0;
|
||||
lettersUCaseNumber -= ApiConstants.PASSWORD_LETTERS_UPPER_CASE.contains(currentLetter) ? 1 : 0;
|
||||
lettersLCaseNumber -= ApiConstants.PASSWORD_LETTERS_LOWER_CASE.contains(currentLetter) ? 1 : 0;
|
||||
digitsNumber -= ApiConstants.PASSWORD_DIGITS.contains(currentLetter) ? 1 : 0;
|
||||
}
|
||||
return ((charactersNumber > 0) || (lettersUCaseNumber > 0) || (lettersLCaseNumber > 0) || (digitsNumber > 0));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user