我正在尝试创建一个项目,以了解有关Spring Security的更多信息,并尝试遵循从安全筛选器链****-〉Authentication Manager-〉Authentication Provider-〉UserDetailsService*-〉****DB开始的流程
- 我一直引用的流程:**
- 我一直引用的流程:**
- 我的安全配置:**
@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
public class SecurityConfig{
DetailService userDetailService;
@Bean
public PasswordEncoder getPassWordEncoder() {
return new BCryptPasswordEncoder(15);
}
@Bean
DaoAuthenticationProvider authProvider(){
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailService);
authProvider.setPasswordEncoder(getPassWordEncoder());
return authProvider;
}
@Bean
public ProviderManager authManagerBean(HttpSecurity security) throws Exception {
return (ProviderManager) security.getSharedObject(AuthenticationManagerBuilder.class)
.authenticationProvider(authProvider()).
build();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/login/**", "/css/**", "/js/**", "/registration/**").permitAll()
.anyRequest().authenticated())
.csrf().disable()
.formLogin(form -> form.loginPage("/login")
.defaultSuccessUrl("/home")
.failureForwardUrl("/login-failure?error=true"))
.logout().permitAll();
return http.build();
}
}
- 控制器:**
@RequestMapping("/login.html")
public String login(@RequestBody UserDTO dto) {
Authentication authentication = authenticationManager.
authenticate(new UsernamePasswordAuthenticationToken(dto.getUsername(), dto.getPassword()));
return "/login.html";
}
根据我所读到的内容,身份验证/提供者管理器接收到一个authentication对象,该对象是从控制器处理的登录表单中的username&password凭据创建的。
这就是我在控制器中实现的功能。
- 问题:**
- 如何继续将从控制器创建的身份验证对象传递给提供程序管理器?(我知道这可能是错误的,但是)是否向Authentication类型的AuthenticationManager@bean添加另一个参数?
- 我在
ProviderManager
上也有点不稳定,这做得对吗?
非常感谢大家的阅读:)
1条答案
按热度按时间cbwuti441#
我在ProviderManager上也有点不稳定,这是否正确?
您可以自己创建一个
AuthenticationManager
,而不是依赖Spring Security内部组件来创建AuthenticationManager
(难以理解和调试),因为您没有使用Spring Security提供的任何开箱即用的身份验证机制。您可以将
ProviderManager
Bean更改为:或者,更好的是,因为您不会单独使用
AuthenticationProvider
bean,所以不要将其公开为bean,而是执行以下操作:我如何继续将这个从控制器创建的身份验证对象传递给提供者管理器?(我知道这可能是错误的,但是)我是否向Authentication类型的AuthenticationManager @bean添加另一个参数?
我想我没有明白你的意思,
Authentication
对象,在你的例子中,当你调用authenticationManager.authenticate(...)
时,UsernamePasswordAuthenticationToken
被传递给ProviderManager
。