解決済み:cancancanでread権限を設定してもあるページが閲覧できない
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を許可するだけでは閲覧は許可されないのかを知りたい。
参考にしたサイト
- Rails: CanCanでアクションごとに権限を設定する方法 - Qiita
- How to use CanCan / CanCanCan - Qiita
- Rails4でCanCanCanによる権限管理 [俺の備忘録]
解決した内容(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}"
これで「どのモデル」の「どのアクション」に権限がないのかがわかった。
るっびー先輩、ありがとうございました。