来自 Spring Rest 控制器中 JWT 的安全决策

Posted

技术标签:

【中文标题】来自 Spring Rest 控制器中 JWT 的安全决策【英文标题】:security decision from a JWT in a spring rest controller 【发布时间】:2016-12-04 08:15:07 【问题描述】:

我将 Spring 与释放 JWT 令牌的 oauth2 一起使用。 我有一个工作原型,我可以在其上使用 @PreAuthorize 注释。

// public class Foo  private String md5Hash;  with getters, setters, etc.

@RestController
@RequestMapping("/foo")
public class WebController 

    @PreAuthorize("hasAnyAuthority('client','module')")
    @RequestMapping(method = RequestMethod.GET)
    public String readFoo(Foo foo) 
        String username = /* extract jwt info */
        if (verify(username, foo.getMd5Hash())) 
             return "you CAN'T";
        return "you can";
    

    boolean verify(String user, String md5) ...

在 JWT 令牌中定义了用户名。 如何从这里读取用户名?

此外,如您所见,我还有另一个安全决定要采取...这是一个好方法还是有一些我不知道的 Spring 功能?

【问题讨论】:

【参考方案1】:

JWT 令牌将在 Authorization http 标头属性中发送,同时请求类似,

授权:承载 jwt-token

您可以在请求映射中访问 http 标头,例如,

@PreAuthorize("hasAnyAuthority('client','module')")
@RequestMapping(method = RequestMethod.GET)
public String readFoo(Foo foo, @RequestHeader(value="Authorization") String bearerToken) 
    // you can use any JWT libraries return object version of jwt
    String username = extractJwtToken(bearerToken);

查看此站点https://jwt.io/,以了解可用的 Java 库以供使用和了解,

我要做出另一个安全决定

是的,你必须这样做,JWT声称只包含它可以做的事情,你需要做授权,检查用户(令牌)是否有足够的权限或访问权限来做特定的操作,并且必须从你那里完成只是,它是业务逻辑的一部分。

【讨论】:

以上是关于来自 Spring Rest 控制器中 JWT 的安全决策的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 和 JWT 保护 REST Api

使用 Spring 安全性和 JWT 在 REST 中使用 <img> 标签访问私有图像

Spring REST-JWT-JavaScript 在安全页面之间导航

Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成

Spring Boot JWT - 如何实现刷新令牌和注销 REST-API

用于 REST API 的带有 JWT 的 Spring Security