授权是web应用常见的需求,我们需要针对不同的用户,根据他们不同的权限,放行相应的接口。
在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。
因此,在应用spring security的项目中,我们需要将权限信息存入Authentication。
spring security提供了基于注解的权限控制方案,我们需要在spring security配置类中开启。
@EnableGlobalMethodSecurity(prePostEnabled = true)
还记得我们之前所说的要实现UserDetails接口,用于方法返回
在UserDetails接口中定义了getAuthorities方法,spring security会调用这个方法来获取用户权限
<? extends org.> getAuthorities();
因此我们实现这个方法
-
private List<String> permissions;
-
-
@JSONField(serialize = false)
-
private List<GrantedAuthority> authorities;
-
-
@Override
-
public Collection<? extends GrantedAuthority> getAuthorities() {
-
if(authorities!=null){
-
return authorities;
-
}
-
authorities = ().
-
map(SimpleGrantedAuthority::new)
-
.collect(());
-
return authorities;
-
}
该方法要求的返回类型是Collection泛型,泛型下界是GrantedAuthority
基于对序列化的一些考量,我们定义List<String>用于存权限信息,而调用该方法时则将其转为SimpleGrantedAuthority
UserDetails的实现类处理好后,我们在登录逻辑中就可以把从数据库中获取的权限信息封装到该对象中,spring security在授权时就会去相应获取权限信息。
进而,我们就可以使用spring security的注解去限制资源的访问,如@PreAuthorize("hasAuthority('test')")