我是spring security 6的新手。当我尝试配置安全性时,我得到了这个错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 2 of constructor in com.security.Security.service.impl.AuthenticationServiceImpl required a bean of type 'org.springframework.security.authentication.AuthenticationManager' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.security.authentication.AuthenticationManager' in your configuration.
Process finished with exit code 1
字符串
我已经在配置文件中定义了bean,和方法来登录,注册。自从我添加了登录API,我得到了错误。
SecurityConfiguration类:
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfiguration{
@Autowired
public SecurityConfiguration(UserService userService, JWTAuthenticationFilter jwtAuthenticationFilter) {
this.userService = userService;
this.jwtAuthenticationFilter = jwtAuthenticationFilter;
}
private JWTAuthenticationFilter jwtAuthenticationFilter;
private final UserService userService;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(request -> request.requestMatchers("/api/v1/auth/**")
.permitAll()
.requestMatchers("/api/v1/admin").hasAnyAuthority(Role.ADMIN.name())
.requestMatchers("/api/v1/user").hasAnyAuthority(Role.USER.name())
.anyRequest().authenticated())
.sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider()).addFilterBefore(
jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class
);
return http.build();
}
@Bean
public AuthenticationProvider authenticationProvider(){
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userService.userDetailsService());
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
@Bean
protected PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception{
return config.getAuthenticationManager();
}
}
型
AuthenticationServiceImpl类:
@Service
@RequiredArgsConstructor
public class AuthenticationServiceImpl implements AuthenticationService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final AuthenticationManager authenticationManager;
private final JWTService jwtService;
public User signup(SignUpRequest signUpRequest){
User user = new User();
user.setEmail(signUpRequest.getEmail());
user.setName(signUpRequest.getName());
user.setRole(Role.USER);
user.setPassword(passwordEncoder.encode(signUpRequest.getPassword()));
return userRepository.save(user);
}
public JwtAuthenticationResponse signin(SignInRequest signInRequest){
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(signInRequest.getEmail(),signInRequest.getPassword()));
var user = userRepository.findByEmail(signInRequest.getEmail()).orElseThrow(()-> new IllegalArgumentException("Invalid email or password"));
var jwt = jwtService.generateToken(user);
var refreshToken = jwtService.generatefreshToken(new HashMap<>(),user);
JwtAuthenticationResponse jwtAuthenticationResponse = new JwtAuthenticationResponse();
jwtAuthenticationResponse.setToken(jwt);
jwtAuthenticationResponse.setRefreshToken(refreshToken);
return jwtAuthenticationResponse;
}
}
型
我怎样才能正确定义bean?我的代码中有什么错误?有人能解释一下中的参数吗?
1条答案
按热度按时间efzxgjgh1#
在安全配置类中为AuthenticationManager添加Bean注解:
字符串
也许有用;有了@ RightRedArgsConstructor,你就不再需要为SecurityConfiguration类定义一个构造函数了。如果没有:
型