Roles/Permisos de usuarios

Buenas tardes a todos,
tengo un pequeño problema y me gustaría que me comentaran cual podría
ser la mejor solución:

Tengo una aplicación donde tengo el plugin restful_authenticacion
funcionando y los usuarios pueden darse de alta. Una vez validados,
pueden añadir artículos. Lo que necesito es que cada usuario sólo pueda
editar y/o eliminar sus artículos y no el de otros usuarios.

¿Alguien conoce alguna solución elegante?

Muchas gracias.

En tu controlador Artículos tenes que cambiar las busquedas.

Por ejemplo en index, donde dice @articles = Article.find(:all) lo
cambias
por @articles = current_user.articles. En los otros metodos donde es
solo un
articulo cambias @article = Article.find(params[:id]) por @article =
current_user.articles.find(params[:id]).

saludos,
Juan P.

On Dec 27, 2007 3:50 PM, Mario S. [email protected]

Estaba pensando exactamente en eso…pero ¿es suficientemente seguro?
También he modificado el edit para que sea :

GET /articles/1/edit

def edit
begin
@article = current_user. articles.find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:notice] = _(“The article that you request is no avaiable!”)
redirect_to root_path
rescue
flash[:notice] = _(“Sorry, but you don’t have permissions to edit
this article!”)
redirect_to root_path
end
end

Mucha gracias.

supongo que para que eso sea realizable tienes que guardar el numero de
id
del usuario en el registro de la tabla articulos, osea crear un campo
que
haga la relación en user_has_many :articles, ¿o el plugin lo hace
automatico?

Saludos

Tenes que crear vos el user_id en la tabla articles y hacer en los
modelos
la relación.

en user.rb
has_many :articles

en article.rb
belongs_to :user

saludos,
Juan P…

On Dec 27, 2007 4:20 PM, Mario S. [email protected]

Hola a todos,
sí, la relación está hecha, sino es imposible realizar lo que estamos
comentando.

El problema de lo que estáis diciendo, es que yo voy, y hago un create
saltandome el edit, y puedo hacer lo que me da la gana.
Yo pondría un

before_filter :has_rights_to_modify, :only => [:edit,:update,:create]

def has_rights_to_modify
@article.user == session[:user]
end

Un Saludo.

El 27/12/07, Mario S. [email protected]
escribió:> pueden añadir artículos. Lo que necesito es que cada usuario sólo pueda

editar y/o eliminar sus artículos y no el de otros usuarios.

Creo que la mejor solución es usar un before_filter para las acciones
new, create, edit, update y destroy, por ejemplo:

before_filter :autor_required, :only => [ :new, :create, :edit,
:update, :destroy ]

El método author_required lo defines aparte, y es el encargado de
comprobar que el post pertenece al usuario logueado.

Por ejemplo, si tu controlador de posts es también rest y lo haces de
manera anidada como en este tutorial [1], en el controlador de posts
estarás cogiendo el usuario al que pertenece y almacenándolo en @user.

Así que podrías comprobar que el usuario logueado con
restful_authentication, almacenado en current_user, es el mismo que
@user, y si no, por ejemplo, redirigirlo a “/logout”, por malo. :smiley:

def autor_required
if @user != current_user
redirect_to “/logout”
end
end

[1] http://tinyurl.com/2fd5ga

Feliz 2008 a todos :smiley:
Gaston, parte de las buenisimas recomendaciones, tu puede servir
tambien para filtrar por usuario los conjuntos de resultados el metodo
“with_scope” del ActiveRecord.

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001416

Esta idea es muy buena, pero viendo el ejemplo:

 def self.find_with_scope
      with_scope(:find => { :conditions => "blog_id = 1", :limit => 1 },
:create => { :blog_id => 1 }) do
        with_scope(:find => { :conditions => "author_id = 3" })
          find(:all) # => SELECT * from articles WHERE blog_id = 1 AND
author_id = 3 LIMIT 1
        end
      end
    end

Creo que desde el modelo no sería posible acceder a la variable global
current_user, por lo tanto no podríaos tener:

def self.find_with_scope
with_scope(:find => { :conditions => “blog_id = 1”, :limit => 1 },
:create => { :blog_id => 1 }) do
with_scope(:find => { :conditions => [“author_id = ?”,
current_user] })
find(:all)
end
end
end

El jue, 27 de dic de 2007, a las 06:50:51 +0100, Mario S. dijo:

Buenas tardes a todos,
tengo un pequeño problema y me gustaría que me comentaran cual podría
ser la mejor solución:

Tengo una aplicación donde tengo el plugin restful_authenticacion
funcionando y los usuarios pueden darse de alta. Una vez validados,
pueden añadir artículos. Lo que necesito es que cada usuario sólo pueda
editar y/o eliminar sus artículos y no el de otros usuarios.

¿Alguien conoce alguna solución elegante?

Has visto este plugin http://code.google.com/p/rolerequirement/
es muy simple y funciona con restful_authenticacion o
act_as_authenticacion
yo lo estoy usando, podés hacer cosas com estas:

class Admin::Listings < ApplicationController
require_role “contractor”
require_role “admin”, :for => :destroy # don’t allow contractors to
destroy

require_role “admin”, :for => :update

Saludos

Muchas gracias.

Posted via http://www.ruby-forum.com/.


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Gastón Ramos

“I always thought Smalltalk would beat Java, I just didn’t know it would
be
called ‘Ruby’ when it did.”

– Kent Beck

GNU/Linux Counter user #450312

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs