通过ownerId java spring security过滤行数据库

时间:2017-03-19 11:05:43

标签: java database spring-security

我想按ownerId过滤我的帐户记录,如果有人试图访问他不是所有者的记录,则显示访问被拒绝。

java spring security是否可以这样做?

如果是,我们可以将此应用于一组用户,其中每个组只能看到共享记录吗?

1 个答案:

答案 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.

}

SPRING DOC:http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#filtering-using-prefilter-and-postfilter

在baeldung.com上很好地写下这些功能 http://www.baeldung.com/spring-security-prefilter-postfilter