Spring 没有角色和权限的 Web 服务的安全性

Spring Security for web service without roles and authorities

我有一个基于 Spring Boot 构建的 REST Web 服务。对于身份验证,我使用 Spring 安全和基本身份验证,我是新手。我的解决方案必须使用角色和权限吗?

我只希望网络服务的用户提供用户名和密码凭据。我在数据库或其他地方没有任何用户。

在我的 WebSecurityConfigurerAdapter 配置中,我现在在 configureGlobal 方法的末尾有 .authorities("ROLE_USER");,遵循 Internet 上的示例。我想跳过那个,这样 class 看起来像这样:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("username").password(passwordEncoder().encode("password"));
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated().and().httpBasic();
    }

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

我发现我做不到。如果我改用 .roles("USER") ,我会工作。但是我不想处理权限和角色,只是一个用户名和一个密码。 为什么我需要这个或者我怎样才能跳过这个?

如果您能就此问题(身份验证和 Spring 安全性)向新手提供任何帮助,我将不胜感激。

如果您使用 inMemoryAuthentication,您通常会通过 roles("...")

提供角色

InMemoryAuthentication 不适用于 null 作为 GrantedAuthorities。所以不调用 roles(...) 会导致 BeanCreationException

但是没有什么能阻止您提供空列表...例如:

@Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {

    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("username")
                .password(passwordEncoder().encode("password"))
                .roles(); // <--- leave roles empty
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated().and().httpBasic();
    }

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

注意:不要认为您需要 @EnableWebSecurity 或使用 configureGlobal ...


或者您始终可以选择创建自己的自定义 AuthenticationProvider。

自定义 AuthenticationProvider 的配置:

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }

    @Bean
    public AuthenticationProvider authProvider() {
        return new CustomAuthenticationProvider();
    }