3

次のエラーが表示されます。

  undefined method `can_read?' for nil:NilClass

..ログアウトしたユーザーで製品ページにアクセスしようとしたとき。現時点で私が持っている

class ProductAuthorizer < ApplicationAuthorizer

  def self.readable_by?(user)
    true
  end

end

ログインしていないユーザーでもページを閲覧できるようにしたい。これは可能ですか?

デフォルトのユーザーメソッドを次のように変更してみました:

config.user_method = :current_user ||= User.new

ただし、これにより問題が発生し、サーバーが起動しません。

4

1 に答える 1

8

わかりましたhttps://github.com/nathanl/authority/pull/32でこれを見つけました:

わかった!この号を読んでいる他の誰かのために、Chris と私は話し合って、最善の進め方について合意しました。これがその要点です。

Authority は、nil ユーザーを特別に処理したり、そうするための特定のオプションを提供したりしません。権限を承認に制限し、認証を完全に分離したいと考えています。サインインしているユーザーがいない場合、それは認証の問題です。オーソリティは、「このユーザーは X を実行できますか?」という質問に有意義に答えることができません。ユーザーまたはそのようなものを与えられていない場合。

哲学的な点に加えて、認証を処理することで、ユーザー エクスペリエンスが向上します。管理者がサインインするのを忘れて、管理者のみのアクションを試みた場合、「アクセスが拒否されました」と言って混乱する可能性があります。「サインインしてください」と言う方がはるかに役に立ちます。

Authority を使用する開発者ができることは次のとおりです。

Devise の before_filter :authenticate_user! のようなものを用意してください。リクエストの機関チェックの前に実行されます(承認を必要とするアクションには明らかに認証が必要なため)。ユーザーメソッドに、ユーザーのように鳴く NullUser オブジェクトを返させ、オーソライザーにそれらをどうするかを知らせます。権限ができることは、nil またはユーザーのように鳴かないものを渡した場合に発生するエラーを改善することです。 . クリスはこれを実装する予定です。

こんにちは、これを入れました

  class ApplicationController < ActionController::Base
      def current_or_null_user
        if current_user == nil
          User.new
        else
          current_user
        end
     end
  end

...

Authority.configure do |config|
   config.user_method = :current_or_null_user
end
于 2013-04-20T01:01:14.213 に答える