Le printemps de l'authentification de Sécurité de journalisation
Je suis en utilisant le Printemps de Sécurité 3.1 pour authentifier des utilisateurs pour un site web. Lorsqu'une connexion échoue parce que le printemps de sécurité est incapable de se connecter à la base de données, je reçois l'instruction suivante dans mon journal:
2012-07-12 11:42:45,419 [ajp-bio-8009-exec-1] DEBUG org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter - Authentication request failed: org.springframework.security.authentication.AuthenticationServiceException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!
Ma question est, pourquoi est-ce une instruction de DÉBOGAGE au lieu d'une ERREUR? J'ai wade à travers tout un tas d'instructions de débogage juste pour trouver l'erreur.
MODIFIER
Voici mon gestionnaire d'authentification:
<bean id="securityDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/securityDS"/>
<property name="resourceRef" value="true"/>
</bean>
<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder ref="encoder" />
<security:jdbc-user-service
data-source-ref="securityDataSource"
authorities-by-username-query="SELECT username, authority FROM login WHERE username = ?"
users-by-username-query="SELECT username, password, enabled FROM login WHERE username = ?"
/>
</security:authentication-provider>
</security:authentication-manager>
OriginalL'auteur Bryan Larson | 2012-07-12
Vous devez vous connecter pour publier un commentaire.
Que le message est imprimé dans
AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication
:Il y a un certain nombre de moyens d'authentification peut échouer, y compris celle fondée sur la saisie de l'utilisateur. Par exemple, dans
AbstractUserDetailsAuthenticationProvider.authenticate
, unBadCredentialsException
pourrait être levée si le nom d'utilisateur n'est pas trouvé:Car il pourrait y avoir des raisons légitimes pour lesquelles une authentification peut échouer, il ne fait pas de sens pour
AbstractAuthenticationProcessingFilter
pour enregistrer une erreur. Si il y a une erreur système, l'erreur doit avoir été enregistré en aval.Je soupçonne que le problème est dans
DaoAuthenticationProvider
(voir mon commentaire inline):Peut-être une erreur doit être consigné ici - vous pouvez vous connecter à un JIRA avec le Printemps à la demande. Mais peut-être qu'ils sont en supposant que tout le monde va fournir une coutume
UserDetailsService
et va attraper/log leurs propres exceptions. Si vous utilisezJdbcDaoImpl
il ne le fait pas. Je pense queJdbcDaoImpl
est destiné à être un exemple et n'est pas robuste. Pour les docs:Pouvez-vous poster le
<authentication-manager>
la section de votre config?La Question a été mise à jour.
Oui,
<security:jdbc-user-service>
estJdbcDaoImpl
. Donc, fondamentalement, si vous souhaitez mieux la journalisation des erreurs, vous aurez besoin d'écrire votre propreUserDetailsService
. La bonne nouvelle, c'est que c'est super facile à faire - il n'y a qu'une seule méthode que vous avez besoin pour mettre en œuvre (loadUserByUsername
).Si je dois jeter la commodité et la fiabilité de Printemps de Sécurité de l'out-of-the-box de mise en œuvre et utiliser mon propre juste pour le plaisir de mieux en mieux la journalisation pour les échecs de connexion? Qui sonne comme une perte de temps... pour ne pas mentionner l'ouverture de la porte pour l'introduction de nouveaux bugs.
OriginalL'auteur sourcedelica
Ma solution:
Pas d'autres configurations sont nécessaires.
J'ai réussi à utiliser l'enregistreur de données avec JDBC à utiliser quelque chose comme ceci: <bean id="authLogger" class="org.geowebcache.de sécurité.AuthenticationEventListener"> <property name="dataSource"> <ref bean="dataSource"/> </propriété> </bean>
OriginalL'auteur AlonL