我正在尝试在我的项目中实现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 ofhasAnyRole("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
复制相似问题