cancancan 1.10.0 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/cancancan.gemspec +19 -21
- data/init.rb +2 -0
- data/lib/cancan/ability/actions.rb +93 -0
- data/lib/cancan/ability/rules.rb +96 -0
- data/lib/cancan/ability/strong_parameter_support.rb +41 -0
- data/lib/cancan/ability.rb +114 -146
- data/lib/cancan/class_matcher.rb +30 -0
- data/lib/cancan/conditions_matcher.rb +147 -0
- data/lib/cancan/config.rb +101 -0
- data/lib/cancan/controller_additions.rb +38 -41
- data/lib/cancan/controller_resource.rb +59 -215
- data/lib/cancan/controller_resource_builder.rb +26 -0
- data/lib/cancan/controller_resource_finder.rb +42 -0
- data/lib/cancan/controller_resource_loader.rb +120 -0
- data/lib/cancan/controller_resource_name_finder.rb +23 -0
- data/lib/cancan/controller_resource_sanitizer.rb +32 -0
- data/lib/cancan/exceptions.rb +25 -5
- data/lib/cancan/matchers.rb +17 -3
- data/lib/cancan/model_adapters/abstract_adapter.rb +30 -9
- data/lib/cancan/model_adapters/active_record_4_adapter.rb +43 -15
- data/lib/cancan/model_adapters/active_record_5_adapter.rb +61 -0
- data/lib/cancan/model_adapters/active_record_adapter.rb +157 -82
- data/lib/cancan/model_adapters/conditions_extractor.rb +75 -0
- data/lib/cancan/model_adapters/conditions_normalizer.rb +49 -0
- data/lib/cancan/model_adapters/default_adapter.rb +2 -0
- data/lib/cancan/model_adapters/sti_normalizer.rb +47 -0
- data/lib/cancan/model_adapters/strategies/base.rb +40 -0
- data/lib/cancan/model_adapters/strategies/joined_alias_each_rule_as_exists_subquery.rb +93 -0
- data/lib/cancan/model_adapters/strategies/joined_alias_exists_subquery.rb +31 -0
- data/lib/cancan/model_adapters/strategies/left_join.rb +11 -0
- data/lib/cancan/model_adapters/strategies/subquery.rb +18 -0
- data/lib/cancan/model_additions.rb +6 -3
- data/lib/cancan/parameter_validators.rb +9 -0
- data/lib/cancan/relevant.rb +29 -0
- data/lib/cancan/rule.rb +79 -91
- data/lib/cancan/rules_compressor.rb +23 -0
- data/lib/cancan/sti_detector.rb +12 -0
- data/lib/cancan/unauthorized_message_resolver.rb +24 -0
- data/lib/cancan/version.rb +3 -1
- data/lib/cancan.rb +16 -12
- data/lib/cancancan.rb +2 -0
- data/lib/generators/cancan/ability/ability_generator.rb +4 -2
- data/lib/generators/cancan/ability/templates/ability.rb +9 -9
- metadata +82 -93
- data/.gitignore +0 -15
- data/.rspec +0 -1
- data/.travis.yml +0 -48
- data/Appraisals +0 -135
- data/CHANGELOG.rdoc +0 -495
- data/CONTRIBUTING.md +0 -23
- data/Gemfile +0 -3
- data/LICENSE +0 -22
- data/README.md +0 -197
- data/Rakefile +0 -9
- data/gemfiles/activerecord_3.0.gemfile +0 -18
- data/gemfiles/activerecord_3.1.gemfile +0 -20
- data/gemfiles/activerecord_3.2.gemfile +0 -20
- data/gemfiles/activerecord_4.0.gemfile +0 -17
- data/gemfiles/activerecord_4.1.gemfile +0 -17
- data/gemfiles/activerecord_4.2.gemfile +0 -17
- data/gemfiles/datamapper_1.x.gemfile +0 -14
- data/gemfiles/mongoid_2.x.gemfile +0 -20
- data/gemfiles/sequel_3.x.gemfile +0 -20
- data/lib/cancan/inherited_resource.rb +0 -20
- data/lib/cancan/model_adapters/active_record_3_adapter.rb +0 -47
- data/lib/cancan/model_adapters/data_mapper_adapter.rb +0 -34
- data/lib/cancan/model_adapters/mongoid_adapter.rb +0 -54
- data/lib/cancan/model_adapters/sequel_adapter.rb +0 -87
- data/spec/README.rdoc +0 -27
- data/spec/cancan/ability_spec.rb +0 -487
- data/spec/cancan/controller_additions_spec.rb +0 -141
- data/spec/cancan/controller_resource_spec.rb +0 -648
- data/spec/cancan/exceptions_spec.rb +0 -58
- data/spec/cancan/inherited_resource_spec.rb +0 -71
- data/spec/cancan/matchers_spec.rb +0 -29
- data/spec/cancan/model_adapters/active_record_4_adapter_spec.rb +0 -40
- data/spec/cancan/model_adapters/active_record_adapter_spec.rb +0 -446
- data/spec/cancan/model_adapters/data_mapper_adapter_spec.rb +0 -119
- data/spec/cancan/model_adapters/default_adapter_spec.rb +0 -7
- data/spec/cancan/model_adapters/mongoid_adapter_spec.rb +0 -227
- data/spec/cancan/model_adapters/sequel_adapter_spec.rb +0 -132
- data/spec/cancan/rule_spec.rb +0 -52
- data/spec/matchers.rb +0 -13
- data/spec/spec.opts +0 -2
- data/spec/spec_helper.rb +0 -27
- data/spec/support/ability.rb +0 -7
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CanCan
|
4
|
+
module ConditionsMatcher
|
5
|
+
# Matches the block or conditions hash
|
6
|
+
def matches_conditions?(action, subject, attribute = nil, *extra_args)
|
7
|
+
return call_block_with_all(action, subject, extra_args) if @match_all
|
8
|
+
return matches_block_conditions(subject, attribute, *extra_args) if @block
|
9
|
+
return matches_non_block_conditions(subject) unless conditions_empty?
|
10
|
+
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def subject_class?(subject)
|
17
|
+
klass = (subject.is_a?(Hash) ? subject.values.first : subject).class
|
18
|
+
[Class, Module].include? klass
|
19
|
+
end
|
20
|
+
|
21
|
+
def matches_block_conditions(subject, attribute, *extra_args)
|
22
|
+
return @base_behavior if subject_class?(subject)
|
23
|
+
|
24
|
+
if attribute
|
25
|
+
@block.call(subject, attribute, *extra_args)
|
26
|
+
else
|
27
|
+
@block.call(subject, *extra_args)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def matches_non_block_conditions(subject)
|
32
|
+
return nested_subject_matches_conditions?(subject) if subject.class == Hash
|
33
|
+
return matches_conditions_hash?(subject) unless subject_class?(subject)
|
34
|
+
|
35
|
+
# Don't stop at "cannot" definitions when there are conditions.
|
36
|
+
@base_behavior
|
37
|
+
end
|
38
|
+
|
39
|
+
def nested_subject_matches_conditions?(subject_hash)
|
40
|
+
parent, child = subject_hash.first
|
41
|
+
|
42
|
+
adapter = model_adapter(parent)
|
43
|
+
|
44
|
+
parent_condition_name = adapter.parent_condition_name(parent, child)
|
45
|
+
|
46
|
+
matches_base_parent_conditions = matches_conditions_hash?(parent,
|
47
|
+
@conditions[parent_condition_name] || {})
|
48
|
+
|
49
|
+
matches_base_parent_conditions &&
|
50
|
+
(!adapter.override_nested_subject_conditions_matching?(parent, child, @conditions) ||
|
51
|
+
adapter.nested_subject_matches_conditions?(parent, child, @conditions))
|
52
|
+
end
|
53
|
+
|
54
|
+
# Checks if the given subject matches the given conditions hash.
|
55
|
+
# This behavior can be overridden by a model adapter by defining two class methods:
|
56
|
+
# override_matching_for_conditions?(subject, conditions) and
|
57
|
+
# matches_conditions_hash?(subject, conditions)
|
58
|
+
def matches_conditions_hash?(subject, conditions = @conditions)
|
59
|
+
return true if conditions.is_a?(Hash) && conditions.empty?
|
60
|
+
|
61
|
+
adapter = model_adapter(subject)
|
62
|
+
|
63
|
+
if adapter.override_conditions_hash_matching?(subject, conditions)
|
64
|
+
return adapter.matches_conditions_hash?(subject, conditions)
|
65
|
+
end
|
66
|
+
|
67
|
+
matches_all_conditions?(adapter, subject, conditions)
|
68
|
+
end
|
69
|
+
|
70
|
+
def matches_all_conditions?(adapter, subject, conditions)
|
71
|
+
if conditions.is_a?(Hash)
|
72
|
+
matches_hash_conditions?(adapter, subject, conditions)
|
73
|
+
elsif conditions.respond_to?(:include?)
|
74
|
+
conditions.include?(subject)
|
75
|
+
else
|
76
|
+
subject == conditions
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def matches_hash_conditions?(adapter, subject, conditions)
|
81
|
+
conditions.all? do |name, value|
|
82
|
+
if adapter.override_condition_matching?(subject, name, value)
|
83
|
+
adapter.matches_condition?(subject, name, value)
|
84
|
+
else
|
85
|
+
condition_match?(subject.send(name), value)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def condition_match?(attribute, value)
|
91
|
+
case value
|
92
|
+
when Hash
|
93
|
+
hash_condition_match?(attribute, value)
|
94
|
+
when Range
|
95
|
+
value.cover?(attribute)
|
96
|
+
when Enumerable
|
97
|
+
value.include?(attribute)
|
98
|
+
else
|
99
|
+
attribute == value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def hash_condition_match?(attribute, value)
|
104
|
+
if attribute.is_a?(Array) || (defined?(ActiveRecord) && attribute.is_a?(ActiveRecord::Relation))
|
105
|
+
array_like_matches_condition_hash?(attribute, value)
|
106
|
+
else
|
107
|
+
attribute && matches_conditions_hash?(attribute, value)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def array_like_matches_condition_hash?(attribute, value)
|
112
|
+
if attribute.any?
|
113
|
+
attribute.any? { |element| matches_conditions_hash?(element, value) }
|
114
|
+
else
|
115
|
+
# you can use `nil`s in your ability definition to tell cancancan to find
|
116
|
+
# objects that *don't* have any children in a has_many relationship.
|
117
|
+
#
|
118
|
+
# for example, given ability:
|
119
|
+
# => can :read, Article, comments: { id: nil }
|
120
|
+
# cancancan will return articles where `article.comments == []`
|
121
|
+
#
|
122
|
+
# this is implemented here. `attribute` is `article.comments`, and it's an empty array.
|
123
|
+
# the expression below returns true if this was expected.
|
124
|
+
!value.values.empty? && value.values.all?(&:nil?)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def call_block_with_all(action, subject, *extra_args)
|
129
|
+
if subject.class == Class
|
130
|
+
@block.call(action, subject, nil, *extra_args)
|
131
|
+
else
|
132
|
+
@block.call(action, subject.class, subject, *extra_args)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def model_adapter(subject)
|
137
|
+
CanCan::ModelAdapters::AbstractAdapter.adapter_class(subject_class?(subject) ? subject : subject.class)
|
138
|
+
end
|
139
|
+
|
140
|
+
def conditions_empty?
|
141
|
+
# @conditions might be an ActiveRecord::Associations::CollectionProxy
|
142
|
+
# which it's `==` implementation will fetch all records for comparison
|
143
|
+
|
144
|
+
(@conditions.is_a?(Hash) && @conditions == {}) || @conditions.nil?
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CanCan
|
4
|
+
def self.valid_accessible_by_strategies
|
5
|
+
strategies = [:left_join]
|
6
|
+
|
7
|
+
unless does_not_support_subquery_strategy?
|
8
|
+
strategies.push(:joined_alias_exists_subquery, :joined_alias_each_rule_as_exists_subquery, :subquery)
|
9
|
+
end
|
10
|
+
|
11
|
+
strategies
|
12
|
+
end
|
13
|
+
|
14
|
+
# You can disable the rules compressor if it's causing unexpected issues.
|
15
|
+
def self.rules_compressor_enabled
|
16
|
+
return @rules_compressor_enabled if defined?(@rules_compressor_enabled)
|
17
|
+
|
18
|
+
@rules_compressor_enabled = true
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.rules_compressor_enabled=(value)
|
22
|
+
@rules_compressor_enabled = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.with_rules_compressor_enabled(value)
|
26
|
+
return yield if value == rules_compressor_enabled
|
27
|
+
|
28
|
+
begin
|
29
|
+
rules_compressor_enabled_was = rules_compressor_enabled
|
30
|
+
@rules_compressor_enabled = value
|
31
|
+
yield
|
32
|
+
ensure
|
33
|
+
@rules_compressor_enabled = rules_compressor_enabled_was
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Determines how CanCan should build queries when calling accessible_by,
|
38
|
+
# if the query will contain a join. The default strategy is `:subquery`.
|
39
|
+
#
|
40
|
+
# # config/initializers/cancan.rb
|
41
|
+
# CanCan.accessible_by_strategy = :subquery
|
42
|
+
#
|
43
|
+
# Valid strategies are:
|
44
|
+
# - :subquery - Creates a nested query with all joins, wrapped by a
|
45
|
+
# WHERE IN query.
|
46
|
+
# - :left_join - Calls the joins directly using `left_joins`, and
|
47
|
+
# ensures records are unique using `distinct`. Note that
|
48
|
+
# `distinct` is not reliable in some cases. See
|
49
|
+
# https://github.com/CanCanCommunity/cancancan/pull/605
|
50
|
+
def self.accessible_by_strategy
|
51
|
+
return @accessible_by_strategy if @accessible_by_strategy
|
52
|
+
|
53
|
+
@accessible_by_strategy = default_accessible_by_strategy
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.default_accessible_by_strategy
|
57
|
+
if does_not_support_subquery_strategy?
|
58
|
+
# see https://github.com/CanCanCommunity/cancancan/pull/655 for where this was added
|
59
|
+
# the `subquery` strategy (from https://github.com/CanCanCommunity/cancancan/pull/619
|
60
|
+
# only works in Rails 5 and higher
|
61
|
+
:left_join
|
62
|
+
else
|
63
|
+
:subquery
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.accessible_by_strategy=(value)
|
68
|
+
validate_accessible_by_strategy!(value)
|
69
|
+
|
70
|
+
if value == :subquery && does_not_support_subquery_strategy?
|
71
|
+
raise ArgumentError, 'accessible_by_strategy = :subquery requires ActiveRecord 5 or newer'
|
72
|
+
end
|
73
|
+
|
74
|
+
@accessible_by_strategy = value
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.with_accessible_by_strategy(value)
|
78
|
+
return yield if value == accessible_by_strategy
|
79
|
+
|
80
|
+
validate_accessible_by_strategy!(value)
|
81
|
+
|
82
|
+
begin
|
83
|
+
strategy_was = accessible_by_strategy
|
84
|
+
@accessible_by_strategy = value
|
85
|
+
yield
|
86
|
+
ensure
|
87
|
+
@accessible_by_strategy = strategy_was
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.validate_accessible_by_strategy!(value)
|
92
|
+
return if valid_accessible_by_strategies.include?(value)
|
93
|
+
|
94
|
+
raise ArgumentError, "accessible_by_strategy must be one of #{valid_accessible_by_strategies.join(', ')}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.does_not_support_subquery_strategy?
|
98
|
+
!defined?(CanCan::ModelAdapters::ActiveRecordAdapter) ||
|
99
|
+
CanCan::ModelAdapters::ActiveRecordAdapter.version_lower?('5.0.0')
|
100
|
+
end
|
101
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module CanCan
|
3
4
|
# This module is automatically included into all controllers.
|
4
5
|
# It also makes the "can?" and "cannot?" methods available to all views.
|
5
6
|
module ControllerAdditions
|
@@ -12,7 +13,7 @@ module CanCan
|
|
12
13
|
# end
|
13
14
|
#
|
14
15
|
def load_and_authorize_resource(*args)
|
15
|
-
cancan_resource_class.
|
16
|
+
cancan_resource_class.add_before_action(self, :load_and_authorize_resource, *args)
|
16
17
|
end
|
17
18
|
|
18
19
|
# Sets up a before filter which loads the model resource into an instance variable.
|
@@ -32,16 +33,16 @@ module CanCan
|
|
32
33
|
# end
|
33
34
|
#
|
34
35
|
# A resource is not loaded if the instance variable is already set. This makes it easy to override
|
35
|
-
# the behavior through a
|
36
|
+
# the behavior through a before_action on certain actions.
|
36
37
|
#
|
37
38
|
# class BooksController < ApplicationController
|
38
|
-
#
|
39
|
+
# before_action :find_book_by_permalink, :only => :show
|
39
40
|
# load_resource
|
40
41
|
#
|
41
42
|
# private
|
42
43
|
#
|
43
44
|
# def find_book_by_permalink
|
44
|
-
# @book = Book.find_by_permalink!(params[:id)
|
45
|
+
# @book = Book.find_by_permalink!(params[:id])
|
45
46
|
# end
|
46
47
|
# end
|
47
48
|
#
|
@@ -72,8 +73,8 @@ module CanCan
|
|
72
73
|
# Load this resource through another one. This should match the name of the parent instance variable or method.
|
73
74
|
#
|
74
75
|
# [:+through_association+]
|
75
|
-
# The name of the association to fetch the child records through the parent resource.
|
76
|
-
# because it defaults to the pluralized resource name.
|
76
|
+
# The name of the association to fetch the child records through the parent resource.
|
77
|
+
# This is normally not needed because it defaults to the pluralized resource name.
|
77
78
|
#
|
78
79
|
# [:+shallow+]
|
79
80
|
# Pass +true+ to allow this resource to be loaded directly when parent is +nil+. Defaults to +false+.
|
@@ -82,8 +83,8 @@ module CanCan
|
|
82
83
|
# Pass +true+ if this is a singleton resource through a +has_one+ association.
|
83
84
|
#
|
84
85
|
# [:+parent+]
|
85
|
-
# True or false depending on if the resource is considered a parent resource.
|
86
|
-
# name is given which does not match the controller.
|
86
|
+
# True or false depending on if the resource is considered a parent resource.
|
87
|
+
# This defaults to +true+ if a resource name is given which does not match the controller.
|
87
88
|
#
|
88
89
|
# [:+class+]
|
89
90
|
# The class to use for the model (string or constant).
|
@@ -115,10 +116,10 @@ module CanCan
|
|
115
116
|
# load_resource :new => :build
|
116
117
|
#
|
117
118
|
# [:+prepend+]
|
118
|
-
# Passing +true+ will use
|
119
|
+
# Passing +true+ will use prepend_before_action instead of a normal before_action.
|
119
120
|
#
|
120
121
|
def load_resource(*args)
|
121
|
-
cancan_resource_class.
|
122
|
+
cancan_resource_class.add_before_action(self, :load_resource, *args)
|
122
123
|
end
|
123
124
|
|
124
125
|
# Sets up a before filter which authorizes the resource using the instance variable.
|
@@ -160,8 +161,8 @@ module CanCan
|
|
160
161
|
# Pass +true+ if this is a singleton resource through a +has_one+ association.
|
161
162
|
#
|
162
163
|
# [:+parent+]
|
163
|
-
# True or false depending on if the resource is considered a parent resource.
|
164
|
-
# name is given which does not match the controller.
|
164
|
+
# True or false depending on if the resource is considered a parent resource.
|
165
|
+
# This defaults to +true+ if a resource name is given which does not match the controller.
|
165
166
|
#
|
166
167
|
# [:+class+]
|
167
168
|
# The class to use for the model (string or constant). This passed in when the instance variable is not set.
|
@@ -174,10 +175,10 @@ module CanCan
|
|
174
175
|
# Authorize conditions on this parent resource when instance isn't available.
|
175
176
|
#
|
176
177
|
# [:+prepend+]
|
177
|
-
# Passing +true+ will use
|
178
|
+
# Passing +true+ will use prepend_before_action instead of a normal before_action.
|
178
179
|
#
|
179
180
|
def authorize_resource(*args)
|
180
|
-
cancan_resource_class.
|
181
|
+
cancan_resource_class.add_before_action(self, :authorize_resource, *args)
|
181
182
|
end
|
182
183
|
|
183
184
|
# Skip both the loading and authorization behavior of CanCan for this given controller. This is primarily
|
@@ -226,8 +227,9 @@ module CanCan
|
|
226
227
|
cancan_skipper[:authorize][name] = options
|
227
228
|
end
|
228
229
|
|
229
|
-
# Add this to a controller to ensure it performs authorization through +
|
230
|
-
# If neither of these authorization methods are called,
|
230
|
+
# Add this to a controller to ensure it performs authorization through +authorize+! or +authorize_resource+ call.
|
231
|
+
# If neither of these authorization methods are called,
|
232
|
+
# a CanCan::AuthorizationNotPerformed exception will be raised.
|
231
233
|
# This is normally added to the ApplicationController to ensure all controller actions do authorization.
|
232
234
|
#
|
233
235
|
# class ApplicationController < ActionController::Base
|
@@ -244,22 +246,29 @@ module CanCan
|
|
244
246
|
# Does not apply to given actions.
|
245
247
|
#
|
246
248
|
# [:+if+]
|
247
|
-
# Supply the name of a controller method to be called.
|
249
|
+
# Supply the name of a controller method to be called.
|
250
|
+
# The authorization check only takes place if this returns true.
|
248
251
|
#
|
249
252
|
# check_authorization :if => :admin_controller?
|
250
253
|
#
|
251
254
|
# [:+unless+]
|
252
|
-
# Supply the name of a controller method to be called.
|
255
|
+
# Supply the name of a controller method to be called.
|
256
|
+
# The authorization check only takes place if this returns false.
|
253
257
|
#
|
254
258
|
# check_authorization :unless => :devise_controller?
|
255
259
|
#
|
256
260
|
def check_authorization(options = {})
|
257
|
-
|
261
|
+
block = proc do |controller|
|
258
262
|
next if controller.instance_variable_defined?(:@_authorized)
|
259
263
|
next if options[:if] && !controller.send(options[:if])
|
260
264
|
next if options[:unless] && controller.send(options[:unless])
|
261
|
-
|
265
|
+
|
266
|
+
raise AuthorizationNotPerformed,
|
267
|
+
'This action failed the check_authorization because it does not authorize_resource. ' \
|
268
|
+
'Add skip_authorization_check to bypass this check.'
|
262
269
|
end
|
270
|
+
|
271
|
+
send(:after_action, options.slice(:only, :except), &block)
|
263
272
|
end
|
264
273
|
|
265
274
|
# Call this in the class of a controller to skip the check_authorization behavior on the actions.
|
@@ -268,33 +277,25 @@ module CanCan
|
|
268
277
|
# skip_authorization_check :only => :index
|
269
278
|
# end
|
270
279
|
#
|
271
|
-
# Any arguments are passed to the +
|
280
|
+
# Any arguments are passed to the +before_action+ it triggers.
|
272
281
|
def skip_authorization_check(*args)
|
273
|
-
|
274
|
-
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
def skip_authorization(*args)
|
279
|
-
raise ImplementationRemoved, "The CanCan skip_authorization method has been renamed to skip_authorization_check. Please update your code."
|
282
|
+
block = proc { |controller| controller.instance_variable_set(:@_authorized, true) }
|
283
|
+
send(:before_action, *args, &block)
|
280
284
|
end
|
281
285
|
|
282
286
|
def cancan_resource_class
|
283
|
-
|
284
|
-
InheritedResource
|
285
|
-
else
|
286
|
-
ControllerResource
|
287
|
-
end
|
287
|
+
ControllerResource
|
288
288
|
end
|
289
289
|
|
290
290
|
def cancan_skipper
|
291
|
-
|
291
|
+
self._cancan_skipper ||= { authorize: {}, load: {} }
|
292
292
|
end
|
293
293
|
end
|
294
294
|
|
295
295
|
def self.included(base)
|
296
296
|
base.extend ClassMethods
|
297
297
|
base.helper_method :can?, :cannot?, :current_ability if base.respond_to? :helper_method
|
298
|
+
base.class_attribute :_cancan_skipper
|
298
299
|
end
|
299
300
|
|
300
301
|
# Raises a CanCan::AccessDenied exception if the current_ability cannot
|
@@ -338,10 +339,6 @@ module CanCan
|
|
338
339
|
current_ability.authorize!(*args)
|
339
340
|
end
|
340
341
|
|
341
|
-
def unauthorized!(message = nil)
|
342
|
-
raise ImplementationRemoved, "The unauthorized! method has been removed from CanCan, use authorize! instead."
|
343
|
-
end
|
344
|
-
|
345
342
|
# Creates and returns the current user's ability and caches it. If you
|
346
343
|
# want to override how the Ability is defined then this is the place.
|
347
344
|
# Just define the method in the controller to change behavior.
|
@@ -390,8 +387,8 @@ module CanCan
|
|
390
387
|
end
|
391
388
|
end
|
392
389
|
|
393
|
-
if defined?
|
394
|
-
|
390
|
+
if defined? ActiveSupport
|
391
|
+
ActiveSupport.on_load(:action_controller) do
|
395
392
|
include CanCan::ControllerAdditions
|
396
393
|
end
|
397
394
|
end
|