Forum: Rails-ES ¿Es posible hacer esto con before_filter?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Carlos B. (Guest)
on 2009-04-28 19:30
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?
Javier E. (Guest)
on 2009-04-29 17:40
 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ó.
Carlos B. (Guest)
on 2009-04-30 18:23
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?
Manuel González Noriega (Guest)
on 2009-04-30 20:17
(Received via mailing list)
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.
Carlos B. (Guest)
on 2009-04-30 20:38
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?
This topic is locked and can not be replied to.