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
¿Fue útil?

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

fuente: http://www.tzi.org/~sbartsch/declarative_authorization/master/classes/authorization/reader/authorizationrulesreader.html#m000184

: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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top