app/models/permission.rb in gb_mapfish_appserver-0.8.7 vs app/models/permission.rb in gb_mapfish_appserver-0.9.0
- old
+ new
@@ -45,11 +45,11 @@
end
def role_can?(role_id, action, resource)
ActiveRecord::Base.silence do
can = if has_resource_list?
- permitted_resources(role_id, action).include?(resource)
+ permitted_resources(role_id, action, resources).include?(resource)
else
permitted?(resource, permissions(role_id, action))
end
#Rails.logger.debug ">>>>>>>>>>>>>>>>>> role_can? role_id: #{role_id}, action: #{action}, resource: #{resource.name} -> #{can}"
can
@@ -65,17 +65,19 @@
end
p
end
def roles_can?(roles, action, resource)
+ # find first permitted role if any
roles.find { |role| role_can?(role.id, action, resource) }
end
def add_ability(ability, roles)
ActiveRecord::Base.silence do
actions.each do |action|
if has_resource_list?
+ # use Rails cache
ids = Rails.cache.fetch("permitted_resource_ids-#{action}-#{@resource_type_name}-roles-#{roles.collect(&:id).join(',')}") do
permitted_resource_ids(roles, action)
end
#Rails.logger.debug ">>>>>>>>>>>> permitted_resource_ids with roles #{roles.collect(&:name).join(',')} can? #{action} #{@resource_type_name}: #{ids.inspect}"
ability.can(action, @klass, :id => ids) unless ids.empty?
@@ -88,38 +90,41 @@
end
end
protected
+ # higher sequence takes precedence
def permitted?(resource, permissions)
allow = false
permissions.each do |permission|
if permission.deny
+ # NOTE: permissions with higher sequence will override this, so deny permissions should have highest sequence
allow = false if compare(resource, permission.resource)
else
allow ||= compare(resource, permission.resource)
end
end
allow
end
- #All resource permissionsfor a given role_id + action
- def permitted_resources(role_id, action)
+ #All resource permissions for a given role_id + action
+ def permitted_resources(role_id, action, resources_list)
permissions = permissions(role_id, action)
- resources.select do |r|
+ resources_list.select do |r|
permitted?(r, permissions)
end
end
#All permitted resources (ids) for given roles and a action
def permitted_resource_ids(roles, action)
ids = []
return ids if !has_resource_list?
- roles.each { |role| ids += permitted_resources(role.id, action).collect(&:id) }
+ resources_list = resources.all # load resources here to optimize loop below
+ roles.each { |role| ids += permitted_resources(role.id, action, resources_list).collect(&:id) }
ids.sort.uniq
end
- #All permissions for a given role_id + action
+ #All permissions for a given role_id + action, ordered by sequence
def permissions(role_id, action)
Permission.where(:role_id => role_id,
:resource_type => @resource_type_name, :action => action).order(
'resource_type,role_id,sequence').all
end