Spring Security 扩展性超棒,四种常见权限控制方式全解析

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);
}

动态权限

引用

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读