gpt4 book ai didi

java - 带有 Spring Security 的 JSON REST API

转载 作者:行者123 更新时间:2023-11-30 10:39:47 24 4
gpt4 key购买 nike

根据实现 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 如何做到这一点。在我 future 的项目中,我想使用带有 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 Controller :

@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);
}

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

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

最佳答案

如果您可以使用 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 怎么样(没有 Jersey)?我还没有在 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 角色)。只需在您的安全方法(例如 Repository 方法)上使用 @PostFilter 注释。但是,如果您决定使用此解决方案,则应注意使用更大数据集时的性能问题。

关于java - 带有 Spring Security 的 JSON REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39194524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com