Spring安全6.0 Dao认证

atmip9wb  于 2022-12-23  发布在  Spring
关注(0)|答案(1)|浏览(181)

我正在尝试创建一个项目,以了解有关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上也有点不稳定,这做得对吗?

非常感谢大家的阅读:)

cbwuti44

cbwuti441#

我在ProviderManager上也有点不稳定,这是否正确?
您可以自己创建一个AuthenticationManager,而不是依赖Spring Security内部组件来创建AuthenticationManager(难以理解和调试),因为您没有使用Spring Security提供的任何开箱即用的身份验证机制。
您可以将ProviderManager Bean更改为:

@Bean
public ProviderManager authManagerBean(AuthenticationProvider provider) {
    return new ProviderManager(provider);
}

或者,更好的是,因为您不会单独使用AuthenticationProvider bean,所以不要将其公开为bean,而是执行以下操作:

@Bean
public AuthenticationManager authenticationManager(){
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailService);
    authProvider.setPasswordEncoder(getPassWordEncoder());
    return new ProviderManager(authProvider);
}

我如何继续将这个从控制器创建的身份验证对象传递给提供者管理器?(我知道这可能是错误的,但是)我是否向Authentication类型的AuthenticationManager @bean添加另一个参数?
我想我没有明白你的意思,Authentication对象,在你的例子中,当你调用authenticationManager.authenticate(...)时,UsernamePasswordAuthenticationToken被传递给ProviderManager

相关问题