如何用Java Stream过滤Spring Boot中指定前缀开头的权限
用Java Stream过滤Spring Boot认证权限列表
需求说明
在Spring Boot应用中,用户完成认证后会返回一组GrantedAuthority权限列表,示例如下:
user_1_authority, user_2_authority, group_1_authority, group_2_authority, test_1_authority, test_2_authority, driver_x_authority, ...
需要过滤该列表,仅保留以user_或group_开头的权限,最终预期结果:
user_1_authority, user_2_authority, group_1_authority, group_2_authority,
修正后的实现代码
原代码中的stream().contains()逻辑无法满足需求,我们需要通过Stream的filter方法结合前缀匹配来实现,同时注意GrantedAuthorities是拼写错误,正确类名是GrantedAuthority:
import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; public class AuthorityFilter { List<String> authoritiesStartingWithList = Arrays.asList("user_", "group_"); public Collection<GrantedAuthority> filterAuthorities(Authentication authentication, List<String> authoritiesStartingWithList) { return authentication.getAuthorities() .stream() // 过滤:权限字符串以指定前缀中的任意一个开头 .filter(authority -> authoritiesStartingWithList.stream() .anyMatch(prefix -> authority.getAuthority().startsWith(prefix))) // 收集为Collection<GrantedAuthority> .collect(Collectors.toList()); } }
代码解释
- 获取权限流:通过
authentication.getAuthorities().stream()将权限列表转为Stream - 过滤逻辑:
- 对每个
GrantedAuthority,调用getAuthority()获取权限字符串 - 遍历前缀列表,用
anyMatch判断权限字符串是否以任意一个前缀开头,满足条件则保留该权限
- 对每个
- 结果收集:用
Collectors.toList()将过滤后的Stream转为List<GrantedAuthority>(属于Collection的子类,符合返回值要求)
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

