Implement the cancan filters for diary entries
Access logic is not _entirely_ exported from the controller, unfortunately. For interface reasons, some actions which require admin have to be listed within the controller's deny_access method. This is required because, being a default-deny system, cancancan _cannot_ tell you the reason you were denied access; and so the "nice" feedback presenting next steps can't be gleaned from the exception
This commit is contained in:
parent
6b44a1976c
commit
5232914427
3 changed files with 64 additions and 11 deletions
|
@ -3,13 +3,15 @@ class DiaryEntryController < ApplicationController
|
|||
|
||||
before_action :authorize_web
|
||||
before_action :set_locale
|
||||
before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
|
||||
|
||||
authorize_resource
|
||||
|
||||
before_action :lookup_user, :only => [:view, :comments]
|
||||
before_action :check_database_readable
|
||||
before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
|
||||
before_action :require_administrator, :only => [:hide, :hidecomment]
|
||||
before_action :allow_thirdparty_images, :only => [:new, :edit, :list, :view, :comments]
|
||||
|
||||
|
||||
def new
|
||||
@title = t "diary_entry.new.title"
|
||||
|
||||
|
@ -215,6 +217,22 @@ class DiaryEntryController < ApplicationController
|
|||
|
||||
private
|
||||
|
||||
# This is required because, being a default-deny system, cancancan
|
||||
# _cannot_ tell you the reason you were denied access; and so
|
||||
# the "nice" feedback presenting next steps can't be gleaned from
|
||||
# the exception
|
||||
##
|
||||
# for the hide actions, require that the user is a administrator, or fill out
|
||||
# a helpful error message and return them to the user page.
|
||||
def deny_access(exception)
|
||||
if current_user && exception.action.in?([:hide, :hidecomment])
|
||||
flash[:error] = t("user.filter.not_an_administrator")
|
||||
redirect_to :action => "view"
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# return permitted diary entry parameters
|
||||
def entry_params
|
||||
|
@ -229,15 +247,6 @@ class DiaryEntryController < ApplicationController
|
|||
params.require(:diary_comment).permit(:body)
|
||||
end
|
||||
|
||||
##
|
||||
# require that the user is a administrator, or fill out a helpful error message
|
||||
# and return them to the user page.
|
||||
def require_administrator
|
||||
unless current_user.administrator?
|
||||
flash[:error] = t("user.filter.not_an_administrator")
|
||||
redirect_to :action => "view"
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# decide on a location for the diary entry map
|
||||
|
|
|
@ -7,8 +7,16 @@ class Ability
|
|||
can :index, :site
|
||||
can [:permalink, :edit, :help, :fixthemap, :offline, :export, :about, :preview, :copyright, :key, :id, :welcome], :site
|
||||
|
||||
can [:list, :rss, :view, :comments], DiaryEntry
|
||||
|
||||
if user
|
||||
can :weclome, :site
|
||||
|
||||
can [:create, :edit, :comment, :subscribe, :unsubscribe], DiaryEntry
|
||||
|
||||
if user.administrator?
|
||||
can [:hide, :hidecomment], [DiaryEntry, DiaryComment]
|
||||
end
|
||||
end
|
||||
# Define abilities for the passed in user here. For example:
|
||||
#
|
||||
|
|
|
@ -4,4 +4,40 @@ require "test_helper"
|
|||
|
||||
class AbilityTest < ActiveSupport::TestCase
|
||||
|
||||
test "diary permissions for a guest" do
|
||||
ability = Ability.new(nil, [])
|
||||
[:list, :rss, :view, :comments].each do |action|
|
||||
assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
|
||||
end
|
||||
|
||||
[:create, :edit, :comment, :subscribe, :unsubscribe, :hide, :hidecomment].each do |action|
|
||||
assert ability.cannot?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
|
||||
assert ability.cannot?(action, DiaryComment), "should be able to #{action} DiaryEntries"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
test "Diary permissions for a normal user" do
|
||||
ability = Ability.new(create(:user), [])
|
||||
|
||||
[:list, :rss, :view, :comments, :create, :edit, :comment, :subscribe, :unsubscribe].each do |action|
|
||||
assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
|
||||
end
|
||||
|
||||
[:hide, :hidecomment].each do |action|
|
||||
assert ability.cannot?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
|
||||
assert ability.cannot?(action, DiaryComment), "should be able to #{action} DiaryEntries"
|
||||
end
|
||||
end
|
||||
|
||||
test "Diary for an administrator" do
|
||||
ability = Ability.new(create(:administrator_user), [])
|
||||
[:list, :rss, :view, :comments, :create, :edit, :comment, :subscribe, :unsubscribe, :hide, :hidecomment].each do |action|
|
||||
assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
|
||||
end
|
||||
|
||||
[:hide, :hidecomment].each do |action|
|
||||
assert ability.can?(action, DiaryComment), "should be able to #{action} DiaryComment"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue