没有角色和权限的 Web 服务的 Spring Security [关闭]

Posted

技术标签:

【中文标题】没有角色和权限的 Web 服务的 Spring Security [关闭]【英文标题】:Spring Security for web service without roles and authorities [closed] 【发布时间】:2020-06-01 13:55:58 【问题描述】:

我有一个基于 Spring Boot 构建的 REST Web 服务。对于身份验证,我使用 Spring Security 和 Basic Authentication,我对此并不陌生。我的解决方案是否必须使用角色和权限?

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

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

@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 Security)向新手提供任何启示。

【问题讨论】:

Spring Security Reference 是开始阅读该主题的好地方。使用 Spring Boot,您只需要 dependency 而这个 example 将有助于满足您的要求。 【参考方案1】:

如果您使用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();
    

【讨论】:

以上是关于没有角色和权限的 Web 服务的 Spring Security [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Security

Spring 基于角色的身份验证微服务应用程序

Spring 安全切换到 Ldap 身份验证和数据库权限

资源服务器上的 Spring Boot OAuth2 自定义角色

security权限控制

看源码,重新审视Spring Security中的角色(roles)是怎么回事