使用spring-security-web 6.1.5将AuthenticationManager添加到SecurityConfig

des4xlb0  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(117)

我正在尝试创建一个具有User的应用程序,该应用程序可以被分配Tasks。我正在使用Spring Security对应用程序进行身份验证。为了避免混淆,我将SpringSecurity用户表重命名为app_users
1.我的users表和app_users不同。我的users表只存储任务用户数据的Map<--->。app_users是sprint安全表。

  • 我对AuthManagers/UserDetailsService/SecurityConfig感到困惑。
  • 我想做的是-我的users表不会有任何行。在app_users中只有一个用户admin,并且用户将拥有ROLE_ADMIN权限。
  • 因此,使用此admin用户,我将尝试创建用户-api/v1/signup POST
  • 我在配置AuthenticationManager时遇到问题。SecurityConfig看起来像-
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final UserDetailsServiceImpl userDetailsService;
    private final JwtTokenProvider jwtProvider;

    @Autowired
    protected SecurityConfig(UserDetailsServiceImpl userDetailsService, JwtTokenProvider jwtProvider) {
        this.userDetailsService = userDetailsService;
        this.jwtProvider = jwtProvider;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((auth) -> auth
                        .requestMatchers("/api/v1/signup").permitAll()
                        .requestMatchers("/api/v1/login").permitAll()
                        .requestMatchers("/api/admin/**").hasRole("ADMIN")
                        .requestMatchers("/api/user/**").hasRole("USER")
                        .anyRequest().authenticated()
                );
        return http.build();
    }

    @Bean
    public AuthenticationManager configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
        return auth.build();
    }

}

字符串
AuthenticationManager configure(AuthenticationManagerBuilder auth)已被弃用。如何使用spring-security-web 6.1.5配置AuthManager?
这是我的GitHub仓库-https://github.com/yadavvi91/taskscheduler
随意给予给予任何其他意见的项目及其设计。

TLDR关于我的项目-

  • dockercompose.yml for postgres+redis+springbootapp
  • openapi.yml用于合约优先开发
  • 用于表users、tasks、task_status的flyway脚本
  • SecurityConfig用于基于JWT令牌的身份验证。令牌存储在Redis中。除了以JWT格式发送之外,它们没有太多信息。
4uqofj5v

4uqofj5v1#

正如评论中所建议的,尝试:

@Bean
public AuthenticationManager authenticationManager(
        UserDetailsService userDetailsService,
        PasswordEncoder passwordEncoder) {
    var provider = new DaoAuthenticationProvider();
    provider.setUserDetailsService(userDetailsService);
    provider.setPasswordEncoder(passwordEncoder);

    return new ProviderManager(authenticationProvider);
}

字符串
另一种可能性(在阅读https://www.baeldung.com/spring-security-multiple-auth-providers之后,我成功地使用了它):

@Bean
public AuthenticationManager configure(HttpSecurity http,
                                       PasswordEncoder passwordEncoder) throws Exception {
    return http.getSharedObject(AuthenticationManagerBuilder.class)
               .userDetailsService(userDetailsService).passwordEncoder(passwordEncoder)
               .build();
}

相关问题