Active Admin 可以使用我当前的设计用户模型吗?它已经有一个名为admin
的列,如果它是true
,我想在转到/admin
时绕过Active管理员登录。
这可能吗?
目前路线:
#Active admin
ActiveAdmin.routes(self)
#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"
其余基本上是标准的Devise + Active admin
答案 0 :(得分:70)
是的,当running the generator跳过用户模型创建时,你可以这样做:
rails generate active_admin:install --skip-users
然后在config/initializers/active_admin.rb
:
# == User Authentication
#
# Active Admin will automatically call an authentication
# method in a before filter of all controller actions to
# ensure that there is a currently logged in admin user.
#
# This setting changes the method which Active Admin calls
# within the controller.
config.authentication_method = :authenticate_admin!
取消注释config.authentication_method
并为您的管理员提供身份验证方法,例如:
# app/controllers/application_controller.rb
def authenticate_admin!
redirect_to new_user_session_path unless current_user.is_admin?
end
重新启动服务器,它应该正常工作。另请查看Active Admin Configuration
希望这有帮助。
答案 1 :(得分:26)
如前所述,您需要更新config/initializers/active_admin.rb
以反映正确的身份验证方法。
此外,您还需要更新以下设置:
# This setting changes the method which Active Admin calls
# to return the currently logged in user.
config.current_user_method = :current_admin_user
到
config.current_user_method = :current_user
和
# This setting changes the path where the link points to. If it's
# a string, the strings is used as the path. If it's a Symbol, we
# will call the method to return the path.
#
# Default:
config.logout_link_path = :destroy_admin_user_session_path
到
config.logout_link_path = :destroy_user_session_path
当然,你不必更新这些(或帖子中提到的方法),并且只是在其他地方覆盖这些方法,但这似乎是最简单/最干净的方法。显然,您需要使用设计认证将每个设置(current_USER
)中的“user”替换为模型名称。
我还建议你在那里时更新以下设置:
# This setting changes the http method used when rendering the
# link. For example :get, :delete, :put, etc..
#
# Default:
config.logout_link_method = :get
到
config.logout_link_method = :delete
如果您的设备配置使用的默认HTTP方法设置为:delete
,则必须进行此最后一次更改,除非您更改它。重要的是它们现在已同步,因为如果您按照这些说明操作,则将使用destroy_user_session_path
,这是已由设计定义的路径。否则,您将收到一条消息,指出[GET] / users / sign_out路由不存在。
答案 2 :(得分:4)
所有其他人所说的以及与指南一起提出的所有内容 http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model-with-rails-activeadmin-and-devise/
如果您在已经实现admin_user模型时选择恢复为具有单个用户模型的选项,那么会在信息上添加一些额外的位(即现在您拥有'用户'和'admin_user '模特)。
包括其他步骤
从routes.rb中删除devise_for :admin_users, ActiveAdmin::Devise.config
将代码从app/admin/admin_user.rb
复制到app/admin/user.rb
(仅使用所需内容)
删除app/admin/admin_user.rb
(或者你会得到一个Uninitialized constant error on AdminUser)就像这个人(以及我一样)。
答案 3 :(得分:4)
如果您已经使用默认设置安装了ActiveAdmin,并且想要在现有模型上使用User.is_admin
字段对用户进行身份验证,并删除admin_user表,则会显示以下过程:
回滚admin_user迁移(如果您在安装Active Admin时未使用--skip-users
):
rake db:migrate:down VERSION=20141205110842 # create_active_admin_comments.rb
rake db:migrate:down VERSION=20141205110831 # add_devise_to_admin_users.rb
rake db:migrate:down VERSION=20141205110820 # devise_create_admin_users.rb
然后删除这3个文件。
在路由中,删除行devise_for :admin_users, ActiveAdmin::Devise.config
在application_controller.rb中,添加:
def authenticate_admin!
if current_user && current_user.is_admin
# fine
else
redirect_to new_user_session_path
end
end
在active_admin.rb中:
config.authentication_method = :authenticate_admin!
config.current_user_method = :current_user
config.logout_link_path = :destroy_user_session_path
config.allow_comments = false
config.logout_link_method = :get # couldn't get active_admin to sign out via :delete. So I configure devise to sign out via :get.
要配置设计以通过:get
注销,请添加devise.rb:
config.sign_out_via = :get
# And for every occurrence of destroy_user_session_path, remove the option method: delete.
创建is_admin迁移:
rails g migration add_is_admin_to_user is_admin:boolean
像这样编辑迁移:
class AddIsAdminToUser < ActiveRecord::Migration
def change
add_column :users, :is_admin, :boolean, default: false
end
end
并迁移:
rake db:migrate
如果在rails 4中,请不要忘记在permit_params中添加is_admin。在app / admin / user.rb中:
permit_params ....., :is_admin
在控制台中为管理员用户添加权限:
u = User.find(42); u.is_admin = true; u.save
享受