你想看看@PostFilter
和@PreFilter
。它们的工作方式非常相似@PreAuthorize
,但可以从列表中删除结果。您还想为您的用户分配不同的角色,假设您还没有这样做。
全局规则,比如管理员可以看到所有内容,您可以通过编写PermissionEvaluator
. 然后,您将其添加到MethodSecurityExpressionHandler
是时候举一个简单的例子了。
此代码是在文本编辑器中编写的。它可能无法编译,只是在这里显示所需的步骤
一个非常简单的PermissionEvaluator
public class MyPermissionEvaluator implements PermissionEvaluator {
private static final SimpleGrantedAuthority AUTHORITY_ADMIN = new SimpleGrantedAuthority('admin');
public boolean hasPermission(final Authentication authentication, final Object classId, final Object permission) {
boolean permissionGranted = false;
// admin can do anything
if (authentication.getAuthorities().contains(AUTHORITY_ADMIN)) {
permissionGranted = true;
} else {
// Check if the logged in user is in the same class
}
return permissionGranted;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType,
Object permission) {
return false;
}
}
然后配置方法安全
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Bean
public MethodSecurityExpressionHandler methodSecurityExpressionHandler(final PermissionEvaluator permissionEvaluator){
DefaultMethodSecurityExpressionHandler securityExpressionHandler = new DefaultMethodSecurityExpressionHandler();
securityExpressionHandler.setPermissionEvaluator(permissionEvaluator);
return securityExpressionHandler;
}
@Bean
public PermissionEvaluator permissionEvaluator() {
return new MyPermissionEvaluator();
}
}
现在我们可以在方法上使用我们的过滤器
@PostFilter("hasPermission(filterObject.getClassId(), 'READ')")
@Override
public List<Student> getAll() {
return querySomeStudents();
}
hasPermission
在@PostFilter
ACL 中将调用hasPermission
in MyPermissionEvaluator
。filterObject
指列表中的单个项目。无论您的代码在哪里返回 false,它都会从列表中删除该项目。