使用Devise进行Rails app本地和远程身份验证(2策略)

时间:2013-08-20 14:05:44

标签: ruby-on-rails devise warden

我正在尝试使用Devise设置2个身份验证策略 标准的(:database_authenticable),如果这个失败,则对另一个远程服务器执行另一次尝试: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

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

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

但是我没有看到如何实现它......

3 个答案:

答案 0 :(得分:1)

虽然我在这里没有具体的技术建议,但我可以报告,在2015年1月,我花了大约2天试图获得4trabes建议(上面和其他地方引用堆栈溢出),以实现绝对完整和破碎失败。我不清楚Devise中的远程身份验证实际上是否完全正常。我能够

答案 1 :(得分:0)

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

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

使用:密码策略。您可以使用多种策略,每种策略都将按顺序进行尝试,直到其中一个停止或没有停止。

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

这将使用:密码,如果失败,那么:基本策略。

答案 2 :(得分:0)

设计初始化程序中的warden块定义了warden配置中的策略数组,

require 'devise/strategies/remote_authenticable'

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

然而:远程策略被列为第一个......

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

所以我修改了我的users / sessions_controller中的#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