Question

Je construis une application Web en utilisant des rayures et du printemps. Il doit avoir une fonction de connexion / authentification. En ce moment, je stocke les informations utilisateur séparé des informations d'identification utilisateur dans la base de données. Mon modèle d'utilisateur ne contient pas les informations d'identification que je ne veux pas être passe autour des mots de passe précieux.

Spring gère toutes

mon DAO.

Maintenant, je suis en place un système de sécurité basé non conteneur. Je stocke le hachage sha-2 du mot de passe et effectuer une comparaison sur le mot de passe qui a été présenté sous la forme contre ce qui est stocké dans la base de données. Cette comparaison a été testé et fonctionne. J'essaie de comprendre comment câbler cette chose ensemble. En ce moment j'ai un LoginActionBean qui attire les demandes de connexion et utilise un singleton « de PasswordService » qui utilise un UserDAO interne pour récupérer des informations d'identification et d'effectuer la comparaison avec les paramètres soumis. Mon grain de printemps est:

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance">
    <property name="userDAO" ref="userDAO"/>
</bean>

Mais alors le singleton PasswordService a besoin d'un:

public void setUserDAO(UserDAO userDAO) { ...}

méthode qui ne fait pas vraiment de sens dans un singleton (UserDAO est une interface).

Je suis à la recherche d'une bonne conception. J'ai lu que ServiceLocators sont la raison du printemps a été inventé. Toute pensée?

Je voudrais aussi savoir comment que je peux concevoir cela. J'ai un ActionBean qui est appelée lorsque l'utilisateur clique sur « Connexion », mais comment puis-je réellement authentifie. Est-ce que j'Injecter le service d'authentification dans le haricot? Est-ce que je crée un singleton que tout le monde peut appeler? Ai-je une interface générique que le LoginAcionBean utilise qui ressort injectent? Si je n'utilisais pas de printemps, comment serait-il fait?

Était-ce utile?

La solution

  1. Je ne comprends pas pourquoi il ne fait pas de sens pour injecter le userDao.

  2. Je ne comprends pas pourquoi votre xml utilise méthode usine = « getInstance »; vous pouvez jeter tous les trucs d'exemple et d'autres choses singleton; printemps instanciera une seule instance de la classe de service de mot de passe et l'injecter dans de nombreuses classes mais ont besoin, et ils vont tous obtenir la même instance. Ainsi, le printemps est de créer un singleton pour vous. La classe de service de mot de passe peut être un simple POJO. De même pour la mise en œuvre de userDao.

Je conseille également regarder, comprendre, et en utilisant les annotations de printemps. Fondamentalement, vous utilisez @Service la classe qui sera injectée, puis utilisez @Autowired sur le setter dans la classe où il est injecté. Vous devez également ajouter quelque chose à votre fichier de configuration XML pour activer les choses d'annotation.

Autres conseils

Ajout à la réponse ci-dessus, il suffit d'utiliser l'injection de constructeur si vous ne voulez pas un setter pour le DAO:

<bean id="passwordSerivce" class="...PasswordService">
   <constructor-arg ref="userDAO"/>
</bean>

À moins que le grain n'est pas une classe que vous contrôlez, vous n'avez pas besoin d'en faire un Singleton, Spring fera que par défaut.

Je ne suis personnellement pas fan des annotations.

Ma solution était d'avoir une interface avec une méthode « Authentifier ». Ensuite, créez une classe de service qui implémente l'interface avec un constructeur qui prend un objet UserDAO. De cette façon, l'objet qui nécessite le service n'effectue pas instanciation (il est fait au printemps) et ne connaît pas ce que la mise en œuvre sous-jacente est effectuée (ldap, SSO, comparaison simple mot de passe, etc.). Semble faire le travail: P

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top