Rails 管理员未使用 Cancancan 或 Devise 进行身份验证
Rails Admin not authenticating with Cancancan or Devise
我在配置中试过这个:
### Popular gems integration
config.authenticate_with do
warden.authenticate! scope: :user
end
config.current_user_method(&:current_user)
在这里,访问 /admin
让我陷入登录循环。我登录然后被重定向到登录页面。
之前我试过
class Ability
include CanCan::Ability
def initialize(user)
# Define abilities for the passed in user here. For example:
#
user ||= User.new # guest user (not logged in)
if user.admin?
在 rails 管理配置中使用 CanCanCan 身份验证。这导致用户始终为零。即使我输入
config.current_user_method(&:current_user)
如何解决此问题以验证是管理员?
编辑:在会话控制器中
if user.admin
redirect_to rails_admin_url
else
render json: user
end
我被重定向回登录卡住了。
路线:
Rails.application.routes.draw do
mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
devise_for :users, controllers: { sessions: :sessions },
path_names: { sign_in: :login }
... then many resources lines
编辑:
会话控制器:
class SessionsController < Devise::SessionsController
protect_from_forgery with: :null_session
def create
user = User.find_by_email(sign_in_params[:email])
puts sign_in_params
if user && user.valid_password?(sign_in_params[:password])
user.generate_auth_token
user.save
if user.admin
redirect_to rails_admin_url
else
render json: user
end
else
render json: { errors: { 'email or password' => ['is invalid'] } }, status: :unprocessable_entity
end
end
end
Rails 管理员配置,试试这个:
### Popular gems integration
config.authenticate_with do
redirect_to merchants_path unless current_user.admin?
end
config.current_user_method(&:current_user)
在应用程序控制器中:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
试过了,current_user 为零。
您可能需要在 ApplicationController
上定义 after_sign_in_path_for 方法
默认情况下,它首先尝试在会话中找到有效的 resource_return_to 密钥,然后回退到 resource_root_path,否则它使用根路径。对于用户范围,您可以通过以下方式定义默认值 url:
get '/users' => 'users#index', as: :user_root # creates user_root_path
namespace :user do
root 'users#index' # creates user_root_path
end
如果没有定义资源根路径,则使用root_path。但是,如果这个默认不够用,你可以自定义,例如:
def after_sign_in_path_for(resource)
stored_location_for(resource) ||
if resource.is_a?(User) && resource.can_publish?
publisher_url
else
super
end
end
重定向的控制器逻辑
Guillermo Siliceo Trueba will not work with your Users::SessionsController#create
action as you are not calling in the parent class create
action 通过关键字 super
的解决方案。
class Devise::SessionsController
中的方法 create
将在最后一行 运行 respond_with
使用 location
从返回的值after_sign_in_path_for(resource)
class Devise::SessionsController < DeviseController
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
我在我的 Users::SessionsController
中使用这个解决方案来处理 html
和 json
请求,你可以实现相同的。
如果控制器收到格式为.json
的request
,则执行format.json do .. end
之间的代码,如果request
以format.html
到达parent 方法被调用(我涵盖了你所有的场景)。
Rails 路由器从 url 末尾附加的 .json
或 .html
识别请求格式(例如 GET https://localhost:3000/users.json
)
class Users::SessionsController < Devise::SessionsController
def create
respond_to do |format|
format.json do
self.resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
render status: 200, json: resource
end
format.html do
super
end
end
end
end
html
请求将被路由 to the super
create action. You just need to override the method def after_sign_in_path_for(resource)
from the parent as I am doing in my ApplicationController
。
if resource.admin
然后只是 return rails_admin_url
从这个方法并跳过其他行,否则遵循正常行为并调用 super#after_sign_in_path_for(resource)
def after_sign_in_path_for(resource)
return rails_admin_url if resource.admin
super
end
验证错误信息
warned.authenticate!
将在 self.resource.errors
中保存错误消息。您只需要使用 json_response[:error]
在您的设备上显示错误并在您的前端操纵响应。
中渲染它们
令牌认证
user.generate_auth_token
user.save
我用的是simple_token_authentication
for devise which also allows you to regenerate the token every time the user signs in.
您只需安装 gem 并添加 acts_as_token_authenticatable
inside your user
model。
class User < ApplicationRecord
acts_as_token_authenticable
end
您将 headers X-User-Email
和 X-User-Token
与相应的值传递给 in their guide。
我在配置中试过这个:
### Popular gems integration
config.authenticate_with do
warden.authenticate! scope: :user
end
config.current_user_method(&:current_user)
在这里,访问 /admin
让我陷入登录循环。我登录然后被重定向到登录页面。
之前我试过
class Ability
include CanCan::Ability
def initialize(user)
# Define abilities for the passed in user here. For example:
#
user ||= User.new # guest user (not logged in)
if user.admin?
在 rails 管理配置中使用 CanCanCan 身份验证。这导致用户始终为零。即使我输入
config.current_user_method(&:current_user)
如何解决此问题以验证是管理员?
编辑:在会话控制器中
if user.admin
redirect_to rails_admin_url
else
render json: user
end
我被重定向回登录卡住了。
路线:
Rails.application.routes.draw do
mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
devise_for :users, controllers: { sessions: :sessions },
path_names: { sign_in: :login }
... then many resources lines
编辑:
会话控制器:
class SessionsController < Devise::SessionsController
protect_from_forgery with: :null_session
def create
user = User.find_by_email(sign_in_params[:email])
puts sign_in_params
if user && user.valid_password?(sign_in_params[:password])
user.generate_auth_token
user.save
if user.admin
redirect_to rails_admin_url
else
render json: user
end
else
render json: { errors: { 'email or password' => ['is invalid'] } }, status: :unprocessable_entity
end
end
end
Rails 管理员配置,试试这个:
### Popular gems integration
config.authenticate_with do
redirect_to merchants_path unless current_user.admin?
end
config.current_user_method(&:current_user)
在应用程序控制器中:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user
试过了,current_user 为零。
您可能需要在 ApplicationController
上定义 after_sign_in_path_for 方法默认情况下,它首先尝试在会话中找到有效的 resource_return_to 密钥,然后回退到 resource_root_path,否则它使用根路径。对于用户范围,您可以通过以下方式定义默认值 url:
get '/users' => 'users#index', as: :user_root # creates user_root_path
namespace :user do
root 'users#index' # creates user_root_path
end
如果没有定义资源根路径,则使用root_path。但是,如果这个默认不够用,你可以自定义,例如:
def after_sign_in_path_for(resource)
stored_location_for(resource) ||
if resource.is_a?(User) && resource.can_publish?
publisher_url
else
super
end
end
重定向的控制器逻辑
Guillermo Siliceo Trueba will not work with your Users::SessionsController#create
action as you are not calling in the parent class create
action 通过关键字 super
的解决方案。
class Devise::SessionsController
中的方法 create
将在最后一行 运行 respond_with
使用 location
从返回的值after_sign_in_path_for(resource)
class Devise::SessionsController < DeviseController
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
我在我的 Users::SessionsController
中使用这个解决方案来处理 html
和 json
请求,你可以实现相同的。
如果控制器收到格式为.json
的request
,则执行format.json do .. end
之间的代码,如果request
以format.html
到达parent 方法被调用(我涵盖了你所有的场景)。
Rails 路由器从 url 末尾附加的 .json
或 .html
识别请求格式(例如 GET https://localhost:3000/users.json
)
class Users::SessionsController < Devise::SessionsController
def create
respond_to do |format|
format.json do
self.resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
render status: 200, json: resource
end
format.html do
super
end
end
end
end
html
请求将被路由 to the super
create action. You just need to override the method def after_sign_in_path_for(resource)
from the parent as I am doing in my ApplicationController
。
if resource.admin
然后只是 return rails_admin_url
从这个方法并跳过其他行,否则遵循正常行为并调用 super#after_sign_in_path_for(resource)
def after_sign_in_path_for(resource)
return rails_admin_url if resource.admin
super
end
验证错误信息
warned.authenticate!
将在 self.resource.errors
中保存错误消息。您只需要使用 json_response[:error]
在您的设备上显示错误并在您的前端操纵响应。
令牌认证
user.generate_auth_token
user.save
我用的是simple_token_authentication
for devise which also allows you to regenerate the token every time the user signs in.
您只需安装 gem 并添加 acts_as_token_authenticatable
inside your user
model。
class User < ApplicationRecord
acts_as_token_authenticable
end
您将 headers X-User-Email
和 X-User-Token
与相应的值传递给 in their guide。