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();
}
我有一个基于 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();
}