我们正在升级一个有两种用户身份验证方式的应用程序。
- 具有
before_filter :authenticate_user!
回调并像标准 Rails 站点一样访问的控制器。 - 客户端应用程序通过 JSON 访问 API 模块内的控制器。
/api/session_id/
除了仅具有前缀的身份验证操作之外,所有路由都具有前缀/api
。
两种方式都使用User
模型对用户进行身份验证。
有没有办法配置设计来支持它们?如何?
注意:我不想通过 JSON 创建用户。我只想对他们进行身份验证。
我们正在升级一个有两种用户身份验证方式的应用程序。
before_filter :authenticate_user!
回调并像标准 Rails 站点一样访问的控制器。/api/session_id/
除了仅具有前缀的身份验证操作之外,所有路由都具有前缀/api
。两种方式都使用User
模型对用户进行身份验证。
有没有办法配置设计来支持它们?如何?
注意:我不想通过 JSON 创建用户。我只想对他们进行身份验证。
我通过覆盖设计的会话控制器来做到这一点。
为自定义会话控制器添加路由条目:
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是关于同一主题的更多讨论。
最终为监狱长制定了新的策略。
在valid?
方法上,我检查是否params[:controller]
来自 api 命名空间。这样我就没有通过http触及默认的设计认证。