update tutorial signup registrationscontroller rails instalar ruby-on-rails devise cancan rails-engines

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.