你想看看@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,它都會從列表中刪除該項目。
感謝您的關注!我應該爲所有學生創造許多角色....這是最好的解決方案!!? –