2.springsecurity——授权

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.springsecurity——授权相关的知识,希望对你有一定的参考价值。

2.springsecurity——授权

1.授权概念

所谓的授权,就是用户如果要访问某一个资源,我们要去检查用户是否具备这样的权限,如果具备就允许访问,如果不具备,则不允许访问。

2.案例

本案例较为简单,没有从数据库中获取,着重关注授权相关的内容!

1.首先准备测试需要的用户

 @Override //配置用户相关
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication() //基于内存的认证
        .withUser("王泽").password("123456").roles("user").and()
                .withUser("wangze").password("123456").roles("admin");

    }

由于 Spring Security 支持多种数据源,例如内存、数据库、LDAP 等,这些不同来源的数据被共同封装成了一个 UserDetailService 接口,任何实现了该接口的对象都可以作为认证数据源。

因此我们还可以通过重写 WebSecurityConfigurerAdapter 中的 userDetailsService 方法来提供一个 UserDetailService 实例进而配置多个用户:

@Bean
protected UserDetailsService userDetailsService() {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername("wangze").password("123456").roles("admin").build());
    manager.createUser(User.withUsername("王泽").password("123456").roles("user").build());
    return manager;
}

两种基于内存定义用户的方法,大家任选一个。

2.准备测试接口

@RestController
public class IndexController {
    @GetMapping("/hello")
    public String hello(){
        return "hello security!!";
    }

    @GetMapping("/admin/hello")
    public String admin(){
        return "hello admin!!";
    }

    @GetMapping("/user/hello")
    public String user(){
        return "hello user!!";
    }

}

  • /hello :只要登录就能访问
  • /admin/hello :admin身份的可以访问
  • /user/hello :具有user身份的可以访问
  • 所有user能访问的资源,admin都能访问

3.配置权限的拦截规则

 http.authorizeRequests() //开启配置
        .antMatchers("/admin/**").hasRole("admin")//具备某个角色
        .antMatchers("/user/**").hasAnyRole("admin","user")
        .anyRequest().authenticated() //除了上述两个只要登录就能访问

这里的匹配规则我们采用了 Ant 风格的路径匹配符,Ant 风格的路径匹配符在 Spring 家族中使用非常广泛,它的匹配规则也非常简单:

通配符含义
**匹配多层路径
*匹配一层路径
?匹配任意单个字符

上面配置的含义是:

  1. 如果请求路径满足 /admin/** 格式,则用户需要具备 admin 角色。
  2. 如果请求路径满足 /user/** 格式,则用户需要具备 user 角色。
  3. 剩余的其他格式的请求路径,只需要认证(登录)后就可以访问。

注意代码中配置的三条规则的顺序非常重要,和 Shiro 类似,Spring Security 在匹配的时候也是按照从上往下的顺序来匹配,一旦匹配到了就不继续匹配了,所以拦截规则的顺序不能写错

4.测试

由于我们的配置为:

.antMatchers("/user/**").hasAnyRole("admin","user")

所以admin也可以访问user,那么如过我们想实现admin自动能访问user呢??下面介绍角色继承!

3.角色继承

要实现所有 user 能够访问的资源,admin 都能够访问,这涉及到另外一个知识点,叫做角色继承。

上级可能具备下级的所有权限,如果使用角色继承,这个功能就很好实现,我们只需要在 SecurityConfig 中添加如下代码来配置角色继承关系即可:

@Bean
RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
    hierarchy.setHierarchy("ROLE_admin > ROLE_user");
    return hierarchy;
}

注意,在配置时,需要给角色手动加上 ROLE_ 前缀。上面的配置表示 ROLE_admin 自动具备 ROLE_user 的权限。

配置完成后,重启项目,此时我们发现 wangze 也能访问 /user/hello 这个接口了。

以上是关于2.springsecurity——授权的主要内容,如果未能解决你的问题,请参考以下文章

read ECONNRESET at TLSWrap.onStreamRead (internal/stream_base_commons.js:209:20) { errno: -4077(代码片段

OkHttpInterceptor 从 kotlin 拦截器导航到登录片段

OAuth2:查询字符串与片段

来自fabric的Twitter登录在片段中不起作用

微信授权页面执行ajax不执行,刷新才能执行

如何使用 SAML 2.0 响应进行特定 DNN 用户角色组身份验证和授权?