gpt4 book ai didi

ruby-on-rails - 正在访问 current_user 所需的数据库吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:13 25 4
gpt4 key购买 nike

我一直在学习设置简单用户身份验证的教程。以下代码用于判断用户是否登录:

  def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end

如果我只想确保用户已登录(并且不需要用户模型的任何东西),我可以使用类似的东西吗:

def is_user_logged_in
true if session[:user_id]
end

如果我想做的只是检查用户是否已登录,这样我就不必访问数据库了。这样看起来正确吗?如果是这样,是否存在任何安全问题?

最佳答案

current_user 帮助程序因 devise 得到推广(如果你不知道的话)。

事实上,user_signed_in? 方法也是 popularized by devise :

def user_signed_in?
!!current_user
end

前段时间我看过 Devise;他们基本上建立在warden之上中间件。有一个很好的教程 here :

The Devise gem is built on top of Warden. Warden is a Rack application, which means that it runs as a separate and standalone module, and is (nearly always) executed before the chief Rails application is invoked.

Warden provides the cookie handling that verifies the identity of a logged in user via a (secure) session string, in which the id (primary key) of a particular user is somehow stored and disguised. Warden also provides a hook so your app can deal with users who aren’t currently logged in. These users will either have restricted access, or none at all, except, of course, to sign-in/sign-up pages.

Warden 可以很好地处理用户身份验证。如果您需要想法,可以看看他们是如何做到的。

[warden]

--

从技术角度来看,您所做的绝对没有错。

但是,正如所指出的,您可能遇到的问题是系统性的;验证身份验证需要保持一致,而不仅仅是在用户设置 :user_id session 后。

因此,我将执行以下操作:

  1. user_id 不应保存在 session 变量中。至少,它应该用某种盐编码。 (越少人知道你的用户数据结构越好)
  2. 我个人希望以某种方式验证身份验证。通过身份验证后,我将在 session 中创建一个 authenticated token ,我可以将其与存储的 token (有点像 oAuth)进行比较。

关于第二个建议,您可以做一件有趣的事情。有semi-persistent storage solutions (最流行的 Rails 是 Redis )这将节省数据库身份验证,同时提供 RAM 类型的数据访问...

enter image description here

Redis 基本上就像一个存储在内存中的数据库;你用它来存储 key: value 对 (JSON)。更重要的是,它允许您创建一个超轻量级的身份验证系统,为您节省昂贵的 SQL。

def user_signed_in?
return redis.get(current_user.id) ? true : false
end

虽然是一个非常粗略的示例,但它应该让您了解缓存和外部资源如何使您能够在一定程度上简化查询。

您将能够查看用户在 Redis 中是否拥有正确的 token ,从而为您提供一组“已登录”用户。没有数据库调用。

关于ruby-on-rails - 正在访问 current_user 所需的数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com