ti-enxame.com

Rails 3 - Active_admin pode usar um modelo de usuário existente?

Pode Active Admin usar meu modelo de usuário atual Devise? Ele já tem uma coluna chamada admin e, se for true, eu gostaria de ignorar o login do administrador ativo, ao acessar /admin.

Isso é possível?

Rotas atuais:

#Active admin
ActiveAdmin.routes(self)

#Devise
devise_for :admin_users, ActiveAdmin::Devise.config
devise_for :users, :path => "account"

O resto é basicamente padrão Devise + Active admin

51
Frexuz

Sim, você pode fazer isso quando executando o gerador pular a criação do modelo do usuário:

Rails generate active_admin:install --skip-users

Então no seu 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!

descomentar config.authentication_method e forneça seu método de autenticação para seu administrador, por exemplo:

# app/controllers/application_controller.rb
def authenticate_admin!
 redirect_to new_user_session_path unless current_user.is_admin?
end

Reinicie seu servidor e ele deve estar funcionando. Também dê uma olhada em Configuração de administrador ativo

Espero que isto ajude.

70
JCorcuera

Conforme declarado anteriormente, você precisará atualizar seu config/initializers/active_admin.rb para refletir o método de autenticação correto.

Além disso, no entanto, você também desejará atualizar as seguintes configurações:

# This setting changes the method which Active Admin calls
# to return the currently logged in user.
config.current_user_method = :current_admin_user

para

config.current_user_method = :current_user

e

# 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

para

config.logout_link_path = :destroy_user_session_path

Obviamente, você NÃO PRECISA atualizá-los (ou o método mencionado no post) e substitui os métodos em outros lugares, mas essa parece ser a abordagem mais fácil/limpa. Obviamente, você precisará substituir "usuário" em cada configuração (current_USER) com o nome do modelo usando a autenticação devise.

Também recomendo atualizar a seguinte configuração enquanto você estiver lá:

# This setting changes the http method used when rendering the
# link. For example :get, :delete, :put, etc..
#
# Default:
config.logout_link_method = :get

para

config.logout_link_method = :delete

Essa última alteração é necessária se o método HTTP padrão usado pela sua configuração do devise estiver definido como :delete, o que é, a menos que você o tenha alterado. É importante que agora eles estejam sincronizados, porque se você seguir estas instruções, estará usando destroy_user_session_path que é um caminho já definido pelo dispositivo. Caso contrário, você receberá uma mensagem informando que a rota [GET]/users/sign_out não existe.

26
jamesconant

Aqui está o processo, se você já instalou o ActiveAdmin com configurações padrão e deseja autenticar usuários com User.is_admin no seu modelo existente e remova a tabela admin_user:

Reversão de migrações admin_user (se você não usou --skip-users ao instalar o Active Admin):

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

Em seguida, remova esses 3 arquivos.

No roteamento, remova a linha devise_for :admin_users, ActiveAdmin::Devise.config

Em application_controller.rb, adicione:

def authenticate_admin!
  if current_user && current_user.is_admin
    # fine
  else
    redirect_to new_user_session_path
  end
end

Em 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.

Para configurar o devise para sair via :get, adicione devise.rb:

config.sign_out_via = :get
# And for every occurrence of destroy_user_session_path, remove the option method: delete.

Crie a migração is_admin:

Rails g migration add_is_admin_to_user is_admin:boolean

Edite a migração da seguinte maneira:

class AddIsAdminToUser < ActiveRecord::Migration
  def change
    add_column :users, :is_admin, :boolean, default: false
  end
end

E migre:

rake db:migrate

Se em Rails 4, não se esqueça de adicionar is_admin em allow_params. Em app/admin/user.rb:

permit_params ....., :is_admin

Adicione direitos a usuários administrativos, em um console:

u = User.find(42); u.is_admin = true; u.save

Desfrutar

4
Benjamin Crouzier

Tudo o que todos os outros disseram, bem como em conjunto com o guia apresentado em http://dan.doezema.com/2012/02/how-to-implement-a-single-user-model- with-Rails-activeadmin-and-devise /

que adiciona algumas informações adicionais se você optar por voltar para a opção de ter um modelo de usuário único quando já tiver implementado um modelo admin_user (ou seja, agora você tem um modelo de 'usuário' e 'admin_user') .

As etapas adicionais incluídas

retirar devise_for :admin_users, ActiveAdmin::Devise.config from routes.rb copiar código de app/admin/admin_user.rb para app/admin/user.rb (use apenas o necessário) delete app/admin/admin_user.rb (ou você receberá um erro constante não inicializado no AdminUser ) como esse cara teve (e eu também).

4
Jay Killeen