rails instalar ruby-on-rails ruby-on-rails-3 devise authorization unauthorized

ruby on rails - instalar - Custom Devise 401 respuesta no autorizada



devise wiki (2)

Como referencia, en caso de que alguien más se tope con esta pregunta cuando busque cómo personalizar la respuesta de error json cuando se realiza un intento fallido de inicio de sesión utilizando Devise, la clave es usar su propia implementación personalizada de FailureApp . (También puede utilizar este enfoque para anular algunos comportamientos de redireccionamiento).

class CustomFailureApp < Devise::FailureApp def respond if request.format == :json json_error_response else super end end def json_error_response self.status = 401 self.content_type = "application/json" self.response_body = [ { message: i18n_message } ].to_json end end

y en su devise.rb , busque la sección config.warden :

config.warden do |manager| manager.failure_app = CustomFailureApp end

Algunos datos relacionados:

Al principio pensé que tendría que anular Devise::SessionsController , posiblemente utilizando la opción de recall pasada a warden.authenticate! , pero como se mencionó here , "la recuperación no se invoca para las solicitudes de API, solo para las de navegación. Si desea personalizar el código de estado http, tendrá más suerte al hacerlo en el nivel de la aplicación fallida".

También https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-not-be-authenticated muestra algo muy similar para la redirección .

Estoy trabajando en una API basada en JSON para mi aplicación Rails 3.1. Me gustaría proporcionar una respuesta de error personalizada en lugar del predeterminado, que es:

{"error":"You need to sign in or sign up before continuing."}

Mi controlador API incluye una llamada before_filter a authenticate_user! , que es lo que está renderizando esta respuesta JSON.

Durante la búsqueda, encontré esta pregunta de StackOverflow , que hace referencia a esta entrada de la wiki de Devise . Desafortunadamente, la entrada de la wiki no es lo suficientemente detallada para que pueda entender lo que me dice. Específicamente, no tengo ni idea de dónde debo colocar ese código de manera que Devise / Warden sepa que debe devolver lo que quiero.

De los comentarios en la otra pregunta de SA, parece que no necesito llamar a custom_failure! ya que estoy usando una versión de Devise por encima de 1.2 (1.4.2 para ser específico). Sin embargo, la entrada de la wiki no explica dónde debe ir la llamada de render modo que authenticate_user! Sabe usar eso en lugar de su propia llamada de render.

¿A dónde va esta llamada de render ?

Edición: no estoy tratando de cambiar el mensaje en sí (a la the devise en.yml config); Estoy tratando de cambiar el formato real de la respuesta. Específicamente, quiero devolver esto:

render :text => "You must be logged in to do that.", :status => :unauthorized


Si simplemente desea cambiar el texto que se muestra con el mensaje de error, creo que solo puede editar el archivo de configuración regional (/config/locales/devise.en.yml).

El RailsCast sobre este tema también puede ser útil si desea detalles más específicos. Puede encontrarlo en http://railscasts.com/episodes/210-customizing-devise