すべてのユーザー認証コードを1つの場所、つまりlib/auth.rbに配置しました。次のようになります。
lib / auth.rb
module Admin
def do_i_have_permission_to?(permission)
# Code to check all of this goes here
end
end
このモジュールをアプリケーションヘルパーの一部として含めているので、これらの関数はすべてのビューで使用できます。
application_helper.rb
require 'auth'
module ApplicationHelper
include Admin
# other stuff here
end
また、アプリケーションコントローラーの一部として含めるので、コントローラーも同様に関数を呼び出すことができます。
application.rb
require 'auth'
class ApplicationController < ActionController::Base
include Admin
end
ここまでは順調ですね。
問題は、私のアプリケーションが通常のWebアプリとは異なることです。具体的には、複数のユーザーが同じコンピューターから同時に(同じブラウザーを使用して)システムにログインできます。そのIPからログインしているすべての人を見て、アクションの認証を行います。すべての人がそれを実行できる場合は、合格します。
これが意味することは、管理者が何かをしたい場合、その管理者は最初に他のすべての人をログアウトしなければならないということです。これは面倒です。ただし、管理者が行うすべてのことについて、管理者による承認のシールが必要です。したがって、私に与えられた提案は、管理者が通常はアクセスできない任意のページでユーザー名とパスワードの組み合わせを提供できるようにすることでした(たとえば、「ユーザーの編集」ページにはこれらの追加の入力フィールドがあります)。それを確認してください。これの意味は
Admin::do_i_have_permission_to?(permission)
現在のリクエストパラメータを取得する必要があります。paramsが定義されていないため、コントローラーのようにparams [:foo]を使用することはできません。同様に、request.parameters [:foo]も機能しません。私の検索は明らかにしました:
- 現在の検索パラメータは現在のリクエストに含まれています。
- 現在のリクエストは現在のコントローラーにあります。
- 現在のコントローラーは現在のディスパッチャーにあり、
- 現在のディスパッチャがどこかに保管されているかどうかはわかりません。
とは言うものの、経験から、私がこれほど多くのフープを飛び越えているとき、私はおそらくそれを間違っていると思います。それで、それを行う正しい方法は何ですか?私が検討したオプションは次のとおりです。
- 現在auth.rbにあるすべての関数をApplicationHelperに移動するだけで、リクエストなどにアクセスできるようになります(私は思います)。動作しますが、ヘルパーから地獄を乱雑にします。
- すべての関数を別の場所に移動すると、それらのメソッドが表示されます(どこにあるかわかりません)
- 私はただ何かが欠けているだけです。