Spring Security 使用5:角色继承

原创
2021/02/07 00:16
阅读数 465

之前的文章中,各个角色之间不具备任何关系,但一般来说角色之前是有关系的,例如 ROLE_admin 一般既有 admin 的权限,又具有 user 的权限。下面介绍如何配置这种角色之间相互继承的关系。

 

1、配置角色关系

要配置角色继承关系,只需在 Spring Security 的配置类中提供一个 RoleHierarchy 即可。下面高亮代码含义:

  • ROLE_dba 拥有所有的权限
  • ROLE_admin 具有 ROLE_user 的权限
  • ROLE_user 则是一个公共角色
@Configuration
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    // 指定密码的加密方式
    @SuppressWarnings("deprecation")
    @Bean
    PasswordEncoder passwordEncoder(){
        // 不对密码进行加密
        return NoOpPasswordEncoder.getInstance();
    }
 
    // 配置用户及其对应的角色
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("root").password("123").roles("DBA")
                .and()
                .withUser("admin").password("123").roles("ADMIN")
                .and()
                .withUser("hangge").password("123").roles("USER");
    }
 
    // 配置角色继承关系
    @Bean
    RoleHierarchy roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        String hierarchy = "ROLE_DBA > ROLE_ADMIN > ROLE_USER";
        roleHierarchy.setHierarchy(hierarchy);
        return roleHierarchy;
    }
 
    // 配置 URL 访问权限
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests() // 开启 HttpSecurity 配置
            .antMatchers("/db/**").hasRole("DBA") // db/** 模式URL需DBA角色
            .antMatchers("/admin/**").hasRole("ADMIN") // admin/** 模式URL需ADMIN角色
            .antMatchers("/user/**").hasRole("USER") // user/** 模式URL需USER角色
            .anyRequest().authenticated() // 用户访问其它URL都必须认证后访问(登录后访问)
            .and().formLogin().loginProcessingUrl("/login").permitAll() // 开启表单登录并配置登录接口
            .and().csrf().disable(); // 关闭csrf
    }
}

 

2、运行测试 

启动项目,我们使用 admin 用户进行登录,由于该用户同时具有 USER 角色权限,所以登录后可以访问 /user/hello 这个接口。

而由于 /db/hello 接口需要 DBA 角色,因此 admin 用户仍然无法访问。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部