使用devise堆叠database_authenticatable和ldap_authenticatable

时间:2012-08-27 14:59:46

标签: ruby-on-rails devise

我可以独立配置:database_authenticatable:ldap_authenticatable;第一个针对我的Rails SQLite开发数据库进行身份验证,另一个针对我公司的LDAP / Active Directory服务器进行身份验证。

我现在想要做的是堆叠两种身份验证。如果用户对数据库进行了身份验证,那么很好;如果不是那么检查LDAP(并最终创建用户)。我已经尝试过显而易见的事了:

devise :database_authenticatable, :ldap_authenticatable, :rememberable, :trackable

用户首先按照预期对数据库进行身份验证:

User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."login" = 'test@test.com' LIMIT 1

查询为用户'test@test.com'返回一行(忽略电子邮件字段差异的登录列)。问题是devise然后继续进行失败的LDAP身份验证。我如何告诉devise接受第一个成功的身份验证策略并停在那里?

1 个答案:

答案 0 :(得分:3)

我意识到这是一个老问题,但它出现在谷歌搜索中,所以我会为可能达到它的其他人回答。

我不认为可以通过一个用户模型进行这样的两种类型的身份验证。我这样做的方法是在用户模型上使用单表继承。

class User < ActiveRecord::Base
end

class LdapUser < User
  devise :ldap_authenticatable, :rememberable, :trackable
end

class LocalUser < User
  devise :database_authenticatable, :registerable, :confirmable, :recoverable, :trackable
end

在数据库中只创建User,但创建它时包含两个继承模型中的所有字段。它还需要一个额外的列type,这是一个字符串。这允许Rails / ActiveRecord推断模型和继承结构,并使其正常工作。

然后,您可以设置Devise以提供每个模型所需的路径。然而,这导致有两个登录表单。用户不必知道他们真正的用户类型,因此最好将这些用户组合到一个系统中。

之前我问了一个关于此的问题,但最终成功找到了解决方案,所以我建议阅读这个问题的答案:https://stackoverflow.com/a/21175515/166210