Это мой класс SecurityConfig.
Код: Выделить всё
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final AuthenticationProvider authProvider;
private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Autowired
public SecurityConfig(AuthenticationProvider authProvider, JwtAuthenticationFilter jwtAuthenticationFilter) {
this.authProvider = authProvider;
this.jwtAuthenticationFilter = jwtAuthenticationFilter;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(authRequest ->
authRequest
.requestMatchers("/api/v1/auth/**").permitAll()
.requestMatchers("/api/v1/auth/contrasenia").hasAnyRole(
Role.ADMIN.name(), Role.EMPRESA.name(), Role.ESTUDIANTE.name()
)
.requestMatchers(HttpMethod.GET, "/api/v1/carreras/**").permitAll()
.requestMatchers(HttpMethod.POST, "/api/v1/carreras/**").hasRole(Role.ADMIN.name())
.anyRequest().authenticated()
)
.sessionManagement(sessionManager ->
sessionManager
.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
}
Код: Выделить всё
@GetMapping
public ResponseEntity getCarreras() {
return ResponseEntity.ok(carreraService.getCarreras());
}
// TODO: return 201
@PostMapping(consumes = "application/json")
public ResponseEntity postCarrera(@RequestBody CarreraRequest request) {
return ResponseEntity.ok(carreraService.postCarrera(request));
}
Код: Выделить всё
public String getToken(UserDetails user) {
HashMap claims = new HashMap();
String role = user.getAuthorities()
.stream()
.findFirst()
.map(GrantedAuthority::getAuthority)
.orElseThrow();
claims.put("role", role);
return getToken(claims, user);
}
private String getToken(HashMap map, UserDetails user) {
return Jwts.builder()
.claims(map)
.subject(user.getUsername())
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
.signWith(this.getKey(), Jwts.SIG.HS256)
.compact();
}
Код: Выделить всё
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtService jwtService;
private final UserDetailsService userDetailsService;
@Autowired
public JwtAuthenticationFilter(JwtService jwtService, @Qualifier("userDetailsService") UserDetailsService userDetailsService) {
this.jwtService = jwtService;
this.userDetailsService = userDetailsService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final String token = this.getTokenFromRequest(request);
final String username;
if (token == null) {
filterChain.doFilter(request, response);
return;
}
username = jwtService.getUsernameFromToken(token);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (jwtService.isTokenValid(token, userDetails)) {
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
userDetails,
null,
userDetails.getAuthorities()
);
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);
}
}
filterChain.doFilter(request, response);
}
private String getTokenFromRequest(HttpServletRequest request) {
final String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
return jwtService.getTokenFromAuthorizationHeader(authHeader).orElse(null);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ot-working
Мобильная версия