我正在尝试在我的项目中实现SpringSecurity机制。我有两个角色:成员和管理员。成员和管理员都可以访问api更新用户,例如。会员只能更改名称,头像,管理员可以更改任何内容。我如何应用SpringSecurity概念来实现这一点呢?
发布于 2020-12-11 06:27:29
您需要从为两个不同的用户分别提供这些角色开始。例如,下面将提供用户member
和admin
的in memory representation,口令分别为password
@Bean
static InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("member")
.password("password")
.roles("MEMBER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("password")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
现在您可以设置authorization rules了。对于您希望任一角色都能工作的URL,您可以使用hasAnyRole(...)
,而对于您只想与管理员一起工作的URL,您可以使用hasRole(...)
。例如,下面的代码允许用户使用URL /user/name
或/user/avatar
,但管理员可以使用任何以/user/**
开头的URL。所有其他URL都将被拒绝。
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.mvcMatchers("/user/name", "/user/avatar").hasAnyRole("MEMBER", "ADMIN")
.mvcMatchers("/user/**").hasRole("ADMIN")
.anyRequest().denyAll()
.and()
.formLogin();
}
}
重要的是要注意,只有第一个规则将用于授权。因此,当用户与规则管理员匹配时,将使用anyRequest()only the first rule of
hasAnyRole("MEMBER",/ /user/name
/ /user/name
/user/**' (starts with
“), and
”)`。
您还可以设置利用HTTP方法的规则。例如,以下命令将允许对/user/address
上的HTTP GET使用MEMBER
或ADMIN
.mvcMatchers(HttpMethod.GET, "/user/address").hasAnyRole("MEMBER", "ADMIN")
另一种方法是为用户分配多个角色。例如,管理员用户可能具有角色MEMBER
和ADMIN
。
@Bean
static InMemoryUserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("member")
.password("password")
.roles("MEMBER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("password")
.roles("ADMIN", "MEMBER")
.build();
return new InMemoryUserDetailsManager(user);
}
然后,您的规则可以简化为在URL上只有一个角色。
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.mvcMatchers("/user/name", "/user/avatar").hasRole("MEMBER")
.mvcMatchers("/user/**").hasRole("ADMIN")
.anyRequest().denyAll()
.and()
.formLogin();
}
}
当您有很多角色要考虑时,这种方法可能更可取。每个操作都是单个角色,但用户可以有多个角色。
https://stackoverflow.com/questions/65237113
复制相似问题