読者です 読者をやめる 読者になる 読者になる

解決済み:cancancanでread権限を設定してもあるページが閲覧できない

Ruby on Rails

2016/5/18に解決しました。
原因と解決方法は下部に記載しています。

やろうとしていること

CanCanCanという権限管理のgemを使用し、権限ごとにModelの操作に制限をつけようとしている。
GitHub - CanCanCommunity/cancancan: Continuation of CanCan, the authorization Gem for Ruby on Rails.

環境

困っていること

あるModelのついて閲覧(read)のみ可能にしたい場合、
readのみ許可では権限がないことになってしまう。
現在は一旦全アクションに対して権限を付与(manage)し、禁止したいアクションをcannotで指定するという形をとっている。

正しく動作しない例:

if user.admin?
  can :manage, :all
elsif user.member?
  can :read, [Hoge, Humu]
end

現在の暫定的な対処:

if user.admin?
  can :manage, :all
elsif user.member?
  can :manage, [Hoge, Humu]
  cannot [:create, :update, :destroy], [Hoge, Humu]
end

上記の正しく動作しない例の状態で、Hogeを閲覧するようなページに遷移すると
権限がないためエラーメッセージが表示される。
「You are not authorized to access this page.」

readを許可するだけでは閲覧は許可されないのかを知りたい。

参考にしたサイト

解決した内容(2016/5/18追記)

原因

該当ページ閲覧時に独自で作成したアクションが呼び出されるようになっていたため。
独自のアクションも許可する必要があった。

解決方法

if user.admin?
  can :manage, :all
elsif user.member?
  can [:read, :original_acthion], [Hoge, Humu]
end

調査は下記ページを参考に行った。
Debugging Abilities · CanCanCommunity/cancancan Wiki · GitHub

デバッグログは上記ページを参考にした。

Rails.logger.debug "Access denied on #{exception.action} #{exception.subject.inspect}"

これで「どのモデル」の「どのアクション」に権限がないのかがわかった。


るっびー先輩、ありがとうございました。