¿Es posible hacer esto con before_filter?


#1

Veréis tengo una acción que sólo ha de poder realizarse siempre y cuando
el usuario que se ha logueado sea el propietario de ese club, a la hora
de ocultar los campos en las vistas lo he hecho con el siguiente método:

def for_user(club)
unless current_user.nil?
current_user.club == club ? yield : nil
end
end

Con esto consigo ocultar las funciones que no son propias del usuario a
todos los demás (así reutilizo bastante código), el problema viene a la
hora de evitar que se pueda realizar la acción mediante el propio
navegador. Para las funciones de administración tengo el siguiente
método:

def require_admin
unless current_user.admin?
store_location
flash[:notice] = “Unathorized access”
redirect_to new_user_session_url
return false
end
end

Ese es muy sencillo que funcione ya que sólo ha de comprobar el estado
en el modelo.

Sin embargo para poder hacer una función parecida necesito saber antes
cuál es el club en el que estoy intentando hacer un cambio y compararlo
con el de la BD

Por tanto se me ocurrió hace la siguente función:

def require_user_club(club)
unless current_user.club == club
store_location
flash[:notice] = “You must be the propietary of this club”
redirect_to new_user_session_url
return false
end
end

Sin embargo ese tipo de funciones parece ser que no funcionan para un
before_filter ¿Cómo podría solucionar este problema?


#2

Si utilizas el plugin restfull authentication puedes hacer uso de esto:

class ClubController < ApplicationController
before_filter :login_required, :except => [:index, :show]

end

Por otro lado, para evitar que otros usuarios modifiquen tablas que no
les pertenecen, por ejemplo un club, yo lo hago de la siguiente forma:

def update
@club = current_user.clubs.find(params[:id])

end

Puede que no sea la más correcta, pero llevo relativamente poco tiempo
en el mundo de rails y es la que mejor se me ocurrió.


#3

Javier E. wrote:

Si utilizas el plugin restfull authentication puedes hacer uso de esto:

class ClubController < ApplicationController
before_filter :login_required, :except => [:index, :show]

end

Por otro lado, para evitar que otros usuarios modifiquen tablas que no
les pertenecen, por ejemplo un club, yo lo hago de la siguiente forma:

def update
@club = current_user.clubs.find(params[:id])

end

Puede que no sea la más correcta, pero llevo relativamente poco tiempo
en el mundo de rails y es la que mejor se me ocurrió.

Supongo que controlas con un if si eres el propietario de dicho club,
pero me surge el siguiente problema: Si tengo modelada mi aplicación
para que sea REST ¿Tiene sentido hacer eso?


#4

2009/4/30 Carlos Belizón removed_email_address@domain.invalid

Javier E. wrote:

Supongo que controlas con un if si eres el propietario de dicho club,
pero me surge el siguiente problema: Si tengo modelada mi aplicación
para que sea REST ¿Tiene sentido hacer eso?

¿Te refieres a limitar el scope del find al usuario dueño del club, para
asegurarte? Sí, REST es el enfoque estructural en cuanto a las urls
expuestas y la interacción con ellas, no dicta nada sobre la lógica de
negocio de tu aplicación, especialmente no te impide tomar precauciones
lógicas como esa. Por curiosidad ¿por qué crees que sí puede afectar? A
lo
mejor no te estoy entendiendo.


#5

Manuel González Noriega wrote:

¿Te refieres a limitar el scope del find al usuario dueño del club, para
asegurarte? Sí, REST es el enfoque estructural en cuanto a las urls
expuestas y la interacción con ellas, no dicta nada sobre la lógica de
negocio de tu aplicación, especialmente no te impide tomar precauciones
lógicas como esa. Por curiosidad ¿por qué crees que sí puede afectar? A
lo
mejor no te estoy entendiendo.

Vale, realmente, ahora que me doy cuenta el before_filter lo único que
hace es un “copiar/pegar” del método que se use en dicho lugar, así que
usar una estructura de control dentro de la acción no supone ningún tipo
de “mala praxis” para controlar que ningún usuario no autorizado pueda
vía consola “juguetear” con las rutas de mi aplicación, ¿Cierto?