我有一个Web应用程序,需要允许使用不同网络客户端(浏览器、本地移动应用程序等)的用户进行注册。登录后,他们可以访问受限内容或其自己的内容(如他们创建的条目等)。
我所做的:我创建了一个jax-rs rest webservice(我在glassfish上托管我的应用程序),公开了以下方法:
- 注册(register) - 用户POST他想要的用户名/密码/电子邮件等;如果用户名/电子邮件唯一,则在数据库中为此用户创建一个条目(我使用Hibernate进行持久化)。 - 登录(login) - 用户POST用户名和密码。如果它们是正确的,会创建并返回一个UUID(这将用作未来请求的令牌)。我有一个名为logedusers的表,其中包含userID、token、validSince三列。
这里对我来说变得很混乱。
假设我有另一个方法getUserEntries,它应该返回用户提交的所有条目。为了使这更清晰,将有一个Entry表,其中包含以下字段:entryId、userId、text。
最佳途径是什么?
现在我做的是,我发送get请求,并像这样传递令牌: localhost:8080/myApp/getUserEntries?token=erf34c34
然后,如果令牌有效,我从logedusers表中获取userID,并根据该userID获取所有条目并将它们作为JSON返回。
类似于这样:
我所做的:我创建了一个jax-rs rest webservice(我在glassfish上托管我的应用程序),公开了以下方法:
- 注册(register) - 用户POST他想要的用户名/密码/电子邮件等;如果用户名/电子邮件唯一,则在数据库中为此用户创建一个条目(我使用Hibernate进行持久化)。 - 登录(login) - 用户POST用户名和密码。如果它们是正确的,会创建并返回一个UUID(这将用作未来请求的令牌)。我有一个名为logedusers的表,其中包含userID、token、validSince三列。
这里对我来说变得很混乱。
假设我有另一个方法getUserEntries,它应该返回用户提交的所有条目。为了使这更清晰,将有一个Entry表,其中包含以下字段:entryId、userId、text。
最佳途径是什么?
现在我做的是,我发送get请求,并像这样传递令牌: localhost:8080/myApp/getUserEntries?token=erf34c34
然后,如果令牌有效,我从logedusers表中获取userID,并根据该userID获取所有条目并将它们作为JSON返回。
类似于这样:
@GET
@Path("getUserEntries")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserEntries(@QueryParam("token") String token) {
String userId=getUserIdFromToken(token);
if (userId == null){
return Response.status(Response.Status.UNAUTHORIZED).build();
} else {
//get some data associated with that userId, put it in the response object and send it back
return Response.ok().entity(response).build();
}
}
然而,如果我有更多的方法可以在有效用户调用时提供数据,那会怎样呢?
我必须在每个方法的开头进行此检查。
我希望使这个授权过程透明化。
所以,这里有两个主要问题:
- 这种设计是否可行?整个过程是通过用户名/密码进行身份验证,服务器创建、存储并发送令牌给用户,用户在未来的请求中发送令牌。
- 如果我有许多需要确定调用用户身份的端点,我该怎么办?我能否使用某些注释标记它们,使用某种安全提供程序/认证器(在其中可以添加自己的验证逻辑 - 例如检查令牌是否不超过5天等)。
谢谢