2009-07-01 9 views
2

Während der Entwicklung einer Anwendung ist es sehr nützlich, in der Lage zu sein, sich schnell als verschiedene Benutzer mit unterschiedlichen Rollen anzumelden, um zu sehen, wie sich die Anwendung präsentiert.Spring Sicherheit Vor-Authentifizierung für Entwicklungsmodus

Eingabe von Benutzernamen und die Eingabe von Passwort ist kein Spaß, und eine Verschwendung von Zeit. Was ich möchte, ist:

  • fügen Sie eine Seite/Panel mit einer Liste der verfügbaren Benutzernamen;
  • Durch Klicken auf einen Benutzernamen wird ein Ereignis für die Spring-Sicherheit generiert, mit dem der Benutzer als authentifiziert erkannt werden kann, ohne dass Kennwörter eingegeben werden müssen.
  • nach dem Klicken auf den Link Ich bin als der angegebene Benutzer authentifiziert.

N.B.: Passwörter werden mit Hilfe von Formularen verschlüsselt und in Klartext übermittelt. Daher ist die Kodierung der Passwörter in den Links keine Option.

Offensichtlich Diese Funktion wird nur zur Entwicklungszeit vorhanden sein.

Wie kann ich das erreichen?

Antwort

2

Ich habe es auf diese Weise für eine Web-Anwendung getan:

Ich habe einen Konfigurationsparameter in context.xml des Servers (natürlich nur in dem Entwicklungsserver). Dieser Parameter enthält eine Koma-getrennte Liste von Benutzernamen und Passwörtern.

Die Login-Seite (jsp (x)) fügen Sie einfach ein zusätzliches Formular und senden Sie die Schaltfläche für jeden Benutzernamen, Passwort-Element aus dem Kontext-Parameter. Wenn ein Benutzer auf diese Schaltfläche klickt, wird der normale Anmeldevorgang mit den vordefinierten Anmeldedaten ausgelöst.

Serverkontext.xml

... 
<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> 
... 
0

Wie ich verstehe, möchten Sie, dass SpringSecurity Sie automatisch authentifiziert, wenn eine bestimmte URL angefordert wird (und Sie einen Link zu dieser URL in Ihrem Panel/Ihrer Seite haben).

Wie über einen benutzerdefinierten Filter zu schreiben:

public class YourSpecialDevelopmentTimeFilter 
extends AuthenticationProcessingFilter 
implements SyncSecurityFilter 
.... 

, die außer Kraft setzen würde:

protected boolean requiresAuthentication(
    HttpServletRequest request, HttpServletResponse response) 

und return true abhängig von einigen Parametern im request?

Natürlich ist eine andere Sorge, diese Funktionalität in den Produktionsumgebungen nicht zu haben. Das ist immer eine riskante Sache, um unterschiedliche Codebasis für dev und prod zu haben.

4

Verwenden Sie InMemoryDaoImpl für den Entwicklungsmodus. Es ist sehr einfach, Benutzer und Passwörter im Speicher zu erstellen:

<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> 

Im Entwicklungsmodus injizieren Sie dies zu Ihrem Authentifizierungsanbieter. In der Produktion ersetzen Sie es durch die richtige DB- oder LDAP-Implementierung.

Verwandte Themen