Concevoir l'authentification avec les sous-classes STI et l'administrateur des rails
-
13-11-2019 - |
Question
J'utilise donc STI pour incorporer certains rôles dans la table de mon utilisateur. En ce moment, j'ai juste des utilisateurs et des administrateurs normaux. J'ai installé Rails_admin et j'ai besoin d'un moyen d'authentifier les administrateurs, mais je ne sais pas comment le faire en toute sécurité.
En ce moment, j'ai ce code dans mon contrôleur d'application
def authenticate_admin!(opts={})
current_admin || redirect_to(?)
end
def current_admin
current_user if current_user.is_a? Admin
end
Dans mon fichier rails_admin.rb, j'ai ceci
config.authenticate_with do
authenticate_admin!
end
Mon problème actuel est que je ne peux pas faire dire que le redirect_to vers quoi que ce soit. Je continue d'obtenir des erreurs. Est également une simple redirection si l'utilisateur n'est pas un administrateur tout ce dont j'ai besoin? Est-ce que cette meilleure pratique est la plus sûre? Est-ce que je vais dans la bonne direction ici? Toute aide serait appréciée. Merci
La solution
Ok, quelques choses:
1) Cancan est assez facile à utiliser et vaut l'installation mineure. Voici un exemple de l'application / modèles / capacité.rb pourrait ressembler si vous avez deux méthodes d'instance utilisateur est_admin? Et est_reviewer?
class Ability
include CanCan::Ability
def initialize(user)
if user && user.is_reviewer?
can :access, :rails_admin
can :dashboard
cannot :read, [Class1, Class2, Class3]
can :read, Class4
end
if user && user.is_admin?
can :access, :rails_admin
can :manage, :all
end
end
end
Votre configuration Railsadmin contiendrait ce qui suit:
RailsAdmin.config do |config|
config.authorize_with :cancan
...
end
Et n'oubliez pas, vous devrez ajouter Cancan à votre gemfile pour être installé comme dépendance.
2) Ensuite, et probablement plus précieux, c'est que vous ne voulez pas lancer le code de redirection dans la méthode d'authentification. Au lieu de cela, vous voudrez peut-être ajouter ce qui suit à ApplicationController:
rescue_from Acl9::AccessDenied do |exception|
respond_to do |format|
format.json do
render :json => { :success => false, :message => "You do not have access to do this action." }
end
format.html do
flash[:error] = 'You do not have access to view this page.'
redirect_to root_url
end
end
end
Ou juste:
rescue_from Acl9::AccessDenied do |exception|
flash[:error] = 'You do not have access to view this page.'
redirect_to root_url
end