12

ruby で安らかな json api を作成しようとしているので、Rack 内でグレープ ( https://github.com/intridea/grape ) を使用しています。私はこのプロジェクトに Rails を使用していないので、cancan や sorcery などは最適な選択肢ではないようです。さらに、グレープの宣言型 DSL に一連の命令型ロジックを混ぜるのは嫌いです。

グレープには認証サポートが組み込まれていますが、承認については何もわかりません。これは、この道が以前に通ったことのある十分に一般的な使用例のようですが、Google とブドウのコードベース自体をかなり徹底的に掘り下げた後、何も見つかりませんでした。

ブドウのプロジェクトにこのようなものを実装した人はいますか? 何を使いましたか?

4

3 に答える 3

8

これは少し遅すぎるかもしれませんが、とにかく。承認にはPunditを使用することをお勧めします。これは非常に簡単です。Grape API エンドポイントで使用するには、Pundit ヘルパーを含める必要があります。

class API < Grape::API
  format :json

  helpers Pundit
  helpers do
    def current_user
      resource_owner
    end
  end

  mount FoosAPI
end

authorize foo, action?これで、API エンドポイントで、Rails コントローラーでいつも行っているように使用できるようになります。

class FoosAPI < Grape::API
  get ':id' do
    foo = Foo.find(params[:id])
    authorize foo, :show?
    present foo, with: FooEntity
  end
end

それが役に立てば幸い!

于 2015-06-26T03:56:57.967 に答える
1

私の答えがあなたに間に合うかどうかわかりません。私は最近、Rails4 プロジェクトのGrape承認に関して同じ問題を抱えています。そして試した後、私はこれのための方法を見つけました。私のプロジェクトでは、承認にパンディットを使用しています。ポリシーフォルダーを作成し、各モデルの承認ルールを作成するように求められます。各ルールはRubyクラスであり、このようなものです(パンディットGithubページから)

class PostPolicy < ApplicationPolicy
  def update?
    user.admin? or not record.published?
  end
end

次に、Grape API で、このクラスを認証に使用します。コードは次のようになります。

desc "hide a post"
post :hide do
  authenticate!
  error!( "user unauthorized for this" ) unless PostPolicy.new(current_user, @post).hide_post?
  @post.update hidden: true
  { hidden: @post.hidden }
end

authenticate!およびcurrent_userヘルパーは、カスタマイズされたヘルパーです。これにより、Web サイトのパーツを開発するときに作成した承認ルールを再利用できます。

これは私にとってはうまくいきます。Punditの方法でGrape 認証の問題を解決できることを願っています

于 2014-11-17T16:55:22.083 に答える
1

これについて簡単にコメントできると思いましたが、フィールドが短すぎます。正解ではない場合は申し訳ありませんが、

あなたは魔術について言及しました-それは認証システムであり、承認とは何の関係もないと思います. (私はソーサリージェムの実装を知りません-ドキュメントからのステートメントを繰り返し、説明がそのようなシステムを列挙し、それが有効な定義であると仮定するだけです)。ただのミスだと思います。

自問すべき基本的な質問は...

どの程度の役割ベースのシステムを開発していますか? これが public/private/admin ロールのみの問題である場合は、別の API に移動することを検討する必要があると思います。

状況によっては面倒かもしれませんが、複雑で追加的な役割がない場合は試してみる価値があります。グレープに簡単にマウントすると、問題の OOTB が解決されます。

本当の問題は、拡張可能/動的な役割システムについて考えている場合、または単に DRY になりたい場合です。それは痛いかもしれません;-)。Rayan の Bytes cancan gem 実装は、このような問題をより高い抽象レベルで解決する方法を理解するのに役立つはずです。特定の (より高度な抽象化を伴わない - 動的ロールなど) 実装では、グレープから現在与えられているヘルパーを使用し、その責任をモデルに委譲するだけで問題ありません (基本的な使用法)。

helpers do
  def current_user
    @current_user ||= User.authorize!(env)
  end

  def authenticate!
    error!('401 Unauthorized', 401) unless current_user
  end
end

したがって、すべての話は User.authorize!(env) を実装する方法に関するものであり、それはモデルで行う必要があり、ニーズに厳密に依存すると思います。

于 2013-02-21T19:31:47.807 に答える