通过ownerId java spring security过滤行数据库[关闭]

Posted

技术标签:

【中文标题】通过ownerId java spring security过滤行数据库[关闭]【英文标题】:filter rows database by ownerId java spring security [closed] 【发布时间】:2017-08-10 16:21:45 【问题描述】:

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

在 java spring security 中是否可以做到这一点?

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

【问题讨论】:

【参考方案1】:

您可以使用 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.


春季文档: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

【讨论】:

我使用的是可分页的,看来@postFilter 它只适用于集合

以上是关于通过ownerId java spring security过滤行数据库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

通过 Angular 5 和 Spring Sec 5 中的 HTTP GET 请求对用户进行身份验证

如果两个数组具有相同的ownerId,如何将它们比较在一起

Spring MVC 控制器返回类型

sec:authorize 对 Spring Security 不起作用

sec:authorize 不起作用 - Spring Boot 2、Thymeleaf 3、Thymeleaf Spring Security 5 集成包

[spring] java.lang.reflect.MalformedParameterizedTypeException