múltiples condiciones al usuario en declarative_authorization if_attribute
-
25-10-2019 - |
Pregunta
Tengo 4 niveles diferentes de acceso; administrador, socio, empleado y cliente. El administrador, el socio y el empleado tienen acceso administrativo sobre los clientes. Básicamente, lo que he hecho es crear una aplicación Rails donde los clientes pueden cargar documentos a su proveedor (socios). Todo funciona muy bien excepto el acceso a nivel de cliente. Tengo dos códigos; partercode y código de cliente. Los socios solo pueden ver archivos donde el campo ParterCode del archivo es igual al código de socio del socio. Esto funciona bien. Sin embargo, el cliente solo puede ver los archivos donde el código de socios coincide y el cliente coincide. A continuación se muestra la sección de mi cliente. Lo que está funcionando es que el cliente solo puede ver los archivos de Código de Parter, pero los está configurando ver a otros clientes que pertenecen al socio. (escribiendo el número en la URL). Dudo que esto sea un problema, pero es un agujero de seguridad que definitivamente querría cerrado.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
end
end
Solución 2
Encontré la respuesta. La respuesta, irónicamente, estaba en las etiquetas de esta pregunta; anidado.
role :client do
has_permission_on [:users], :to => [:client, :edit, :update] do
if_attribute :username => is { user.username }
end
has_permission_on [:documents], :to => [:client, :new, :create]
has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
if_attribute :clientcode => is { user.clientcode } do
if_attribute :partnercode => is { user.partnercode }
end
end
end
Una vez que valida que el CLIENTCODE es correcto, cree otro DO ... Fin para verificar el Código de socios.
Otros consejos
No creo anidar el if_attribute
Las declaraciones en realidad funcionan así. Declarative_authorization de forma predeterminada se une a estos if_attribute
declaraciones con un or
declaración, pero si entiendo correctamente, quieres que se unan con and
. La forma de cambiar esto es establecer el :join_by
atribuir a :and
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode }
if_attribute :clientcode => is { user.clientcode }
end
end
:join_by
funciona, pero mi problema es que a veces necesitas ambos AND
y OR
. Puede especificar múltiples condiciones if, en una sola línea como argumentos diferentes. Estos se compararán juntos usando AND
mientras que cada línea se evalúa con OR
.
role :client do
has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
if_attribute :partnercode => is { user.partnercode },
:clientcode => is { user.clientcode } # These two are evaluated with AND
if_attribute :some_attr => is { some_val }
end
end