Filter 使用jax-rs和jersey的安全过滤实体集合

Filter 使用jax-rs和jersey的安全过滤实体集合,filter,jax-rs,entity,Filter,Jax Rs,Entity,我一直在研究如何根据某些安全角色筛选结果。我一直在研究过滤器,但这似乎只是过滤掉了某些字段,而不是完整的实体本身。让我试着解释一下我需要什么。假设我有两个实体类: public class Project { private Long id; private String name; private String description; // getters and setters } public class User { private Lon

我一直在研究如何根据某些安全角色筛选结果。我一直在研究过滤器,但这似乎只是过滤掉了某些字段,而不是完整的实体本身。让我试着解释一下我需要什么。假设我有两个实体类:

public class Project {

   private Long id;

   private String name;

   private String description;

   // getters and setters
}


public class User {

    private Long id;

    private String name;

    private String email;

    // getters and setters
}
资源:

@Path("projects")
@Produces("application/json") 
public class ProjectsResource {

    @GET
    public List<Project> getProjects() {
        return getDetailedProjects();
    }
}
@Path(“项目”)
@生成(“应用程序/json”)
公共类项目资源{
@得到
公共列表项目(){
返回getDetailedProjects();
}
}
我还有两个公司,每个公司都有自己的项目。为了方便起见,我们叫他们A公司和B公司

我想实现的是,3个用户都使用相同的资源,根据他们的安全角色得到不同的结果

用户1:超级用户,应该得到所有东西

用户2:公司A的经理,应该只获取公司A的项目

用户3:公司B的经理,应该只获取公司B的项目

我该怎么做呢?在每个资源中进行这种过滤似乎是不对的


我使用的是基于角色的安全性的jax-rs。用户被链接到一个角色,该角色授予他们访问特定公司项目的权限。

我认为您必须对访问用户的
getDetailedProjects
方法进行参数化

要实现这一点,您可以像这样将jersey
SecurityContext
注入您的资源(从):


securityContext.getUserPrincipal().getName()
方法将允许您找到请求用户并将其映射到一个方法参数(或者简单地使用它)。

您应该修改标题,以清楚地显示这个问题与jax rs、jersey和securityI有关。我知道用户所扮演的角色,这不是我的问题。这是实现这一目标的唯一途径吗?这意味着,我应该在每个资源本身中实现安全逻辑。我认为实现某种实体过滤器更像是“java”。我还考虑扩展实体类,如果可能的话,修改get project方法。对于一个复杂的应用程序来说,这种方式似乎简单得多。将安全性与业务逻辑混合在一起肯定不好,而且有很多方法可以通过其他方式实现多租户。“实体过滤器”是什么意思?您可以将上述逻辑移动到筛选器,但不知何故,资源必须知道要加载哪些项目。我在想,对于每个请求,资源都应该知道请求它的用户,并检查权限。然后我们知道用户所在的公司以及用户可以访问的相应项目。然后,过滤器可以通过结果集筛选出另一家公司的项目。但这是事实,可能需要很长时间。最好是能够修改查询本身。无论如何,您必须获得一个字符串,该字符串标识数据库中的请求用户,以便进行相应的查询。一种常用的方法是使用租户密钥作为资源路径的第一部分。比如@Path(“{company}/projects”),并检查(在过滤器中)请求用户是否真的允许查看该url。这也是实现restful资源设计/层次结构的一个好方法。我有一个请求过滤器,所以这部分很简单。在这个例子中,这是直截了当的,只要得到你需要的项目。我将要使用的应用程序是网店,我们有10个网店,都为不同的产品下订单,有不同的客户、优惠券、税率、价格等等。一切都从公司(特许经营者)开始。让所有这些关系“失控”似乎是不安全的。我希望使用enitty aproach,在这里我覆盖get方法,这样每次都可以确保只向特定用户返回正确的数据。更新也是如此。
@Path("basket")
public ShoppingBasketResource get(@Context SecurityContext sc) {
    if (sc.isUserInRole("PreferredCustomer") {
        return new PreferredCustomerShoppingBasketResource();
    } else {
        return new ShoppingBasketResource();
    }
}