Move to in memory
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
package com.wisemapping.config.rest;
|
||||
|
||||
import com.wisemapping.filter.JwtAuthenticationFilter;
|
||||
import com.wisemapping.rest.MindmapController;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
@@ -11,6 +13,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
|
||||
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
|
||||
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
|
||||
|
||||
@@ -21,6 +24,10 @@ import static org.springframework.security.config.Customizer.withDefaults;
|
||||
@Import({InterceptorsConfig.class})
|
||||
@EnableWebSecurity
|
||||
public class RestAppConfig {
|
||||
|
||||
@Autowired
|
||||
private JwtAuthenticationFilter jwtAuthenticationFilter;
|
||||
|
||||
@Bean
|
||||
MvcRequestMatcher.Builder mvc(HandlerMappingIntrospector introspector) {
|
||||
return new MvcRequestMatcher.Builder(introspector);
|
||||
@@ -30,6 +37,7 @@ public class RestAppConfig {
|
||||
SecurityFilterChain apiSecurityFilterChain(@NotNull final HttpSecurity http, @NotNull final MvcRequestMatcher.Builder mvc) throws Exception {
|
||||
return http
|
||||
.securityMatcher("/**")
|
||||
.addFilterAfter(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers(mvc.pattern("/api/restfull/users/")).permitAll()
|
||||
.requestMatchers(mvc.pattern("/api/restfull/authenticate")).permitAll()
|
||||
|
@@ -0,0 +1,64 @@
|
||||
package com.wisemapping.filter;
|
||||
|
||||
import com.wisemapping.security.JwtTokenUtil;
|
||||
import com.wisemapping.security.UserDetails;
|
||||
import com.wisemapping.security.UserDetailsService;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
@Autowired
|
||||
private UserDetailsService userDetailsService;
|
||||
|
||||
@Autowired
|
||||
private JwtTokenUtil jwtTokenUtil;
|
||||
|
||||
final private static Logger logger = LogManager.getLogger();
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain)
|
||||
throws ServletException, IOException {
|
||||
final String authorizationHeader = request.getHeader("Authorization");
|
||||
|
||||
String username = null;
|
||||
String jwtToken = null;
|
||||
|
||||
// Extract username from token ...
|
||||
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
|
||||
jwtToken = authorizationHeader.substring(7);
|
||||
try {
|
||||
username = jwtTokenUtil.extractFromJwtToken(jwtToken);
|
||||
} catch (Exception e) {
|
||||
// Handle token extraction/validation errors
|
||||
logger.debug("Error extracting username from token: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
|
||||
final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
|
||||
|
||||
if (jwtTokenUtil.validateJwtToken(jwtToken)) {
|
||||
final UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
|
||||
userDetails, null, userDetails.getAuthorities());
|
||||
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
||||
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
|
||||
}
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
}
|
@@ -21,8 +21,10 @@ package com.wisemapping.rest;
|
||||
import com.wisemapping.rest.model.RestJwtUser;
|
||||
import com.wisemapping.security.JwtTokenUtil;
|
||||
import com.wisemapping.security.UserDetailsService;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.authentication.BadCredentialsException;
|
||||
@@ -50,7 +52,7 @@ public class JwtAuthController {
|
||||
private JwtTokenUtil jwtTokenUtil;
|
||||
|
||||
@RequestMapping(value = "/authenticate", method = RequestMethod.POST)
|
||||
public ResponseEntity<?> createAuthenticationToken(@RequestBody RestJwtUser user) throws Exception {
|
||||
public ResponseEntity<?> createAuthenticationToken(@RequestBody RestJwtUser user, @NotNull HttpServletResponse response) throws Exception {
|
||||
|
||||
// Is a valid user ?
|
||||
authenticate(user.getUsername(), user.getPassword());
|
||||
@@ -60,6 +62,10 @@ public class JwtAuthController {
|
||||
.loadUserByUsername(user.getUsername());
|
||||
|
||||
final String token = jwtTokenUtil.generateJwtToken(userDetails);
|
||||
|
||||
// Add token in the header ...
|
||||
response.addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token);
|
||||
|
||||
return ResponseEntity.ok(token);
|
||||
}
|
||||
|
||||
|
@@ -37,12 +37,12 @@ public class JwtTokenUtil implements Serializable {
|
||||
return Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret));
|
||||
}
|
||||
|
||||
public String getUserNameFromJwtToken(String token) {
|
||||
public String extractFromJwtToken(String token) {
|
||||
return Jwts.parserBuilder().setSigningKey(key()).build()
|
||||
.parseClaimsJws(token).getBody().getSubject();
|
||||
}
|
||||
|
||||
public boolean validateJwtToken(String authToken) {
|
||||
public boolean validateJwtToken(@NotNull String authToken) {
|
||||
try {
|
||||
Jwts.parserBuilder().setSigningKey(key()).build().parse(authToken);
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user