【问题标题】:Spring boot basic authentication spring boot session possibleSpring Boot 基本身份验证 Spring Boot 会话可能
【发布时间】:2018-04-13 05:05:02
【问题描述】:

我有一个 Spring Boot 后端服务器应用程序,它通过 https 实现基本身份验证。不会有传统的基于 Web 的前端,而是我的 android 和 IOS 客户端将使用 Rest API 调用。

后端应用程序当前正在验证收到的用户名和密码信息,并以正确的状态消息(401、200)进行响应。我可以使用 Spring Boot 会话让用户在会话开始时登录,然后为该会话的每个后续 api 调用使用会话值吗?

意识到这个问题类似于 [Spring boot rest security with android and ios,但这个问题似乎没有涵盖缓存和使用为会话的所有其他 Rest API 调用接收到的会话值。我是否将会话值作为参数传递给 Rest put 和 post API 命令?目标是让应用程序验证用户是否已注册并验证他们的凭据,然后再接受额外的 rest put 和 post 命令。

我确实阅读了 spring.io 文档,但没有找到涵盖该主题的内容。对 Spring boot 来说有些新意。

【问题讨论】:

  • 为什么不简单地为每个请求传递凭据,或者传递JWT 而不是依赖会话 ID。这将使事情保持无状态,并且将负载分配到多个服务器是微不足道的。
  • 移动应用程序发布的记录可能超过 30 条 x 2 表。验证每个帖子的用户必须影响性能,不是吗?
  • 应该,是的。但 JWT 不应该这样做,并且与会话相比具有许多优势。

标签: spring rest security session spring-boot


【解决方案1】:

您可以使用基于会话的身份验证和基于令牌的身份验证。 在成功登录后使用基于会话的身份验证时,它会在 Spring 安全上下文中创建一个会话(时间有限),并且还会向客户端返回一个名为 JSESSIONID(默认名称)的 cookie 作为响应。 例如:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Tue, 1 Nov 2017 01:19:38 GMT

客户端需要保留这个 cookie,并且对于每个请求都需要设置这个 cookie(JSESSIONID) 请求能够以登录用户的身份请求(直到会话到期)。作为客户端,您可以使用 Postman 进行测试,也可以使用 Jersey 客户端或 HttpClient 之一以编程方式进行。 您可以通过link 与邮递员检查发送 cookie。
您还可以通过 link 检查 cookie 域的工作方式。 检查此请求是否经过身份验证,我们可以使用 Principal 或 httpServletRequest 参考如下:

@RequestMapping(value = "/username", method = RequestMethod.POST)
@ResponseBody
public String loggedUserName(Principal principal) {
    return principal.getName();
}

@RequestMapping(value = "/username1", method = RequestMethod.POST)
@ResponseBody
public String loggedUserName1(HttpServletRequest request) {
    Principal principal = request.getUserPrincipal();
    return principal.getName();
}

如果您调试/username1 端点,您将能够看到 cookie 是否设置为请求正确,如果设置不正确,您可能会遇到与匿名用户相关的问题。

第二种方式,您可以使用JWT(Json Web Token) 使用基于令牌的身份验证。 它在令牌上作为无状态工作。响应示例:

{
"token_type": "Bearer",
"expires_in": "3599",
"resource": "qwd636-27bso-joiue9-ee",
"access_token": "eyJ77hqggqDd3DctNDFjMS05MjE2LWNiYjEw"

}

对于每个请求,您都可以使用访问令牌和刷新令牌检查请求的有效性。

Boolean isValidToken = jwtTokenUtil.validateToken(token, principal.getUsername());

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2014-09-22
    • 2014-07-29
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多