java—使用Spring Security 按角色限制api函数

zi8p0yeb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(282)

我正在尝试在我的项目上实现springsecurity机制。我有两个角色:成员和管理员。例如,成员和管理员都可以访问api update user。会员只能更改姓名,头像,管理员可以更改任何东西。如何应用springsecurity概念来实现这一点?

wz3gfoph

wz3gfoph1#

首先,您需要为两个不同的用户分别提供这些角色。例如,下面将提供用户的内存表示 member 以及 admin 每个人都有密码 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);
}

现在您可以设置授权规则。对于希望其中一个角色工作的URL,可以使用 hasAnyRole(...) 对于URL,您只希望与您可以使用的管理员一起工作 hasRole(...) . 例如,下面的命令允许任何一个用户使用url /user/name 或者 /user/avatar 但是管理员可以做任何以 /user/** . 拒绝所有其他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();
    }
}

需要注意的是,只有第一条规则将用于授权。那么一会儿呢 /user/name 符合规则 /user/name , /user/**' (starts with /用户/ ), and anyrequest() only the first rule of hasanyrole(“成员”,“管理员”)将被使用。 您还可以设置利用http方法的规则。例如,以下允许MEMBER或者ADMIN为http上/user/address` ```
.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();
}

}

当你有很多角色需要考虑时,这种方法可能更可取。每个操作都是一个角色,但用户可能有多个角色。

相关问题