gpt4 book ai didi

ruby-on-rails - 使用设计堆叠 database_authenticatable 和 ldap_authenticatable

转载 作者:行者123 更新时间:2023-12-04 03:46:46 24 4
gpt4 key购买 nike

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

最佳答案

我知道这是一个老问题,但它出现在 Google 搜索中,所以我会为可能找到它的其他人回答。

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

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

关于ruby-on-rails - 使用设计堆叠 database_authenticatable 和 ldap_authenticatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12144533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com