Я выполнил около 5 учебных пособий по созданию JWT в загрузке Spring, но безуспешно. В этом всегда что-то не так, что-то не хватает, какие-то переломные изменения, какие-то быки. Я только начал изучать Java - это разочаровывающий опыт, в основном из-за инструментов, обеспечивающих поддержку Java-разработки;IDE, JDK и т. Д., А также Java Security.
После поисков в течение нескольких часов я обнаружил, что ошибка «AuthenticationManager» не может быть введена. Я решил проблему. Теперь мои маршруты сводят с ума, я даже не могу определить проблему.
с почтальоном. Я выполняю 8080 / привет и получаю 404 (маршрут определен, как вы можете видеть). Я отправляю сообщение на localhost: 8080 / api / authenticate / bla, в котором говорится, что статус 500, jwt нетнайдено (маршрут не существует)
Вот код
Это мой контроллер
@RestController
public class LoginController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtUtil jwtTokenUtil;
@Autowired
private MyUserDetailsService userDetailsService;
@GetMapping("/hello")
public String hello(){
return "Hello World";
}
@RequestMapping(value = "/authenticate", method= RequestMethod.POST)
public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) throws Exception{
try{
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(authenticationRequest.getUsername(), authenticationRequest.getPassword() ));
}catch(BadCredentialsException ex){
throw new Exception("Nome de usuário ou senha incorretos", ex);
}
final UserDetails userDetails = userDetailsService.
loadUserByUsername(authenticationRequest.getUsername());
final String jwt = jwtTokenUtil.generateToken(userDetails);
return ResponseEntity.ok(new AuthenticationResponse(jwt));
}
}
Мой фильтр
public class JwtRequestFilter extends OncePerRequestFilter {
@Autowired
private MyUserDetailsService userDetailsService;
@Autowired
private JwtUtil jwtUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final String authorizationHeader = request.getHeader("Authorization");
String username = null;
String jwt = null;
if(authorizationHeader != null && authorizationHeader.startsWith("Bearer ")){
jwt = authorizationHeader.substring(7);
username = jwtUtil.extractUsername(jwt);
}
if(username != null && SecurityContextHolder.getContext().getAuthentication() == null){
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if(jwtUtil.validateToken(jwt, userDetails)){
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken
.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}
filterChain.doFilter(request, response);
}
}
МойWebSecurityConfigurer
@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter{
@Autowired
private MyUserDetailsService myUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserDetailsService); //To change body of generated methods, choose Tools | Templates.
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().antMatchers("/authenticate")
.permitAll().anyRequest().authenticated().and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
@Bean(name = BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
Если требуется больше кода, пожалуйста, спросите меня.