Model Ownership - Cómo administrar los Propietarios de los recursos

1 view
Skip to first unread message

Matias Mascazzini

unread,
Aug 3, 2015, 11:19:04 AM8/3/15
to rubyconrails
Hola,
estoy empezando a agregar una capa de seguridad a una aplicación que estoy desarrollando con Rails 4. (https://github.com/matiasmasca/novedades) y me encuentro con el problema de que un Usuario debería de poder acceder solo a los recursos que son de el.

Uso Devise para la Autenticación.

Para la Autorización, estaba usando simplemente IF user.tipo == 1, ya que tengo solo 2 roles: Admin y Cliente.

En otras aplicaciones use Filtros en cada controlador, pero no creo que sea la mejor solución, ya que terminaba repitiendo mucho código similar.

Estoy viendo CanCanCan, pero me parece que no me va a servir, porque hasta ahora veo que es para definir roles y esos roles son como genéricos para los recursos.

¿Qué suelen usar en estos casos?



Saludos
---
Le recomiendo visitar: www.ComunidadTIC.com.ar
"¿Eres Informático?"

Juan Pablo Taulamet

unread,
Aug 3, 2015, 2:22:14 PM8/3/15
to rubyco...@googlegroups.com
Che por qué no te sirve definir un Rol para acceder a los recursos?

Vos querés plantear que para una misma tabla de la base de datos, algunos usuarios pueden acceder a algunos recursos y a otros no? Cómo sería el criterio?

Un abrazo!


--
Saludos Cordiales,
    Juan Pablo

--
Has recibido este mensaje porque estás suscrito al grupo "Ruby Con Rails" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubyconrails...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a rubyco...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/rubyconrails.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/rubyconrails/CAOAUXOM2_R1%2Bp-D4e2CKOec2J3BDnHuKPH9zmxBxpn%3DzPM1v4g%40mail.gmail.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Matias Mascazzini

unread,
Aug 3, 2015, 3:24:53 PM8/3/15
to rubyconrails
Hola,
porque no son roles sino propietarios (ownership) de los recursos. Al ser RESTFul me cambia la URL y accede al recurso.

El usuario A, accede a: /projeject/1
incluso hay un FK a user_id

Pero el muy pillo del usuario A, cambia la URL y me accede al /project/7 que es propiedad del usuario B.

El admin, puede ver todo.

Lo que suelo hacer es un "before_action" y un método chequear propiedad. Pero termino repitiendo el mismo código, con algunas modificaciones de cada caso.

Los Roles, si me sirven para mostrar los botones de Editar/Borrar/Crear.

Lo que me gustaría saber es como lo suelen resolver.


Saludos
---
Le recomiendo visitar: www.ComunidadTIC.com.ar
"¿Eres Informático?"

Emanuel Friedrich

unread,
Aug 3, 2015, 3:39:18 PM8/3/15
to rubyco...@googlegroups.com
mas alla de que podés hacerlo a mano medianamente sin complejidad...

ejemplo:

ApplicationController

  before_filter :has_permiso

  def has_permisio?
    return current_user.admin? if current_user.admin?
    @resource.user_owner.eql? current_user  
  end


tiro la idea... No se si en rails el objeto en el controller puede generalizarse como lo hice con @resource pero tiro la idea para que lo hagas como quieras

Podes hacerlo con cancan también. Aunque veo que tu caso no es complejo como para justificarlo


Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Emanuel Friedrich - Casi licenciado en Sistemas... :)
Cel: 3754-495887

Haya paz

Matias Mascazzini

unread,
Aug 3, 2015, 3:48:28 PM8/3/15
to rubyconrails

2015-08-03 16:39 GMT-03:00 Emanuel Friedrich <aemanuel...@gmail.com>:
before_filter :has_permiso

  def has_permisio?
    return current_user.admin? if current_user.admin?
    @resource.user_owner.eql? current_user  
  end

Gracias Emanuel.

La complejidad esta en los recursos anidados...

Un proyecto, tiene muchas novedades y las novedades pueden tener archivos adjuntos.

Me parece raro que no haya una gema usada para esto, siendo me imagino un problema bastante común en Rails.

Juan Pablo Taulamet

unread,
Aug 3, 2015, 4:02:47 PM8/3/15
to rubyco...@googlegroups.com
Che no sé si entendí bien lo que necesitás, pero una posibilidad podría ser definir proyectos que son sólo de un usuario a nivel de "controller":

