我正在尝试连接jwt令牌到我的项目,在工作中我遇到了一些问题。我已经按照指令提到的here,但我有错误。我试图修复它与相同的问题,从these guys,但它不为我工作。我想,我错过了一些东西。
有人能帮我吗,谢谢。
错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 1 of constructor in com.example.demo.security.WebSecurity required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' in your configuration.
网络安全.java
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
private AppUserDetailsService appUserDetailsService;
private BCryptPasswordEncoder bCryptPasswordEncoder;
public WebSecurity(AppUserDetailsService appUserDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) {
this.appUserDetailsService = appUserDetailsService;
this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable().authorizeRequests()
.antMatchers(HttpMethod.POST).permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JWTAuthenticationFilter(authenticationManager()))
.addFilter(new JWTAuthorizationFilter(authenticationManager()))
// this disables session creation on Spring Security
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.csrf().disable();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(appUserDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
return source;
}
}
应用程序用户详细信息服务.java
@Service
public class AppUserDetailsService implements UserDetailsService {
private UserRepository userRepository;
public AppUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Users user = userRepository.findByUsername(username);
if (user == null)
throw new UsernameNotFoundException(username);
return new User(user.getUsername(), user.getPassword(), emptyList());
}
}
JWTA验证过滤器.java
public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Autowired
private AuthenticationManager authenticationManager;
public JWTAuthenticationFilter (AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication (HttpServletRequest req, HttpServletResponse res) {
try {
Users creds = new ObjectMapper().readValue(req.getInputStream(), Users.class);
return authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
creds.getUsername(),
creds.getPassword(),
new ArrayList<>())
);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void successfulAuthentication(HttpServletRequest req,
HttpServletResponse res,
FilterChain chain,
Authentication auth) throws IOException, ServletException {
String token = JWT.create()
.withSubject(((User) auth.getPrincipal()).getUsername())
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.sign(HMAC512(SECRET.getBytes()));
res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
}
}
2条答案
按热度按时间lvjbypge1#
将此@Bean添加到您的WebSecurity配置中:
此外,请从建构函式中移除BCryptPasswordEncoder,包括字段。
gpnt7bae2#
将此添加到安全包
对我有用