我有一个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启动有点新鲜。
答案 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域的工作原理。
检查此请求是否经过身份验证,我们只能使用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());
希望它有所帮助!