Spring启动基本认证Spring启动会话成为可能

时间:2017-10-31 22:24:43

标签: spring rest security session spring-boot

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

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

实现此问题与[Spring boot rest security with android and ios类似,但该问题似乎并未涵盖缓存并使用为会话的所有其他Rest API调用收到的会话值。我是否将会话值作为Rest put和post API命令中的参数传递?目标是让应用程序验证用户已注册并验证其凭据,然后再接受其他休息放置和发布命令。

我确实阅读了spring.io文档但未发现此主题。 Spring启动有点新鲜。

1 个答案:

答案 0 :(得分:4)

您可以使用基于会话的身份验证和基于令牌的身份验证。 成功登录后使用基于会话的身份验证时,它会在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客户端或HttpClients之一以编程方式进行测试。 你可以通过link检查邮递员发送cookie 您也可以通过此link查看Cookie域的工作原理。 检查此请求是否经过身份验证,我们只能使用PrincipalhttpServletRequest引用,如下所示:

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

希望它有所帮助!