3

我可以独立配置: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接受第一个成功的身份验证策略并停在那里?

4

1 回答 1

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

于 2014-01-17T14:53:42.847 回答