54. Logging in and generating JWT (#5 Section 7: Generate JWT)
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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<HttpResponse> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user