ruby-on-rails - tutorial - rspec rails devise
¿Cómo usar Devise/CanCan para proteger los recursos de motor montados? (1)
Puede heredar el controlador de aplicaciones para usar el dispositivo y cancan desde la aplicación principal.
module SomeEngine
class ApplicationController < ::ApplicationController
before_filter :merge_abilities
private
def merge_abilities
current_ability.merge(SomeEngine::Ability.new(current_user))
end
end
end
Después de esto, puedes crear habilidades para el motor creando tu propio.
module SomeEngine
class Ability
include ::CanCan::Ability
def initialize(user)
return if user.nil?
can :manage, SomeModel
end
end
end
SomeModel
( SomeEngine::SomeModel
) es modelo en el motor SomeEngine
.
En los controladores de recursos debe especificar el nombre de clase del recurso.
load_and_authorize_resource class: SomeEngine::SomeModel
Y no olvide cambiar el asistente de ruta a main_app.MAIN_APP_PATHS
en el diseño de la aplicación principal si desea usarlo en el motor.
Tengo un motor montado en mi aplicación principal y quiero proteger ciertos controladores y acciones dentro de ese motor.
El motor está montado con:
mount SomeEngine::Engine => ''/some_engine''
Devise / CanCan está trabajando con el resto de los controladores y acciones de la aplicación principal, pero dejar que las cosas se ejecuten sin otra cosa produce este error:
This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check.
Así que abro los controladores del motor desde la aplicación principal usando el enfoque de decorador y agrego:
load_and_authorize_resource
Entonces obtengo este error:
No route matches {:action=>"new", :controller=>"devise/sessions"}
Puedo hacer que las cosas funcionen usando lo siguiente, pero es complicado cuando intento implementar roles:
authenticate :administrator do
mount SomeEngine::Engine => ''/some_engine''
end
Por torpe quiero decir que tendré que reproducir el bloque de código anterior en el archivo routes.rb para cada función que tenga acceso al motor ... a menos que haya otra forma de usar la autenticación con roles que no conozco. ??
Me gustaría usar el enfoque normal de autorización / autenticación Devise / CanCan en el controlador si es posible. Pero creo que se produce el error "sin coincidencia de ruta" porque el motor no sabe cómo llegar a los controladores Devise de la aplicación principal. ¿Pero cómo puedo solucionar esto desde la aplicación principal?
Para arrojar un problema más a la mezcla ... hay un controlador / acción específica en el motor que quiero hacer público para todos los usuarios. Hasta ahora, he agregado esto antes del bloque de código de autenticación en el archivo routes.rb.
match ''/some_engine'' => ''some_engine/some_controller#public_action''
Funciona ... pero esta línea con el bloque en routes.rb parece que estoy haciendo algo mal. Y no me permite implementar roles muy bien.