Vou assumir que você já instalou o devise em seu aplicativo Rails. Também vamos supor que você já esteja usando sua rota / admin. E vamos supor que você protegeu sua rota administrativa possivelmente com um código como este:
app/controllers/admin_controller.rb
class AdminController < ApplicationController
before_filter :require_permission
private
def require_permission
if not current_user.try(:admin?)
redirect_to root_path
end
end
end
ou em seu arquivo de rotas
config/routes.rb
authenticated :user, lambda {|u| u.admin } do
get 'admin', to: 'admin#index'
end
mas talvez você só queira vincular ao ActiveAdmin a partir da página inicial de um usuário, se ele for um administrador. Você pode simplesmente entrar em sua visão:
<% if current_user.admin? %>
<%= link_to "ActiveAdmin", "/your_active_admin_url" %>
<% end %>
mas então qualquer um pode entrar yourwebsite.com/your_active_admin_url
se conhecer o diretório (presumindo que as outras medidas de segurança não estejam em vigor). Então vamos subir a paranóia e fazer o diretório mudar aleatoriamente a cada reinicialização do Rails
Primeiro, vamos editar nosso arquivo inicializador ActiveAdmin.
config/initializers/active_admin.rb
require 'securerandom'
ActiveAdmin.setup do |config|
config.default_namespace = SecureRandom.base64( 24
).gsub( /[+/=]/, ""
).prepend( "aa"
).downcase
end
e vamos torná-lo um subdiretório sob administração. Portanto, em nosso arquivo de rotas:
config/routes.rb
scope :admin do
devise_for :admin_users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
end
Agora, como o namespace é aleatório, ele se parecerá com isso e mudará toda vez que o Rails for reiniciado./admin/aanoh3viemwxppom9sxgfpdhv99c01gsf/dashboard
Você pode estar pensando … bem, isso é legal e tudo, mas como vou saber como chegar à página ActiveAdmin em um servidor onde não vejo as rotas? Não consigo adivinhar …
Agora é aqui que você precisará de um ajudante de caminho de url para atualizar seus links sempre que o caminho mudar. Então, vamos criar um método auxiliar. Cole isso em seu arquivo:
app/helpers/application_helper.rb
module ApplicationHelper
def active_admin
ObjectSpace.each_object(
ActiveAdmin::Resource::Routes
).first.namespace.name
end
end
e agora, toda vez que você quiser usar os ajudantes de caminho integrados do Rail, você os adicionará com uma avaliação disso. Por exemplo:
eval("#{active_admin}_dashboard_path")
Agora você pode alterar o link na página de usuários administradores para este:
<% if current_user.admin? %>
<%= link_to "ActiveAdmin", eval("#{active_admin}_dashboard_path") %>
<% end %>
E você conseguiu! Caminho de pasta aleatório para ActiveAdmin alcançado! Portanto, para os paranóicos, sinta-se à vontade para incorporar TODOS os métodos acima para a segurança do administrador. E certifique-se de que funcionam antes de você se bloquear 😉
É claro que o elo mais fraco em segurança são as pessoas. Todos a quem você concede privilégios de administrador são um risco de segurança adicional. Porque as pessoas geralmente são suscetíveis à engenharia social. Portanto, certifique-se de que todos os administradores sejam informados sobre isso para ajudar a manter a integridade do seu sistema.
Deus abençoe! Codifique, comente, compartilhe!
-Daniel P. Clark