Ruby on rails Rails应用程序使用Desive进行本地和远程身份验证(2种策略)

Ruby on rails Rails应用程序使用Desive进行本地和远程身份验证(2种策略),ruby-on-rails,devise,warden,Ruby On Rails,Devise,Warden,我正在尝试使用Deave设置两种身份验证策略 标准服务器(:database_authenticable),如果此服务器失败,则对另一个远程服务器执行另一次尝试:remote(如上所述) 如果我在designe.rb初始值设定项中添加config.warden块 config.warden do |manager| manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable) manager.defa

我正在尝试使用Deave设置两种身份验证策略 标准服务器(:database_authenticable),如果此服务器失败,则对另一个远程服务器执行另一次尝试:remote(如上所述)

如果我在designe.rb初始值设定项中添加config.warden块

config.warden do |manager|
  manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable)
  manager.default_strategies(:scope => :user).unshift :remote
end
然后:远程成为默认策略,但这不是我想要的。。 我希望首先设计::策略::DatabaseAuthenticatable,如果失败,则设计::策略::RemoteAuthenticatable

我知道这是可能的,因为典狱长接受级联策略。。。。 如使用策略中所述


但我不知道如何实现它…

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

env['warden'].authenticate(:password)
使用:密码策略。您可以使用多种策略,每种策略都将按顺序进行尝试,直到其中一种策略停止或没有停止

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

这将使用:密码,否则使用:基本策略。

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

env['warden'].authenticate(:password)
使用:密码策略。您可以使用多种策略,每种策略都将按顺序进行尝试,直到其中一种策略停止或没有停止

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

这将使用:密码,否则使用:基本策略。

设计初始值设定项中的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]
因此,我修改了我的用户/会话控制器中的#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)

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

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]
因此,我修改了我的用户/会话控制器中的#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)

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

虽然我这里没有具体的技术建议,但我可以报告,在2015年1月,我花了大约2天的时间试图获得4trabes建议(上面和其他关于堆栈溢出的引用)工作到了绝对完全和毁灭性的失败。我不清楚Desive中的远程身份验证是否真的能完全工作。我能够

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

谢谢,我在warden wiki中阅读了它。但是如何使用Desive(在Desive初始值设定项中…)来规定它。我想我首先需要删除默认设置(manager.default_strategies(:scope=>:user)。unshift:remote)因此默认值将返回到:database_authenticable(designe)并添加到某处:env['warden'].authenticate(:database_authenticable,:remote),这似乎是在会话中调用的#在designe中创建..?谢谢,我在warden wiki中读到了它..但是如何用designe来规定它呢(在designe初始值设定项中…)我想我首先需要删除默认值(manager.default\u strategies(:scope=>:user)。unshift:remote),这样默认值将返回到:database\u authenticable(designe)并添加到某处:env['warden']。authenticate(:database\u authenticable,:remote)这似乎是在会话中调用的#在designe中创建..?嘿@erwin,我无法让它工作。事实上,“创建”操作是在执行任何策略后调用的,无论是默认策略(数据库可验证)还是新的远程策略。我添加了“放置”验证哪一个先被调用的语句。你认为我缺少什么?这有点晚了,但我认为你可以在策略文件的末尾添加
Warden::Strategies.add:remote,RemoteAuthenticatable
designe.add_module:remote,:strategy=>true
或类似的内容(未测试)。(参见示例。)嘿@erwin,我无法让它工作。事实上,“创建”操作是在执行任何策略后调用的,无论它是默认策略(database_Authenticatable)还是新的远程策略。我添加了“puts”验证哪一个先被调用的语句。你认为我缺少什么?这有点晚了,但我认为你可以在策略文件的末尾添加
Warden::Strategies.add:remote,RemoteAuthenticatable
designe.add_module:remote,:strategy=>true
或类似的内容(未测试)。(请参见示例。)我正在尝试在一个新项目的设计设置中获取远程身份验证,我正在关注同一篇博文。您是否有任何进展?我正在尝试在一个新项目的设计设置中获取远程身份验证,我正在关注同一篇博文。您是否有任何进展?