role_based_authorization 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
@@ -107,65 +107,73 @@ module RoleBasedAuthorization
|
|
107
107
|
str
|
108
108
|
end
|
109
109
|
end
|
110
|
+
|
111
|
+
|
112
|
+
# Returns true if one of the rules defined for this controller matches
|
113
|
+
# the given options
|
114
|
+
def exist_rule_matching_options? user, controllers, actions, ids
|
115
|
+
rules = self.class.role_auth_rules
|
116
|
+
AUTHORIZATION_LOGGER.debug("current set of rules: %s" % [rules.inspect])
|
117
|
+
|
118
|
+
|
119
|
+
controllers.each do |controller|
|
120
|
+
if( !controller.blank? && rules[controller].nil? )
|
121
|
+
# tries to load the controller. Rails automagically loads classes if their name
|
122
|
+
# is used anywhere. By trying to constantize the name of the controller, we
|
123
|
+
# force rails to load it.
|
124
|
+
controller_klass = (controller.to_s+'_controller').camelize.constantize
|
125
|
+
end
|
126
|
+
|
127
|
+
AUTHORIZATION_LOGGER.debug("current controller: %s" % [controller])
|
128
|
+
|
129
|
+
actions.each do |action|
|
130
|
+
AUTHORIZATION_LOGGER.debug('current action: %s' % [action])
|
131
|
+
|
132
|
+
action = action.to_sym
|
133
|
+
action_class = action.class
|
134
|
+
raise "Action should be a symbol -- not a #{action_class.name}!" if action_class != Symbol
|
135
|
+
|
136
|
+
rules_for_this_action = rules[controller] && rules[controller][action]
|
137
|
+
next if rules_for_this_action.nil?
|
138
|
+
|
139
|
+
return true if rules_for_this_action.find { |rule| rule.match(user, ids) }
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
return false
|
144
|
+
end
|
110
145
|
|
111
146
|
# Main authorization logic. opts is an hash with the following keys
|
112
147
|
# :user, :controller, :action:: self explanatory
|
113
148
|
# :ids:: id to be used to retrieve relevant objects
|
114
149
|
def authorize_action? opts = {}
|
150
|
+
# Option handling
|
151
|
+
user, ids, controller, action = *opts.values_at(:user, :ids, :controller, :action)
|
152
|
+
|
115
153
|
if respond_to?(:logged_in?) && !logged_in?
|
116
154
|
AUTHORIZATION_LOGGER.info("returning false (not logged in)")
|
117
155
|
return false
|
118
156
|
end
|
119
|
-
|
120
|
-
user, ids, controller, action = *opts.values_at(:user, :ids, :controller, :action)
|
121
|
-
|
157
|
+
|
122
158
|
ids ||= {}
|
123
159
|
ids.reverse_merge!( opts.reject { |key,value| key.to_s !~ /(_id\Z)|(\Aid\Z)/ } )
|
124
160
|
|
125
|
-
if user.nil?
|
126
|
-
|
127
|
-
end
|
161
|
+
user = current_user if user.nil? && respond_to?(:current_user)
|
162
|
+
controller = controller_name if controller.nil? && respond_to?(:controller_name)
|
128
163
|
|
129
|
-
if controller.nil? && respond_to?(:controller_name)
|
130
|
-
controller = controller_name
|
131
|
-
end
|
132
|
-
|
133
164
|
AUTHORIZATION_LOGGER.info("user %s requested access to method %s:%s using ids:%s" %
|
134
165
|
[ user && user.description + "(id:#{user.id} role:#{user.role})" || 'none',
|
135
166
|
controller,
|
136
167
|
action,
|
137
168
|
ids.inspect])
|
138
169
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
# is used anywhere. By trying to constantize the name of the controller, we
|
146
|
-
# force rails to load it.
|
147
|
-
controller_klass = (current_controller.to_s+'_controller').camelize.constantize
|
148
|
-
end
|
149
|
-
|
150
|
-
AUTHORIZATION_LOGGER.debug("current controller: %s" % [controller])
|
151
|
-
|
152
|
-
[:all, opts[:action]].each do |action|
|
153
|
-
AUTHORIZATION_LOGGER.debug('current action: %s' % [action])
|
154
|
-
action = action.to_sym
|
155
|
-
action_class = action.class
|
156
|
-
|
157
|
-
raise "Action should be a symbol -- not a #{action_class.name}!" if action_class != Symbol
|
158
|
-
|
159
|
-
rules_for_this_action = rules[controller] && rules[controller][action]
|
160
|
-
if rules_for_this_action != nil && rules_for_this_action.find { |rule| rule.match(user, ids) }
|
161
|
-
AUTHORIZATION_LOGGER.info('returning true (access granted)')
|
162
|
-
return true
|
163
|
-
end
|
164
|
-
end
|
170
|
+
if exist_rule_matching_options?( user, [controller,'application'], [:all,action] , ids )
|
171
|
+
AUTHORIZATION_LOGGER.info('returning true (access granted)')
|
172
|
+
return true
|
173
|
+
else
|
174
|
+
AUTHORIZATION_LOGGER.info('returning false (access denied)')
|
175
|
+
return false
|
165
176
|
end
|
166
|
-
|
167
|
-
AUTHORIZATION_LOGGER.info('returning false (access denied)')
|
168
|
-
return false
|
169
177
|
end
|
170
178
|
|
171
179
|
|