Spring Security 扩展性超棒,四种常见权限控制方式全解析
Spring Security里针对权限控制默认已给出不少,然而,一个出色的框架得拥有良好的扩展性,恰巧,Spring Security的扩展性极为出色,我们既能采用Spring Security给出的方式进行授权,又能够自定义授权逻辑。总之,你想怎样操作都行!

Spring Security 中四种常见的权限控制方式。
表达式控制 URL 路径权限
Spring Security在URL和方法权限控制时支持使用SpEL表达式,若表达式返回值为true,就意味着需要对应的权限,若表达式返回值不为true,就意味着不需要对应的权限。提供表达式的类是SecurityExpressionRoot:
使用案例
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("admin")
.antMatchers("/user/**").hasAnyRole("admin", "user")
.anyRequest().authenticated()
.and()
...
}
这里表明,访问格式为 /admin/** 的路径,需要具备 admin 角色,而访问格式为 /user/** 的路径,则需要具备 admin 或者 user 角色。
表达式控制方法权限
在方法上添加注解控制权限,这需要我们首先开启注解的使用,还要在Spring Security配置类上添加如下内容:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
...
}
这个配置开启了三个注解,分别是:
使用案例
@Service
public class HelloService {
@PreAuthorize("principal的username属性的值等于'chenfu'")
public String hello() {
return "hello";
}
@PreAuthorize("hasRole('admin')")
public String admin() {
return "admin";
}
@PostMapping
@ApiOperation(value = "等级变更记录分页列表")
@PreAuthorize(@ato拥有权限('msg'))
public String customer(String msg) {
return "customer:" + msg;
}
}
@Slf4j
@Component("ato")
public class AuthorityService {
/**
* 判断接口是否有ato:xxxxx,xxxxx权限
*
* @param permissions 权限标识
* @return {boolean}
*/
public boolean hasAuthority(String... permissions) {
if (ArrayUtil.isEmpty(permissions)) {
return false;
}
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null) {
return false;
}
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
return authorities.stream()
.map(GrantedAuthority::getAuthority)
.filter(StringUtils::hasText)
.anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x));
}
}
第一个 hello 方法,其注解的约束为,只有当前登录用户名为 chenfu 的用户,才能够访问该方法。第二个 admin 方法,意味着访问该方法的用户,必须具备 admin 角色。第三个 customer 方法,运用自定义类处理逻辑,用以校验登录用户是否具备接口权限
缺省对象中,除了principal外,还有authentication 。
使用过滤注解
Spring Security 里还有两个过滤函数,分别是 @PreFilter 和 @PostFilter,它们能够依据给出的条件,自动将集合中的元素移除 。
@PostFilter(filterObject的最后一个索引位置不是-1,且该索引位置处的值为'2')
public List<String> getAllUser() {
List<String> users = new ArrayList<>();
for (int i = 0; i < 10; i++) {
users.add("chenfu:" + i);
}
return users;
}
@PreFilter(filterTarget = "ages",value = "filterObject%2==0")
public void getAllAge(List<Integer> ages,List<String> users) {
System.out.println("ages = " + ages);
System.out.println("users = " + users);
}
动态权限
引用
你可能想看: