我想按ownerId过滤我的帐户记录,如果有人试图访问他不是所有者的记录,则显示访问被拒绝。
java spring security是否可以这样做?
如果是,我们可以将此应用于一组用户,其中每个组只能看到共享记录吗?
答案 0 :(得分:0)
您可以使用Spring Security中的过滤器注释来实现此目的。您已获得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与经过身份验证的用户不匹配的任何记录。
您还可以应用其他弹簧表达式(hasRole,hasAuthority,isAuthenticated等)以及组合表达式。例如,如果您只希望具有ROLE_ADMIN的用户访问所有记录,并且如果用户没有要通过ownerId过滤掉ROLE_ADMIN,则可以执行以下操作。 (您可以使用'和'或'或'带有表达式的运算符)
@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