Java 过滤所有查询的数据

Java 过滤所有查询的数据,java,mysql,spring,jpa,Java,Mysql,Spring,Jpa,我用Spring和Mysql创建了一个新的应用程序,但我可以相对自由地使用其他东西 在此应用程序中,用户登录时无法查看除用户“admin”之外的所有数据。 有一个组树,用户在组中。用户只能看到其组或子组的用户或其他对象 我试图找到一个优雅的方法: 例如,如果我写:productDao.findAll,它将返回经过过滤的所有产品allready,而不必重写所有DAO中的所有请求 如果它不存在,我接受所有的想法:重构数据库?为其他数据库更改mysql,而不是使用JPA,其他。。。。或者可能是,我走错

我用Spring和Mysql创建了一个新的应用程序,但我可以相对自由地使用其他东西 在此应用程序中,用户登录时无法查看除用户“admin”之外的所有数据。 有一个组树,用户在组中。用户只能看到其组或子组的用户或其他对象

我试图找到一个优雅的方法: 例如,如果我写:productDao.findAll,它将返回经过过滤的所有产品allready,而不必重写所有DAO中的所有请求

如果它不存在,我接受所有的想法:重构数据库?为其他数据库更改mysql,而不是使用JPA,其他。。。。或者可能是,我走错了路,做这样的事是个坏主意

使用SpringSecurity 4。它还支持角色和分层角色 使用SpringDataJPA创建DAO。它与Spring Security 4集成 下面是一个使用Spring数据JPA编写DAO的示例。编写接口,然后SDJ为您创建类

public interface ProductRepository extends JpaRepository<Product, Long> {

    @Query("select e from #{#entityName} e where e.owner = ?#{principal?.username}")
    Page<Product> findAll(Pageable pageable);
}
实际上,您可以在基本存储库中执行此操作并扩展它

您需要为
?{principal?.username}安全表达式是否有效

您计划将这些限制保留在哪里,以限制不同用户可以/不能看到的内容?需要研究的问题是为Privileged用户使用不同的持久化单元,甚至使用数据库选项,如本文所述的Oracles代理身份验证。这几乎是我们当前的解决方案,但我尝试在不重写所有查询的情况下找到一个解决方案。例如,过滤器e.owner=?{principal?.username}中实体类的注释也适用于complexe join。我想我试图找到一些不可能的事情,但我尝试。。。