【问题标题】:JSON REST API with Spring Security带有 Spring Security 的 JSON REST API
【发布时间】:2017-01-04 19:01:20
【问题描述】:

很容易根据实现 Spring Security 定义的用户权限在 JSP/JSTL 中隐藏字段。人们可以很容易地写出这样的东西:

<%-- Assume message.title requires no privilege -->
<c:out value="${message.title}" />

<%-- Assume message.text requires PRIV_READ_MESSAGE -->
<security:authorize ifAllGranted="PRIV_READ_MESSAGE">
    <c:out value="${message.text}" />
</secrurity:authorize>

如果我们不使用 JSP,我的问题是如何做到这一点。在我未来的项目中,我想使用带有 Angular JS、AJAX 请求和 JSON 响应的纯 HTML 文件。

例如,我可以创建一个 API 来返回这样的消息:

GET /api/v1/message/{msgId}

如果用户没有PRIV_READ_MESSAGE权限,这个API的JSON响应会是这样的:

{
    "messageId": 123, 
    "title": "Sample Message 101"
}

如果用户拥有该权限,则此 API 的 JSON 响应如下:

{
    "messageId": 123, 
    "title": "Sample Message 101", 
    "text": "Message Body will be included..."
}

假设我已经实现了以下 Spring 控制器:

@RequestMapping(value = "api/v1/message/{messageId}", method = RequestMethod.GET)
public ResponseEntity<Message> getMessage(@PathVariable Long messageId) {
    // use some magic code to fetch Message from DB
    Message message = null;

    return new ResponseEntity<>(message, HttpStatus.OK);
}

我不想在我的控制器方法中添加 if/else 来检查登录的用户是否有足够的权限。我可以根据用户权限在某处过滤 JSON 响应字段吗?

您可以假设 ThreadLocal 变量用于存储当前用户的权限。

【问题讨论】:

    标签: java json spring spring-security


    【解决方案1】:

    如果您可以使用 Jersey (2.16+),那么您的问题有现成的解决方案: https://jersey.java.net/documentation/latest/entity-filtering.html#ef.security.annotations http://blog.dejavu.sk/2015/02/04/jerseys-entity-filtering-meets-jackson/

    我还没有尝试过,但看起来很有希望......

    春天(没有球衣)怎么样? 我还没有看到任何关于 Spring Security / MVC 中类似机制的信息...... Spring Security 过滤器(默认情况下)不能应用于您的实体,因为它们不是由 Spring 管理的。 但是,您可以尝试使用 AOP 和 AspectJ 来实现:

    https://stackoverflow.com/a/31522654/1545775

    这种功能存在 github 问题,但我不知道状态如何:

    https://github.com/spring-projects/spring-security/issues/3250

    您现在可以使用 Spring Security(无需任何额外配置)进行实体列表过滤(基于 Spring Security 角色)。只需在您的安全方法(例如存储库方法)上使用 @PostFilter 注释。但如果您决定使用此解决方案,则应注意使用更大数据集时的性能问题。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2021-11-07
      • 2016-08-30
      • 2014-08-31
      • 2020-09-06
      • 2017-04-04
      • 2018-03-06
      • 2019-01-05
      • 2016-07-08
      相关资源
      最近更新 更多