【发布时间】:2017-08-10 16:21:45
【问题描述】:
我想按 ownerId 过滤我的帐户记录,如果有人试图访问他不是所有者的记录,则显示访问被拒绝。
在 java spring security 中是否可以做到这一点?
如果是,我们能否将其应用于一组用户,其中每个组只能看到共享记录?
【问题讨论】:
标签: java database spring-security
我想按 ownerId 过滤我的帐户记录,如果有人试图访问他不是所有者的记录,则显示访问被拒绝。
在 java spring security 中是否可以做到这一点?
如果是,我们能否将其应用于一组用户,其中每个组只能看到共享记录?
【问题讨论】:
标签: java database spring-security
您可以使用 Spring Security 的 Filter 注释来实现这一点。为您提供 PreFilter 和 PostFilter。您可以通过注解您的安全配置文件来启用前置和后置注解。
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
// your web security stuff.
}
因为你想通过一个属性过滤掉你会使用 PostFilter
@PostFilter("filterObject.ownerId == authentication.name")
public List<Record> findAllRecords() {
// perform query to get records.
}
Spring 将获取所有记录,然后继续过滤掉所有 ownerId 与经过身份验证的用户不匹配的记录。
您还可以应用其他 spring 表达式(hasRole、hasAuthority、isAuthenticated 等)以及组合表达式。例如,如果您希望仅具有 ROLE_ADMIN 的用户访问所有记录,并且如果用户没有 ROLE_ADMIN 以通过 ownerId 过滤掉,您可以执行以下操作。 (您可以在表达式中使用“and”或“or”运算符)
@PostFilter("hasRole('ROLE_ADMIN') or filterObject.ownerId == authentication.name")
public List<Record> finAllRecords() {
// perform query to get all records.
}
在 baeldung.com 上很好地记录了这些功能 http://www.baeldung.com/spring-security-prefilter-postfilter
【讨论】: