diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/config/SecurityConfig.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/config/SecurityConfig.java index 0fdba14..2265f53 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/config/SecurityConfig.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/config/SecurityConfig.java @@ -5,6 +5,8 @@ import net.shyshkin.study.fullstack.supportportal.backend.filter.JwtAccessDenied import net.shyshkin.study.fullstack.supportportal.backend.filter.JwtAuthenticationEntryPoint; import net.shyshkin.study.fullstack.supportportal.backend.filter.JwtAuthorizationFilter; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -55,4 +57,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder); } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + } diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java index 1a696ae..49e11e9 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java @@ -1,16 +1,29 @@ package net.shyshkin.study.fullstack.supportportal.backend.controller; import lombok.RequiredArgsConstructor; +import net.shyshkin.study.fullstack.supportportal.backend.constant.SecurityConstants; +import net.shyshkin.study.fullstack.supportportal.backend.domain.HttpResponse; import net.shyshkin.study.fullstack.supportportal.backend.domain.User; import net.shyshkin.study.fullstack.supportportal.backend.service.UserService; +import net.shyshkin.study.fullstack.supportportal.backend.utility.JwtTokenProvider; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; +import static org.springframework.http.HttpStatus.OK; + + @RestController @RequestMapping("user") @RequiredArgsConstructor public class UserResource { private final UserService userService; + private final AuthenticationManager authenticationManager; + private final JwtTokenProvider jwtTokenProvider; @GetMapping("home") public String showUser() { @@ -21,4 +34,28 @@ public class UserResource { public User register(@RequestBody User user) { return userService.register(user.getFirstName(), user.getLastName(), user.getUsername(), user.getEmail()); } + + @PostMapping("login") + public ResponseEntity login(@RequestBody User user) { + + authenticate(user.getUsername(), user.getPassword()); + UserDetails userDetails = userService.loadUserByUsername(user.getUsername()); + + HttpResponse httpResponse = HttpResponse.builder() + .httpStatus(OK) + .reason(OK.getReasonPhrase().toUpperCase()) + .message("User logged in successfully") + .httpStatusCode(OK.value()) + .build(); + + return ResponseEntity.ok() + .header(SecurityConstants.JWT_TOKEN_HEADER, jwtTokenProvider.generateJwtToken(userDetails)) + .body(httpResponse); + } + + private void authenticate(String username, String password) { + Authentication auth = new UsernamePasswordAuthenticationToken(username, password); + authenticationManager.authenticate(auth); + } + } diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/utility/JwtTokenProvider.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/utility/JwtTokenProvider.java index 99db12e..8512b65 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/utility/JwtTokenProvider.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/utility/JwtTokenProvider.java @@ -5,13 +5,13 @@ import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import lombok.RequiredArgsConstructor; -import net.shyshkin.study.fullstack.supportportal.backend.domain.UserPrincipal; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Service; @@ -32,13 +32,13 @@ public class JwtTokenProvider { @Value("${app.jwt.secret}") private String secret; - public String generateJwtToken(UserPrincipal userPrincipal) { - String[] claims = getClaimsFromUser(userPrincipal); + public String generateJwtToken(UserDetails userDetails) { + String[] claims = getClaimsFromUser(userDetails); return JWT.create() .withIssuer(GET_ARRAYS_LLC) .withAudience(GET_ARRAYS_ADMINISTRATION) .withIssuedAt(new Date()) - .withSubject(userPrincipal.getUsername()) + .withSubject(userDetails.getUsername()) .withArrayClaim(AUTHORITIES, claims) .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .sign(Algorithm.HMAC512(secret)); @@ -81,8 +81,8 @@ public class JwtTokenProvider { } } - private String[] getClaimsFromUser(UserPrincipal userPrincipal) { - return userPrincipal.getAuthorities() + private String[] getClaimsFromUser(UserDetails userDetails) { + return userDetails.getAuthorities() .stream() .map(GrantedAuthority::getAuthority) .toArray(String[]::new);