1

我正在尝试使用 Devise the standard one (:database_authenticable) 设置 2 个身份验证策略,如果此策略失败,则对另一个远程服务器执行另一次尝试:remote (如http://4trabes.com/2012/10/31/remote所述-authentication-with-devise/ )

如果我在我的 devise.rb 初始化程序中添加 config.warden 块

config.warden do |manager|
  manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable)
  manager.default_strategies(:scope => :user).unshift :remote
end

然后 :remote 成为默认策略,但这不是我要找的.. 我想先有 Devise::Strategies::DatabaseAuthenticatable 然后如果它失败了 Devise::Strategies::RemoteAuthenticatable

我知道这是可能的,因为监狱长接受级联策略.. 如https://github.com/hassox/warden/wiki/Strategies所述使用策略..

但我不知道如何实现它......

4

3 回答 3

1

虽然我在这里没有具体的技术建议,但我可以报告说,在 2015 年 1 月,我花了大约 2 天时间试图让 4trabes 建议(在上面和其他地方提到的堆栈溢出)工作到绝对完整和彻底失败。我不清楚 Devise 中的远程身份验证是否完全有效。我以前可以

于 2015-01-15T10:30:48.283 回答
0

devise 初始化程序中的warden 块在warden config 中定义了一系列策略,

require 'devise/strategies/remote_authenticable'

config.warden do |manager|
 manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable)
 manager.default_strategies(:scope => :user).unshift :remote
end

但是 :remote 策略被列为第一...

    # warden.config[:default_strategies][:user] =>  [:remote, :rememberable, :database_authenticatable]

所以我修改了我的用户/会话控制器中的#createaction,将 :remote 移动到列表的末尾

# POST /resource/sign_in
def create
    warden.config[:default_strategies][:user].push(warden.config[:default_strategies][:user].shift)
    self.resource = warden.authenticate!(auth_options)

现在,用户身份验证从 Devise (:rememberable, :database_authenticable) 开始,如果失败,则使用 :remote_authenticable 尝试远程服务器上的身份验证

于 2013-08-23T06:31:08.113 回答
0

要使用策略,请通过声明它时给出的标签来引用它。例如。

env['warden'].authenticate(:password)

使用 :password 策略。您可以使用多种策略,并且将按顺序尝试每种策略,直到其中一种被停止或没有被停止。

env['warden'].authenticate(:password, :basic)

这将使用 :password,否则使用 :basic 策略。

于 2013-08-20T14:31:24.820 回答