3

:database_authenticatableまたはのいずれかを個別に構成できます:ldap_authenticatable。1 つは Rails SQLite 開発データベースに対して認証し、もう 1 つは会社の 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' に対して 1 行を返します (電子メール フィールドの不一致についてはログイン列を無視してください)。問題はdevise、失敗した LDAP 認証を続行することです。devise最初に成功した認証戦略を受け入れ、そこで停止するにはどうすればよいでしょうか?

4

1 に答える 1

3

これは古い質問だと思いますが、Google 検索で出てきたので、到達する可能性のある他の人のために回答します。

1 つのユーザー モデルでこのような 2 種類の認証を行うことはできないと思います。私が行った方法は、ユーザーモデルで単一テーブル継承を使用することです。

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 をセットアップできます。ただし、これにより 2 つのログイン フォームが作成されます。ユーザーは、自分が実際にどのタイプのユーザーであるかを知る必要はないため、これらを 1 つのシステムに組み合わせることが最善です。

以前にこれについて質問しましたが、最終的に解決策を見つけることができたので、この質問に対する私の回答を読むことをお勧めします: https://stackoverflow.com/a/21175515/166210

于 2014-01-17T14:53:42.847 に答える