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