【发布时间】:2021-04-28 07:30:18
【问题描述】:
有一个简单的 Web 服务,只有一个端点 "GET /hello"。
最好在控制器中以声明方式描述 JWT 是预期的,以便从中提取有关发出请求的授权用户的一些数据。
在 Github 上探索一些开源项目,我发现 @AuthenticationPrincipal 注释以某种方式参与了该过程。但是,我设法找到的教程都没有提到这种声明性方法 - 它们主要展示如何创建 JWT,而不是如何处理。
如果您指出值得注意的示例,我将不胜感激我错过了。
显然这个问题是微不足道的,并且与 Spring Security 的基本功能有关,但我不能把这个谜团放在一起。
请帮我找到一种将 JWT 传递到控制器并从中获取数据的正确(自然)方式。
您能否分享一个包含依赖项的工作示例和一个展示如何在控制器中使用 JWT 的小测试?
SpringBoot 2.4.0
import org.springframework. ??? .Jwt;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@RestController
public class MyController {
@GetMapping("hello")
public Object getRequests(@AuthenticationPrincipal Jwt jwt) {
String name = getPropertyFromJwt(jwt, "name");
String id = getPropertyFromJwt(jwt, "id");
return Map.of("name", name, "id", id);
}
}
【问题讨论】:
-
您需要的一切都在这里:baeldung.com/get-user-in-spring-security 如果您想按原样读取 JWT(在 base64 中)添加 HttpServletRequest 请求作为方法参数:(公共对象 getRequests(,HttpServletRequest 请求) ) 并调用 request.getHeader("authorization");那么你将直接拥有 JWT
-
另一种直接访问标头的选项(使用@RequestHeader 注解):stackoverflow.com/a/54911059/3942132
-
@RoieBeck 好的,我们将标题作为字符串。接下来怎么解析呢?
-
jwt.io给你一个java所有框架的列表:),github.com/auth0/java-jwtmaven包就是一个例子,在github页面搜索“Decode a Token”,真的很简单。每个库都有自己解码 JWT 的方法,您也可以自己对 jwt 主体进行 Base64.decode(JWT 的第二部分也称为有效负载):),作为一般规则,我认为您需要先更好地了解 JWT使用它...
标签: java spring-boot spring-security jwt spring-security-oauth2