0

条件 X が満たされた場合に、ログインしているユーザーに特定の controller#action へのアクセスのみを許可する最良の方法は何でしょうか?

  • たとえば、ユーザーが自分のアカウントを非アクティブ化した ( user.is_deleted == true )
  • ユーザーがログインした場合、ユーザーを /reactivate にリダイレクトしたい
  • ユーザーが /profiles /search などの他の URL を試した場合、/reactivate にリダイレクトする必要があります。

ログインとログアウトの方法を除いて、applicationcontrollerでbefore_filtersを試しましたが、他のアクションと正しく機能しないため、これを行うためのクリーンな方法を本当に探しています。誰か提案はありますか?

現在、私はを使用しています

def after_sign_in_path_for(resource)
  @user = User.where(:id => current_user.id).first

  if @user.is_deleted == true
    "/reactivate"
  end

終わり

しかし*これはユーザーログインでのみ機能します* その後、/ home / searchなどのようなことを行うことができるので、アプリを「ロックダウン」したいと思います。カスタム コードの代わりに、can のようなものでこれを行う必要があるのではないかと考えました。

これを行うための作業中の保守可能なクリーンな方法を知っていますか?

編集:

このようなことをしました(乱雑で壊れていることがわかります)

  def welcome_redirect
    if user_signed_in?
      if not current_user.welcome == 0
        if not params[:controller] == "home" && params[:action] == "welcome"
          if not params[:controller] == "modal"
            if not params[:controller] == "profiles"
              redirect_to profiles_path
            end
          end
        end
      end
    end
  end

編集2:

これはうまくいくようです:

      def ensure_account_not_deleted
    if user_signed_in?
      @user = User.where(:id => current_user.id).first
      if params[:controller] != "users" && params[:action] != "reactivate" && @user.is_deleted == true
        redirect_to '/reactivate'
      end
    end
  end
  • フィルターの前の別の値がいくつかの値を台無しにしていたため、これが機能しませんでした。このソリューションにつながる提案のすべてthx *
4

3 に答える 3

1

どうしたの:

#Application Controller

before_filter :ensure_account_not_deleted

def ensure_account_not_deleted
  if params[:controller] != "users" && parmas[:action] != "reactivate" && @user.is_deleted == true
    redirect_to '/reactivate'
  end
end

編集:

再アクティブ化が何度もリダイレクトされるのを防ぐためのコードを書きました。

ここで、次の 2 つのことを想定しました。

  1. 再アクティブ化を処理するコントローラーは UsersController です。

  2. このアクションは「再アクティブ化」と呼ばれます

于 2012-09-05T11:37:59.800 に答える
0

また、ユーザーアカウントが無効になっている場合、そのユーザーはアプリケーションにアクセスできないようにする必要があることも同様に確認しました。やった

class SessionsController < Devise::SessionsController
  ....
  def create
    resource = build_resource
    #to check if user is active or the organisation he belongs to is active
    if current_user and current_user.organisation and (!current_user.is_active or !current_user.organisation.is_active)
      sign_out current_user
      flash[:notice] = "Account deactivated. Contact Admin."
      redirect_to root_path and return
    end
    super
  end
  ....
end

と追加

before_filter :authenticate_user!

すべてのコントローラーに

于 2012-09-05T11:44:48.320 に答える
0

私は 'root_path as root :to => "sessions#new"' を持っています。私のアプリケーションでは、すべてのユーザー (スーパー管理者を除く) が組織に属しています。スーパー管理者は、ユーザー/組織をアクティブ化/非アクティブ化できます。ユーザーが非アクティブ化されている場合、そのユーザーはログインできません。組織が非アクティブ化されている場合、その組織に属するユーザーはログインできません。1) レポートの IP アドレス n 時間でユーザーのログイン/ログアウト時間を維持するため、セッションコントローラーをオーバーライドしました。2) 会社に所属していないユーザーのログインを禁止する。3) ユーザーがアクティブかどうか、またはユーザーが所属する組織がアクティブかどうかを確認する

于 2012-09-05T12:55:34.397 に答える