4

我们正在升级一个有两种用户身份验证方式的应用程序。

  1. 具有before_filter :authenticate_user!回调并像标准 Rails 站点一样访问的控制器。
  2. 客户端应用程序通过 JSON 访问 API 模块内的控制器。/api/session_id/除了仅具有前缀的身份验证操作之外,所有路由都具有前缀/api

两种方式都使用User模型对用户进行身份验证。

有没有办法配置设计来支持它们?如何?

注意:我不想通过 JSON 创建用户。我只想对他们进行身份验证。

4

2 回答 2

0

我通过覆盖设计的会话控制器来做到这一点。

为自定义会话控制器添加路由条目:

 devise_for :users, :controllers => {:sessions => 'sessions'}

并覆盖会话控制器:

  class SessionsController < Devise::SessionsController

    def create
      resource = warden.authenticate!(:scope => resource_name, :recall => "sessions#failure")
      return sign_in_and_redirect(resource_name, resource)
    end

    def sign_in_and_redirect(resource_or_scope, resource=nil)
      scope = Devise::Mapping.find_scope!(resource_or_scope)
      resource ||= resource_or_scope
      sign_in(scope, resource) unless warden.user(scope) == resource
      respond_with do |format|
        format.json  {render :json => {:success => true} }
        format.any  {super}
      end
    end

    def failure
      respond_with do |format|
        format.json  {render:json => {:success => false, :errors => ["Login failed."]} }
        format.any  {redirect_to :back, :notice => "Wrong Email / Password" }
      end
      #return render:json => {:success => false, :errors => ["Login failed."]}
    end

  end

Rails & Devise: Override SessionsController是关于同一主题的更多讨论。

于 2012-12-14T16:26:22.897 回答
0

最终为监狱长制定了新的策略

valid?方法上,我检查是否params[:controller]来自 api 命名空间。这样我就没有通过http触及默认的设计认证。

于 2012-12-19T11:26:31.600 回答