web-dev-qa-db-fra.com

Comment gérer l'authentification / autorisation avec les utilisateurs dans une base de données?

Actuellement, je travaille sur un projet web utilisant JSF 2.0, Tomcat 7 et MongoDB. J'ai une grande question de savoir comment gérer la gestion de session et l'authentification/autorisation avec les utilisateurs dans une base de données.

La structure que je souhaite est la suivante: seuls les utilisateurs connectés peuvent créer des événements et tout le monde peut voir les événements créés.

  • create.xhtml -> uniquement pour les utilisateurs connectés.
  • events.xhtml -> public pour tout le monde.

La structure de base que je prévois est:

  • Vérifiez si la page nécessite un utilisateur connecté (par exemple create.xhtml)
  • Si oui, vérifiez si l'utilisateur est connecté
  • Si l'utilisateur n'est pas connecté, accédez à login.xhtml
  • Si vous êtes connecté avec succès, revenez à la page demandée
  • Conservez les informations "L'utilisateur est connecté" à moins que l'utilisateur ne clique sur le bouton de déconnexion. (là je suppose que @SessionScoped entre en jeu)

La question est:

  1. Quelle est la manière la moins compliquée de procéder?
  2. Où dois-je utiliser le @SessionScoped annotation? Dans Create.Java ou LoginManager.Java?
  3. La sécurité du printemps semble un peu compliquée pour mon problème, en ai-je vraiment besoin? si oui, pouvez-vous expliquer un peu comment l'implémentation fonctionne avec JSF 2.0 et Mongo DB?
29
whizzkid

Il existe plusieurs options. Le choix dépend entièrement de vous. Il suffit de peser objectivement les avantages et les inconvénients concrets qui correspondent à votre propre situation.


1. Utilisez Java EE fourni authentification gérée par conteneur

Déclarez simplement un <security-constraint> Dans web.xml Qui fait référence à un domaine de sécurité configuré dans servletcontainer. Vous pouvez pour votre webapp spécifier des modèles d'URL dont la connexion et/ou les rôles doivent être vérifiés, par exemple /secured/*, /app/*, /private/*, Etc.

Avant Java EE 8, vous devez malheureusement encore configurer une sécurité réelle d'une manière spécifique au servletcontainer. Elle est généralement décrite dans la documentation spécifique au servletconainer. Dans le cas de Tomcat 8, c'est le Realm HOW-TO Par exemple, un domaine basé sur une base de données basé sur des tables d'utilisateurs/rôles est décrit dans la section "JDBCRealm".

Depuis Java EE 8, il y aura enfin une API standard basée sur JSR-375 .

Avantages:

  • Relativement rapide et facile à installer et à utiliser.
  • Depuis Java EE 8, il existe enfin une API standard robuste et flexible.

Désavantages:

  • Avant Java EE 8, la configuration du domaine est spécifique au conteneur. Dans Java EE 8, la nouvelle spécification de sécurité JSR-375 devrait résoudre cela à l'aide de JASPIC .
  • Avant Java EE 8, il n'y a pas de contrôle à grain fin.
  • Avant Java EE 8, c'est très spartiate; pas de "souvenir de moi", mauvaise gestion des erreurs, pas de restriction basée sur les autorisations.

Voir également:


2. Homegrow a filtre de servlet

Cela permet un contrôle beaucoup plus fin, mais vous devrez écrire tout le code vous-même et vous devriez vraiment savoir/comprendre comment mettre en œuvre un tel filtre pour éviter les failles de sécurité potentielles. Côté JSF, vous pouvez par exemple simplement mettre l'utilisateur connecté en tant qu'attribut de session par sessionMap.put("user", user) et vérifier dans le filtre si session.getAttribute("user") n'est pas null.

Avantages:

  • Contrôle à grain fin.
  • Complètement indépendant du conteneur.

Désavantages:

  • Réinvention de la roue; les nouvelles fonctionnalités nécessitent beaucoup de code.
  • En tant que démarreur, vous ne savez jamais si votre code est 100% robuste.

Voir également:


3. Adapter un framework tiers

Par exemple, Apache Shiro , Spring Security , etc. Cela offre généralement des options de configuration plus fines que l'authentification gérée par conteneur standard et vous n'avez pas besoin d'écrire de code pour vous-même, attendez-vous à la page de connexion et à une configuration (XML) bien sûr.

Avantages:

  • Contrôle à grain fin.
  • Complètement indépendant du conteneur.
  • Pas de réinvention de la roue; minimum de code propre.
  • Développé et testé en profondeur par de nombreux utilisateurs, donc très probablement 100% robuste.

Désavantages:

  • Une courbe d'apprentissage.

Voir également:

58
BalusC