2011-12-09 13 views
10

En los carriles de guía en http://edgeguides.rubyonrails.org/security.html, sección 6.1, se introduce un papel para attr_accessible con: como opción,Dónde y cómo asignar un usuario: función de administrador para attr_accessible en rieles 3.1?

attr_accessible :name, :is_admin, :as => :admin 

Mi pregunta es, si un usuario inicia sesión, dónde y cómo puedo asignar al usuario: admin rol para que él/ella tenga el derecho de asignar en masa con attr_accessible? ¿También puedo definir mi propio rol como group_to_update? Si lo hace, ¿qué debería incluirse en la definición de group_to_update?

Gracias.

Respuesta

32

Está utilizando una terminología técnica de manera vaga que hace que su comprensión de este proceso se confunda, por lo que voy a aclarar esta terminología primero.

dónde y cómo puedo asignar al usuario: rol de administrador

El 'papel' se utiliza en el parámetro :as a attr_accessible no es un rol de usuario. Es un atributo rol. Significa que el atributo está protegido contra sobreescritura, a menos que ese rol se especifique en la declaración que establece el atributo. Entonces, este sistema es independiente de cualquier sistema de usuario. Su aplicación ni siquiera necesita que los usuarios tengan roles en la asignación masiva.

puedo definir mi propio papel como group_to_update

Los roles no son realmente "definidos" en ningún sentido formal. En cualquier lugar donde se espera un rol, simplemente use cualquier símbolo/cadena (por ejemplo, :group_to_update) como rol. No es necesario especificarlo en otro lugar antes de tiempo.

Así es como funciona. Normalmente, durante la asignación masiva de un hash a los atributos del modelo, todos los atributos del modelo se usan como claves para el hash asignado.Así que si usted tiene un modelo Barn y barn instancia del mismo, con tres atributos horse, cat y rabbit, entonces esto:

barn.attributes = params 

es esencialmente lo mismo que hacer:

barn.horse = params[:horse] 
barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Ahora, si establece attr_accessible en el modelo de granero, solo los atributos que establezca allí se actualizarán cuando use la asignación masiva. Ejemplo:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit 
end 

Entonces esto:

barn.attributes = params 

hará solamente esto:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Debido a que sólo 'gato' y 'conejo' se establecen para acceder ('caballo' no es) Ahora considere configurar un papel atributo de la siguiente manera:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
end 

En primer lugar, observamos que el papel puede por cualquier cosa que desee, siempre y cuando es un símbolo/cadena. En este caso, hice el rol :banana. Ahora, cuando establece un rol en un atributo attr_accessible, normalmente no se asigna. Este:

barn.attributes = params 

ahora sólo hacer esto:

barn.cat = params[:cat] 

pero se pueden asignar atributos utilizando un papel específico utilizando el método assign_attributes. Por lo que puede hacer:

barn.assign_attributes(params, :as => :banana) 

Esto asignará todos los parametros protegidas normalmente, así como todos los parametros protegidos por el papel :banana:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

por lo consideran un ejemplo más larga con más atributos:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
    attr_accessible :horse, :as => :banana 
    attr_accessible :cow, :as => :happiness 
end 

Luego puede usar esos roles al asignar atributos. Este:

barn.assign_attributes(params, :as => :banana) 

corresponde a:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 
barn.horse = params[:horse] 

Y esto:

barn.assign_attributes(params, :as => :happiness) 

corresponde a:

barn.cat = params[:cat] 
barn.cow = params[:cow] 

Ahora, si decide , puede hacer funciones de usuario (p. una columna "rol" en su modelo de Usuario) corresponde a roles de atributo en cualquier modelo.Por lo que podría hacer algo como esto:

barn.assign_attributes(params, :as => user.role) 

Si esta función user 's pasa a ser banana, entonces (utilizando nuestro último ejemplo de modelo) se fijará atributos de granero para el gato, conejo y caballo. Pero esta es solo una forma de usar roles de atributo. Depende totalmente de ti si quieres usarlos de otra manera.

+3

+1 Gran respuesta. – Gazler

+0

Gracias. Probablemente sea la única publicación que entra en el gran detalle sobre el rol en attr_accessible. Una pregunta más: ¿cómo evitará la asignación masiva? ¿No hay forma de que un hacker incluya el rol en la URL? – user938363

+0

Excelente respuesta. Esto debería estar en alguna parte [en las guías?] En los documentos de Rails. – maprihoda

3

Esto es para proteger contra la asignación masiva como lo explica su enlace.

En los rieles (para actualizar) esto solo afecta a la llamada update_attributes. Aún puede usar los métodos update_attribute o admin = para asignar la variable de administración.

User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work 
User.first.update_attribute(:admin, true) #This will work 

#This will also work 
user = User.first 
user.admin = true 
user.save 

Es posible que desee echar un vistazo a el uso de un gem for your permissions. Cancan es probablemente el más común.

+0

Aquí utilizó la asignación individual que debería funcionar todo el tiempo. Pero, ¿quién podría ser el rol de administrador y cómo convertirse en un rol de administrador? Supongo que admin es un método que podría definirse. – user938363

+0

No, el administrador en este caso sería una propiedad de su modelo de Usuario. Puede asignar esto en la consola de rieles o a través de un formulario como cualquier otra propiedad. – Gazler

1

Mire el método assign_attributes.

En resumen, le permite asignar los atributos solo cuando también pasa el rol. Los documentos tienen ejemplos de código muy agradables y fácilmente comprensibles. En cierto modo, funciona como una especie de filtro o guardia.

Cuestiones relacionadas