首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Spring Security按角色限制api功能

使用Spring Security按角色限制api功能
EN

Stack Overflow用户
提问于 2020-12-10 23:09:32
回答 1查看 89关注 0票数 0

我正在尝试在我的项目中实现SpringSecurity机制。我有两个角色:成员和管理员。成员和管理员都可以访问api更新用户,例如。会员只能更改名称,头像,管理员可以更改任何内容。我如何应用SpringSecurity概念来实现这一点呢?

EN

回答 1

Stack Overflow用户

发布于 2020-12-11 06:27:29

您需要从为两个不同的用户分别提供这些角色开始。例如,下面将提供用户memberadminin memory representation,口令分别为password

代码语言:javascript
运行
复制
@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都将被拒绝。

代码语言:javascript
运行
复制
@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使用MEMBERADMIN

代码语言:javascript
运行
复制
.mvcMatchers(HttpMethod.GET, "/user/address").hasAnyRole("MEMBER", "ADMIN")

另一种方法是为用户分配多个角色。例如,管理员用户可能具有角色MEMBERADMIN

代码语言:javascript
运行
复制
@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上只有一个角色。

代码语言:javascript
运行
复制
@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();
    }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65237113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档