Je suis en train de créer une application rails où la connexion est optionnelle. En d'autres termes, beaucoup des mêmes actions/vues/contrôleurs/pages fonctionneront connectés ou déconnectés. Vous obtenez simplement plus de fonctionnalités si vous êtes connecté (comme l'application se souvient de ce que vous avez fait). J'utilise actuellement restful_authentication et role_requirement, et je me demande quel niveau utiliser. Je pourrais ajouter un nouveau rôle "utilisateur" que tous les utilisateurs connectés, par exemple, puis require_role "user"
et avoir des blocs de vue en utilisant @user.has_role?
... ou je pourrais améliorer le côté authentification des choses et faire des vérifications pour voir si l'utilisateur est authentifié. Ou je pourrais faire autre chose. Existe-t-il un moyen standard de gérer cela dans les rails?Comment gérer la connexion optionnelle dans les rails
Répondre
Vous intégrez votre gemme d'authentification à une gemme d'autorisation. Pour commencer, je recommanderais cancan car il est très simple et direct.
Si vous utilisez cancan, vous définissez ce que l'utilisateur peut/ne peut pas faire dans models/ability.rb.
class Ability
include CanCan::Ability
def initialize(user)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
Alors, selon vous, vous pouvez autoriser les fonctionnalités basées sur le rôle de l'utilisateur:
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %>
<% end %>
Si vous recherchez plus de puissance, vous voudrez peut-être envisager d'autres petit bijou d'autorisation, telles que declarative_authorization.
Il n'est pas nécessaire de vérifier l'autorisation pour les actions qui autorisent tous les utilisateurs.
Si vous avez une autorisation par défaut dans votre ApplicationController, tels que:
before_filter :authorize
Ensuite, soit enlever que tout, et ajoutez le dans uniquement pour les actions qui requièrent une autorisation ou, dans chaque contrôleur vous pouvez le désactiver avec:
skip_before_filter :authorize, :only => [:action_method_name]
vous devriez avoir une méthode simple dans votre ApplicationController où vous pouvez passer dans un rôle et d'obtenir un vrai si l'utilisateur actuel est autorisé:
def authorized? role
return true if current_user.roles.collect{|r| r.name.to_sym}.include(role.to_sym)
false
end
Ensuite, vous pouvez vérifier la procédure pour le rôle que vous voulez dans vos actions.
J'aimerais aussi que certaines pages affichent des vues différentes si l'utilisateur est connecté ou pas connecté. Des conseils à ce sujet? –