Java 经过身份验证的REST请求是否总是意味着数据库请求?
我正在使用RESTeasy框架开发我的web服务。我已经成功地设置了基本身份验证,现在它工作正常。当然,我确实计划在此基础上使用SSL 过程很简单(如果您不知道这是关于什么的,请了解HTTP basic Auth):Java 经过身份验证的REST请求是否总是意味着数据库请求?,java,google-app-engine,rest,basic-authentication,objectify,Java,Google App Engine,Rest,Basic Authentication,Objectify,我正在使用RESTeasy框架开发我的web服务。我已经成功地设置了基本身份验证,现在它工作正常。当然,我确实计划在此基础上使用SSL 过程很简单(如果您不知道这是关于什么的,请了解HTTP basic Auth): 每个请求都被一个分析请求头的方法截获 此标题被解码,用户名和密码被提取 然后,该方法查询数据库,检查用户名和密码是否匹配 如果它们与请求匹配,则返回401代码 使用这种方法,由于REST(以及HTTP本身)的无状态特性,每个请求都意味着对数据库的请求 我的问题是:是否可以不对每个经
作为旁注: 我真的觉得关于这件事的信息很少。它只是一个,一个,一个。。。如果我们不想对第三方应用程序进行身份验证,那么信息到处都是,而且没有任何具体的例子,比如使用OAuth。 如果您对RESTWebServices中的身份验证有什么好的建议,我很乐意听听
谢谢。有多种方法可以通过cookie实现“Auth Ticket”(谷歌,您可能会找到一些非OAuth引用),因此不是每个请求都需要数据库查询。然而,这些通常涉及一个加密密钥 我不认为最佳实践应该是将加密密钥存储在源文件中(但这是教程通常实现的方式),因此即使不查询数据库,也可能涉及某种磁盘访问(通过属性文件、密钥库等)
Perception表示,将cookie(状态)添加到无状态系统设计中是一种欺骗。有多种方法可以使用cookie实现“身份验证票证”(谷歌,您可能会发现一些非OAuth引用),因此并非每个请求都需要数据库查询。然而,这些通常涉及一个加密密钥 我不认为最佳实践应该是将加密密钥存储在源文件中(但这是教程通常实现的方式),因此即使不查询数据库,也可能涉及某种磁盘访问(通过属性文件、密钥库等) 作为Perception状态,将cookie(状态)添加到无状态系统设计中是一种欺骗。使用类似于数据库的中介。检查凭据是否已缓存,是否继续请求,如果未缓存,则从数据库中提取凭据并验证凭据。如果凭据匹配,请缓存它们以备将来的请求,并继续当前请求 请记住,对memchaced的访问必须与对数据库的访问一样安全,因为数据库中存储有密码。这是许多站点使用OAuth的原因之一,尤其是OAuth 2,在OAuth 2中,您可以分发一个短期访问令牌和一个长期刷新令牌,以便在需要时获得一个新的访问令牌。使用类似于数据库的中介。检查凭据是否已缓存,是否继续请求,如果未缓存,则从数据库中提取凭据并验证凭据。如果凭据匹配,请缓存它们以备将来的请求,并继续当前请求
请记住,对memchaced的访问必须与对数据库的访问一样安全,因为数据库中存储有密码。这是许多站点使用OAuth的原因之一,尤其是OAuth 2,在OAuth 2中,您可以分发短期访问令牌和长期刷新令牌,以便在需要时获得新的访问令牌。欢迎来到代表性状态传输安全世界!你知道,我给罗伊·菲尔丁发了一条信息,问你如何才能创建一个真正安全的RESTful服务。他还没给我回电话 您的两个选项实际上是基本身份验证(希望使用SSL,或者重点是什么),或者OAuth。对于我目前参与的所有解决方案,我们都使用OAuth。虽然它使测试复杂化,但它非常安全,允许我们从服务中创建可外部化的API
我建议不要使用cookies存储会话信息。这不仅违反了REST的精神,而且还为会话劫持打开了应用程序的大门。为了加快速度,您可以做的一件事是使用用户信息维护一个良好的二级缓存,这样您的查询实际上不会针对每个传入请求命中数据库。这可以显著提高速度。这种策略同样适用于基本auth和Oauth。欢迎来到代表性国家传输安全的世界!你知道,我给罗伊·菲尔丁发了一条信息,问你如何才能创建一个真正安全的RESTful服务。他还没给我回电话 您的两个选项实际上是基本身份验证(希望使用SSL,或者重点是什么),或者OAuth。对于我目前参与的所有解决方案,我们都使用OAuth。虽然它使测试复杂化,但它非常安全,允许我们从服务中创建可外部化的API
我建议不要使用cookies存储会话信息。这不仅违反了REST的精神,而且还为会话劫持打开了应用程序的大门。为了加快速度,您可以做的一件事是使用用户信息维护一个良好的二级缓存,这样您的查询实际上不会针对每个传入请求命中数据库。这可以显著提高速度。这种策略同样适用于基本auth和Oauth。答案是缓存 在我的p
public class GaeAuthenticator extends Authenticator {
/**
* The GAE UserService that provides facilities to check whether a user has
* authenticated using their Google Account
*/
private UserService userService = UserServiceFactory.getUserService();
/**
* Constructor setting the mode to "required".
*
* @param context
* The context.
* @see #Authenticator(Context)
*/
public GaeAuthenticator(Context context) {
super(context);
}
/**
* Constructor using the context's default enroler.
*
* @param context
* The context.
* @param optional
* The authentication mode.
* @see #Authenticator(Context, boolean, Enroler)
*/
public GaeAuthenticator(Context context, boolean optional) {
super(context, optional);
}
/**
* Constructor.
*
* @param context
* The context.
* @param optional
* The authentication mode.
* @param enroler
* The enroler to invoke upon successful authentication.
*/
public GaeAuthenticator(Context context, boolean optional, Enroler enroler) {
super(context, optional, enroler);
}
/**
* Integrates with Google App Engine UserService to redirect
* non-authenticated users to the GAE login URL. Upon successful login,
* creates a Restlet User object based values in GAE user object. The GAE
* "nickname" property gets mapped to the Restlet "firstName" property.
*
* @param request
* The request sent.
* @param response
* The response to update.
* @return True if the authentication succeeded.
*/
@Override
protected boolean authenticate(Request request, Response response) {
ClientInfo info = request.getClientInfo();
if (info.isAuthenticated()) {
// The request is already authenticated.
return true;
} else if (userService.isUserLoggedIn()) {
// The user is logged in, create restlet user.
com.google.appengine.api.users.User gaeUser = userService
.getCurrentUser();
User restletUser = new User(gaeUser.getUserId());
restletUser.setEmail(gaeUser.getEmail());
restletUser.setFirstName(gaeUser.getNickname());
info.setUser(restletUser);
info.setAuthenticated(true);
return true;
} else {
// The GAE user service says user not logged in, let's redirect him
// to the login page.
String loginUrl = userService.createLoginURL(request
.getOriginalRef().toString());
response.redirectTemporary(loginUrl);
return false;
}
}
}