Java 经过身份验证的REST请求是否总是意味着数据库请求?

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本身)的无状态特性,每个请求都意味着对数据库的请求 我的问题是:是否可以不对每个经

我正在使用RESTeasy框架开发我的web服务。我已经成功地设置了基本身份验证,现在它工作正常。当然,我确实计划在此基础上使用SSL

过程很简单(如果您不知道这是关于什么的,请了解HTTP basic Auth):

  • 每个请求都被一个分析请求头的方法截获
  • 此标题被解码,用户名和密码被提取
  • 然后,该方法查询数据库,检查用户名和密码是否匹配
  • 如果它们与请求匹配,则返回401代码
  • 使用这种方法,由于REST(以及HTTP本身)的无状态特性,每个请求都意味着对数据库的请求

    我的问题是:是否可以不对每个经过身份验证的请求查询数据库

    可能的提示:一些使用cookie的机制

    这个问题在技术上是不可知的


    作为旁注:

    我真的觉得关于这件事的信息很少。它只是一个,一个,一个。。。如果我们不想对第三方应用程序进行身份验证,那么信息到处都是,而且没有任何具体的例子,比如使用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;
            }
        }
    }