如何在Spring Data Rest中限制对子链接的访问?

时间:2018-12-01 17:31:57

标签: java spring-data-rest

Spring Data Rest中是否有一种方法可以限制对公开实体的子链接的访问?

例如,我的Data Rest应用程序中对特定用户的GET请求返回以下内容:

{
    "id": 1,
    "username": "admin",
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/v1/users/1"
        },
        "user": {
            "href": "http://localhost:8080/api/v1/users/1"
        },
        "todoLists": {
            "href": "http://localhost:8080/api/v1/users/1/todoLists"
        },
        "contacts": {
            "href": "http://localhost:8080/api/v1/users/1/contacts"
        },
        "todos": {
            "href": "http://localhost:8080/api/v1/users/1/todos"
        },
        "contactRequestsReceived": {
            "href": "http://localhost:8080/api/v1/users/1/contactRequestsReceived"
        },
        "assignedTodos": {
            "href": "http://localhost:8080/api/v1/users/1/assignedTodos"
        },
        "contactRequestsSent": {
            "href": "http://localhost:8080/api/v1/users/1/contactRequestsSent"
        }
    }
}

我希望用户能够访问其他用户并查看用户名,但希望限制对子链接的访问,以使他们不能通过遵循“ / users / 1来看到彼此的待办事项。 / todos”链接。

我试图使用投影仅显示用户名或@JsonIgnore批注以忽略集合,但是链接仍然可见并且仍然可以访问。

1 个答案:

答案 0 :(得分:1)

进行更多研究后,我发现了ExposureConfiguration类,该类是较新的Spring Data Rest发行版的一部分。我必须从Spring Boot 1.5.8升级到2.1.1才能使用它。

现在在我的RestConfig中,我正在这样做:

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {

    ExposureConfiguration exposureConfiguration = config.getExposureConfiguration();

    exposureConfiguration.forDomainType(User.class)
        .withAssociationExposure((metdata, httpMethods) -> httpMethods.disable(HttpMethod.GET));
}

这会阻止用户访问我的User实体的任何关联链接。

还有许多其他选项可用于配置实体曝光。 我找不到很多有关此功能的文档,但是: Customizing Default Exposure