专栏名称: 码农小胖哥
技术公众号:码农小胖哥
目录
相关文章推荐
51好读  ›  专栏  ›  码农小胖哥

Spring Security 实战干货:基于配置的接口角色访问控制

码农小胖哥  · 掘金  ·  · 2019-11-14 01:34

正文

阅读 102

Spring Security 实战干货:基于配置的接口角色访问控制

1. 前言

欢迎阅读 Spring Security 实战干货 系列文章 。对于受限的访问资源,并不是对所有认证通过的用户开放的。比如 A 用户的角色是会计,那么他就可以访问财务相关的资源。 B 用户是人事,那么他只能访问人事相关的资源。我们在 一文中也对基于角色的访问控制的相关概念进行了探讨。在实际开发中我们如何对资源进行角色粒度的管控呢?今天我来告诉你 Spring Security 是如何来解决这个问题的。

2. 将角色写入 UserDetails

我们使用 UserDetailsService 的 `` 加载 UserDetails 时也会把用户的 GrantedAuthority 权限集写入其中。你可以将角色持久化并在这个点进行注入然后配置访问策略,后续的问题交给 Spring Security

3. 在 HttpSecurity 中进行配置角色访问控制

我们可以通过配置 WebSecurityConfigurerAdapter 中的 HttpSecurity 来控制接口的角色访问。

3.1 通过判断用户是否持有角色来进行访问控制

httpSecurity.authorizeRequests().antMatchers("/foo/test").hasRole("ADMIN")

表示 持有 ROLE_ADMIN 角色的用户才能访问 /foo/test 接口。注意: hasRole(String role) 方法入参不能携带前缀 ROLE_ 。我们来查看 SecurityExpressionRoot 中相关源码:


	public final boolean hasRole(String role) {
		return hasAnyRole(role);
	}

复制代码

很明显 hasRole 方法源于 hasAnyRole (持有任何其中角色之一,就能满足访问条件,用于一个接口开放给多个角色访问时) :

 
	public final boolean hasAnyRole(String... roles) {
		return hasAnyAuthorityName(defaultRolePrefix, roles);
	}
复制代码

如果一个接口开放给多个角色,比如 /foo/test 开放给了 ROLE_APP ROLE_ADMIN 可以这么写:

httpSecurity.authorizeRequests().antMatchers("/foo/test").hasAnyRole("APP","ADMIN")







请到「今天看啥」查看全文