【问题标题】:Can I use token_authenticable (from Devise) on a different model than my main authentication model in Rails 3?我可以在与 Rails 3 中的主要身份验证模型不同的模型上使用 token_authenticable(来自 Devise)吗?
【发布时间】:2011-04-04 09:51:22
【问题描述】:

我有一个由 Devise 管理的用户模型 - 即所有用户都有电子邮件 addy/username/pass 等。如果用户登录,根据他们的权限,他们可以访问 不同的东西。效果很好。

但是我有一个客户端模型,我想授予一个令牌,以便他们可以访问一个特定控制器上的一个特定操作。

理想情况下,我想为客户端 john.brown@abc.com 生成一个令牌(请记住,这不是 User.email,而是 Client.email),以便他们可以访问我的 compare 操作 stages 控制器,其中 stage 的 id 为 7

我不希望他们能够访问除 id7 之外的任何其他阶段,并且我不希望他们必须登录。即,一旦他们访问该特定 URL(例如,myapp.com/stages/7/compare?token={unique token generated by devise})他们可以看到它。但他们不能拿那个令牌去stages/8/compare

我可以使用 Devise 做到这一点吗?

如果是这样,怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 devise


    【解决方案1】:

    Devise 的TokenAuthenticatable 策略的目的是通过令牌登录一个Devise 管理的用户。因此,devise 必须已经管理您正在登录的模型,而且在您的应用程序中,Client 似乎没有由 Devise 管理。在这种情况下,我认为它不会对您有所帮助。

    【讨论】:

    • 你是对的。我的Client 模型不受设计管理。但是你确定它不能用在其他型号上吗?正如我所说,这是我的第一个想法,但有人告诉我不是这样,我无法让他们给我更多细节,而且设计文档不足以在这里教育我。
    • 我以前错了,但对我来说听起来不对。如果 Devise 不管理模型,为什么 Devise 会登录呢?现在,也许您可​​以将 Devise 添加到 Client 模型中,仅使用 token_authenticatable 作为登录策略,然后从那里开始,保存一些与客户端应该有权访问的内容相关的额外数据。但是,请注意 Devise 令牌是每个模型的,而不是听起来像你想要的“每个权限”(例如,Client 可能有多个令牌,每个令牌用于不同的比较 URL)。但 IMO 设计对此有点过分了——只需给 Client 很多 tokens 提供相关数据即可。
    • Hrmm.....好吧,我已经开始为客户提供许多令牌的过程 - 但下一步是创建一个连接表,其中包含stage_idclient_id、@987654333 @(在 Client 模型上生成)。我写了一个自定义的generate_client_token 方法,所以考虑到所有这些,现在使用 Devise 有什么好处吗?我的方法只是代币。没有什么比得上 Devise 的了。
    • 我的直觉是说不,不是真的,但你仍然需要管理在会话中保存一些信息,详细说明哪个客户端是“活动的”(又名“登录”:) 或哪个他们可以访问的阶段。根据您希望应用程序的工作方式,您可能会从每个客户一个令牌的想法中受益(因此 Devise 会提供帮助)。
    • 是的。请参阅 this SO answerthis documentation。我不能 100% 确定“向下”迁移会是什么——我记得在某处看到过,但乍一看却找不到。
    【解决方案2】:

    Devise 主要进行身份验证。你需要一个授权插件。例如,尝试使用cancan (https://github.com/ryanb/cancan)。这将允许您向用户授予“角色”并授权他们执行(或不执行)某些操作。

    还有一个 Railscast 可用:http://railscasts.com/episodes/192-authorization-with-cancan

    【讨论】:

    • 我已经使用 decl_auth 来做到这一点。我知道 Devise 有 token_authenticable 并且今天被告知我可以用它来做我想做的事,但我没有得到任何更多的指示。我搜索了 Devise 的文档,但没有看到太多关于我的具体要求的讨论。所以想我会在这里问。这更多的是一次性身份验证 - 除了由 decl_auth 管理的内容 + 用于常规用户授权的设计。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 2016-04-11
    • 2018-03-06
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多