Por ejemplo
def edit
  @proyecto = current_user.proyectos.find(params[:id])
end

En este caso, si se intenta entrar a un proyecto que no es del usuario, se lanzará una excepción :)

Qué te parece?

Abrazo!


--
Saludos Cordiales,
    Juan Pablo

Matias Mascazzini

unread,
Aug 3, 2015, 4:07:01 PM8/3/15
to rubyconrails
Puedo probar eso Juan, la verdad que no se me ocurrió. Pero como hago con el user Admin que si puede administrar todos los recursos.

Saludos
---
Le recomiendo visitar: www.ComunidadTIC.com.ar
"¿Eres Informático?"

Juan Pablo Taulamet

unread,
Aug 3, 2015, 4:38:46 PM8/3/15
to rubyco...@googlegroups.com
Bueno no tengo tu proyecto a la vista pero como para no ensuciar mucho el código, yo para el admin utilizaría método. Quizá podría estar dentro de un name space diferente por ejemplo "admin/proyectos" y entonces podrías autorizar el acceso a "admin" sólo a los usuarios que posean el rol adecuado, me copiás?

abrazo!


--
Saludos Cordiales,
    Juan Pablo

Matias Mascazzini

unread,
Aug 3, 2015, 4:58:52 PM8/3/15
to rubyconrails
Si Juan, la parte del acceso por rol no sería el problema. El problema es restringir a que solo accedan a sus registros y no a los de otros usuarios.

Mira la App.
User: d...@deroche.com
Pass: clave12345

http://terciar-novedades.herokuapp.com/projects/1



http://terciar-novedades.herokuapp.com/projects/6
este ya es de otro usuario

Si entro con un admin, (user: ad...@estudio.com // clave: clave12345 ) le aparecen otras opciones de edición, como el botón Editar.

Lo que quiero es que cuando este usuario cambie el 1 por un 6, le diga: "Señor no tiene permiso para acceder a eso."

Pero bueno, iré por el lado de los filtros before_action.


Saludos
---
Le recomiendo visitar: www.ComunidadTIC.com.ar
"¿Eres Informático?"

Juan Pablo Taulamet

unread,
Aug 3, 2015, 5:11:37 PM8/3/15
to rubyco...@googlegroups.com
Che ahora no tengo tiempo para poder entrar, pero lo antes posible lo hago.

Hay algún lugar se pueda ver el código fuente?

De todas formas me gustaría aclarar que lo que yo quise decir es hacer las dos cosas, por un lado en el controller para usuarios que garantiza que vean sólo los suyos y por otro lado un lugar donde el admin vea todos los proyectos...

Mas tarde amplío!

Estoy a full con una entrega!


--
Saludos Cordiales,
    Juan Pablo

Matias Mascazzini

unread,
Aug 3, 2015, 5:28:36 PM8/3/15
to rubyconrails

Matias Mascazzini

unread,
Aug 3, 2015, 6:32:46 PM8/3/15
to rubyconrails
Termine haciendo el filtro nomás.

before_filter :is_owner
 
  def is_owner
    return false unless current_user

    # logger.info(@current_user.is_admin?)
    return true if current_user.is_admin?

    if current_user.tipo.nil?
      security_exit
      return false
    end

    case params[:controller]
       when "projects"
         project = Project.find_by_id(params[:id]) if params[:id]
         if project && project.user.id != current_user.id
           security_exit
           return false
         end
       when "notifications"
         notification = Notification.find_by_id(params[:id]) if params[:id]
         notification = Notification.find_by_project_id(params[:project_id]) if params[:project_id]
         if notification && notification.project.user.id != current_user.id
           security_exit
           return false
         end
       when "attachments"
         notification = Notification.find_by_id(params[:notification_id]) if params[:notification_id]
         if notification && notification.project.user.id != current_user.id
           security_exit
           return false
         end
       else
         #default case
   end
   return true
  end

  def security_exit
      respond_to do |format|
      format.html do
         redirect_to(root_path, alert: 'Acceso denegado.')
         return false
      end
    end
  end




Saludos
---
Le recomiendo visitar: www.ComunidadTIC.com.ar
"¿Eres Informático?"

Reply all
Reply to author
Forward
0 new messages