Skip to content

Commit da0584a

Browse files
committed
Keep compatibility with existing can :dashboard style ability
1 parent a32d49e commit da0584a

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

lib/rails_admin/extensions/cancancan/authorization_adapter.rb

+21-6
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,35 @@ module CanCanCan
55
class AuthorizationAdapter < RailsAdmin::Extensions::CanCan::AuthorizationAdapter
66
def authorize(action, abstract_model = nil, model_object = nil)
77
return unless action
8-
action, subject = resolve_action_and_subject(action, abstract_model, model_object)
9-
@controller.current_ability.authorize!(action, subject)
8+
subject = model_object || abstract_model && abstract_model.model
9+
if authorized_for_dashboard_in_legacy_way?(action)
10+
subject
11+
else
12+
@controller.current_ability.authorize!(*resolve_with_compatibility(action, subject))
13+
end
1014
end
1115

1216
def authorized?(action, abstract_model = nil, model_object = nil)
1317
return unless action
14-
action, subject = resolve_action_and_subject(action, abstract_model, model_object)
15-
@controller.current_ability.can?(action, subject)
18+
subject = model_object || abstract_model && abstract_model.model
19+
authorized_for_dashboard_in_legacy_way?(action, true) ||
20+
@controller.current_ability.can?(*resolve_with_compatibility(action, subject))
1621
end
1722

1823
private
1924

20-
def resolve_action_and_subject(action, abstract_model, model_object)
21-
subject = model_object || abstract_model && abstract_model.model
25+
def authorized_for_dashboard_in_legacy_way?(action, silent = false)
26+
return false unless action == :dashboard
27+
legacy_ability = @controller.current_ability.permissions[:can][:dashboard]
28+
if legacy_ability && (legacy_ability.empty? || legacy_ability.all?(&:empty?))
29+
ActiveSupport::Deprecation.warn('RailsAdmin CanCanCan Ability with `can :dashboard` is old and support will be removed in the next major release, use `can :read, :dashboard` instead. See https://github.com/sferik/rails_admin/issues/2901') unless silent
30+
true
31+
else
32+
false
33+
end
34+
end
35+
36+
def resolve_with_compatibility(action, subject)
2237
if subject
2338
[action, subject]
2439
else

spec/integration/authorization/cancancan_spec.rb

+23
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,27 @@ def initialize(user)
340340
end
341341
end
342342
end
343+
344+
describe 'with existing dashboard ability which uses no subject' do
345+
class LegacyDashboardAbility
346+
include CanCan::Ability
347+
def initialize(_)
348+
can :access, :rails_admin
349+
can :dashboard
350+
end
351+
end
352+
353+
before do
354+
RailsAdmin.config { |c| c.authorize_with :cancancan, LegacyDashboardAbility }
355+
@user = FactoryGirl.create :user
356+
login_as @user
357+
end
358+
359+
it 'shows dashboard with instruction on how to migrate to new ability notation' do
360+
allow(ActiveSupport::Deprecation).to receive(:warn)
361+
expect(ActiveSupport::Deprecation).to receive(:warn).with(/can :read, :dashboard/)
362+
visit dashboard_path
363+
is_expected.to have_content('Dashboard')
364+
end
365+
end
343366
end if defined?(CanCanCan)

0 commit comments

Comments
 (0)