0

Spree::User モデル クラスに STI で継承を追加しました。(Spree::Guest、Spree::Writer、または Spree::Reader) の :type 列があります。

管理者側の認証では、ライターとリーダーのみを認証したいと考えています。この問題を解決するための最良の選択肢は何ですか?

create アクションを次のようなものにオーバーライドしようとしました。

def create
  authenticate_spree_user!

  if spree_user_signed_in? && (spree_current_user.role?(:writer) || spree_current_user.role?(:reader))
    respond_to do |format|
      format.html {
        flash[:success] = Spree.t(:logged_in_succesfully)
        redirect_back_or_default(after_sign_in_path_for(spree_current_user))
      }
      format.js {
        user = resource.record
        render :json => {:ship_address => user.ship_address, :bill_address => user.bill_address}.to_json
      }
    end
  else
    flash.now[:error] = t('devise.failure.invalid')
    render :new
  end
end

この場合、タイプ :guest のユーザーで認証しようとすると、無効な失敗メッセージ (ok) で新しいアクションにリダイレクトされますが、何らかの理由でユーザーは認証されます (nok)。

4

1 に答える 1

1

それを解決する良い方法だとは思いません。コントローラーは単なるコントローラーでなければなりません。私はむしろそのように行きたい:

Spree は認証にcancancan (または古いブランチでは cancan) を使用し、それがSpree の実装方法です。なぜその STI ソリューションが必要なのかわかりません。そのための新しいカスタムSpree::Roleを作成するだけですが、前述したように、なぜ STI の方法を選択したのかわかりません。それもうまくいくはずです。とにかく、その機能ファイルのデコレーターを追加して、追加のチェックなどを追加するか、user.is_a? Spree::Guest新しい機能をregister_ability次のように登録することができます

3 番目のリンクの最も重要な部分 (またはリンクが切れた場合):

# create a file under app/models (or lib/) to define your abilities (in this example I protect only the HostAppCoolPage model):

Spree::Ability.register_ability MyAppAbility

class MyAppAbility
  include CanCan::Ability

  def initialize(user)
    if user.has_role?('admin')
      can manage, :host_app_cool_pages
    end
  end

end

個人的にはデコレータオプションを使用します(コードは少し不明瞭ですが、誰が何を管理できるかを判断する場合はよりクリーンです-能力の優先順位について覚えておいてください)が、それはあなた次第です。ご不明な点がございましたら、お気軽にお問い合わせください。できる限りお手伝いさせていただきます。

編集:一部のユーザーの認証を無効にしたい場合は、既存のDeviseメソッドを活用するだけでよいでしょうか? このようなもの(あなたのuserモデルで):

def active_for_authentication?
  super && self.am_i_not_a_guest? # check here if user is a Guest or not
end

def inactive_message
  self.am_i_not_a_guest? ? Spree.t('devise.failure.invalid') : super # just make sure you get proper messages if you are using that module in your app
end
于 2015-07-14T12:59:51.180 に答える