Propuesta
Autorizaciones & Permisos
Contenido
-
Autorización
-
Modelo
-
Métodos
-
Demo
Autorización
- Primero por Unidad
- Segundo por Modelo y Acción
Modelo

- En controlador
- Helper
Métodos
Controlador
# app/controllers/application_controller.rb
def can_access?
current_uri = request.env['PATH_INFO']
unit_id = current_uri.split('/')[2].to_i
unit = Unit.find(unit_id)
user = current_user
model = Model.find_by_name(controller_name.classify.constantize.to_s)
action = Action.find_by_name(action_name.to_s)
error=0
user.roles.each do |role|
if role.unit.id == unit_id
error=1
rma = Rma.where(role_id: role.id , model_id: model.id, action_id: action.id).first
unless rma.nil?
return true
end
end
end
# redirigir según si la persona no tiene acceso a la unidad o no tiene los permisos para realizar la acción
if error==1
redirect_to root_path, notice: 'acceso denegado, no tiene permisos para la acción ' +action_name.to_s+ ' del modelo '+controller_name.classify.constantize.to_s
else
# error==0
redirect_to root_path, notice: 'acceso denegado, no pertenece a la unidad'
end
end# app/helpers/application_helper.rb
def can?(model_name, action_name)
model = Model.find_by_name(model_name)
action = Action.find_by_name(action_name)
user = current_user
if user.has_role?(:admin)
return true
end
user.roles.each do |role|
rma = Rma.where(role_id: role.id, model_id: model.id, action_id: action.id)
unless rma.empty?
return true
end
end
return false
endHelper
En cada controlador:
# app/controller/articles_controller.rb
class ArticlesController < ApplicationController
before_action :can_access?
def action
...
end
end
- Agregar un before_action : can_access?
En las Vistas:
# app/views/buy_orders/index.erb
<% if can? :BuyOrder, :create %>
<%= link_to 'New Buy order', new_unit_buy_order_path %>
<% end %>- Usar helper can?
Demo
https://github.com/sespinozj/model-rol-permissions
deck
By Sam W
deck
- 856