Question

Tout en développant une application, il est très utile de pouvoir identifier rapidement les différents utilisateurs, avec des rôles différents, pour voir comment l'application se présente.

noms d'utilisateur de frappe et entrer le mot de passe est pas amusant, et une perte de temps. Ce que je voudrais faire est:

  • ajouter une page / panneau avec une liste de noms d'utilisateurs disponibles;
  • en cliquant sur un nom d'utilisateur génère un événement pour la sécurité de printemps, qui lui permet de reconnaître l'utilisateur comme authentifié, sans entrer dans les mots de passe;
  • après avoir cliqué sur le lien, je suis authentifié comme l'utilisateur spécifié.

N.B. :.. Les mots de passe sont hachés et soumis en texte brut en utilisant des formes, de sorte que le codage des mots de passe dans les liens ne sont pas une option

De toute évidence cette fonctionnalité ne sera présent au moment du développement.

Comment puis-je y parvenir?

Était-ce utile?

La solution

Je l'ai fait de cette façon pour une application web:

J'ai un paramètre de configuration du serveur context.xml (bien sûr que dans le serveur de développement). Ce paramètre contient le coma liste des noms d'utilisateur et seperated mots de passe.

La page de connexion (jsp (x)) ajouter simplement une forme supplémentaire et soumettre bouton pour chaque nom d'utilisateur, mot de passe élément forment le paramètre de contexte. Ainsi, si un utilisateur clique sur ce bouton, le processus d'ouverture de session normale avec les données de connexion prédéfinie est déclenchée.

context.xml Server

...
<Context>
    ...
    <Parameter name="quickLogin"
               value="admin:passwd,user:otherPasswd"
               override="false" />
</Context>

login.jspx

...
<!-- Login for debugging purposes -->     
<c:forTokens items="${initParam.quickLogin}" delims="," var="loginPassword">
    <c:set var="login" value="${fn:split(loginPassword, ':')[0]}" />
    <c:set var="password" value="${fn:split(loginPassword, ':')[1]}" />

    <form name="debugLogin" action="${form_url}" method="POST" >
        <crsf:hiddenCrsfNonce/>
        <input type="hidden" name='j_username' value="${fn:escapeXml(login)}" />
        <input type="hidden" name='j_password' value="${fn:escapeXml(password)}" />
        <input type="submit" value="${fn:escapeXml(login)} login" />
    </form>
</c:forTokens>
...

Autres conseils

Utilisez InMemoryDaoImpl pour le mode de développement. Il est très facile de créer des utilisateurs et des mots de passe stockés dans la mémoire:

<bean id="userDetailsService" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
  <property name="userMap">
    <value>
      admin=admin,ROLE_ADMIN,ROLE_USER
      user1=user1,ROLE_USER
      user2=user2,ROLE_USER
    </value>
  </property>
</bean>

En mode de développement injecter ceci à votre fournisseur d'authentification. Dans la production remplacer par la bonne mise en œuvre DB ou LDAP.

Si je comprends bien, vous voulez avoir le SpringSecurity vous authentifie automatiquement si une URL spécifique est demandée (et vous auriez un lien vers cette URL dans votre panneau / page).

Que diriez-vous d'écrire un filtre personnalisé:

public class YourSpecialDevelopmentTimeFilter 
extends AuthenticationProcessingFilter 
implements SyncSecurityFilter
....

qui remplacerait:

protected boolean requiresAuthentication(
     HttpServletRequest request, HttpServletResponse response)

et retourne vrai en fonction de certains paramètres dans le request?

Bien sûr une autre préoccupation est de ne pas avoir cette fonctionnalité dans les environnements de production. C'est toujours une chose risquée d'avoir différente base de code pour dev et prod .

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