你想看看@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
i n @PostFilter
ACL将调用MyPermissionEvaluator
中的hasPermission
。 filterObject
指的是列表中的单个项目。无论您的代码返回false,它都会从列表中删除该项目。
感谢您的关注!我应该为所有学生创造许多角色....这是最好的解决方案!!? –