Frage

Ich bin relativ neu in der Spring Framework und Spring-Sicherheit.

Ich habe ein benutzerdefiniertes Authentifizierungsschema, HTML verwendet:

<form action="j_spring_security_check">
    <input type="text" name="j_username" value="abc"/>
    <input type="text" name="j_password" value="abc"/>
    <input type="text" name="myCustom1" value="pqr"/> <!-- maybe type="hidden" -->
    <input type="text" name="myCustom2" value="pqr"/> <!-- maybe type="hidden" -->
</form>

und der entsprechende Code:

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider
{
    @Override protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication)
    throws AuthenticationException
    {
        System.out.println("Method invoked : retrieveUser");
        //I have Username,password:
        //HOW CAN I ACCESS "myCustom1", "myCustom2" here ?
    }
}
War es hilfreich?

Lösung

Wenn Sie, um zusätzliche Formparameter verwenden müssen Sie den Benutzernamen und das Passwort zu manipulieren, können Sie Ihre eigenen AuthenticationProcessingFilter implementieren

http: / /static.springsource.org/spring-security/site/apidocs/org/springframework/security/ui/webapp/AuthenticationProcessingFilter.html

wird diese Klasse vollen Zugriff auf die Httprequest haben und damit alle zusätzlichen Parameter, die Sie einreichen. Wenn Ihr Ziel ist, diese Werte irgendwie verwenden den Benutzernamen und das Passwort zu ändern, das ist, wo Sie es tun würde.

Andere Tipps

Alle sind über große und perfekte Lösungen. Aber ich habe eine Abhilfe Art von Lösung verwendet, die perfekt funktioniert gut. Gebrauchte Multi-Tenant-ID für Thread

package com.mypackage.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.util.Assert;

public class ThreadLocalContextUtil implements Filter{
     private static final ThreadLocal<Object> contextHolder =
                new ThreadLocal<Object>();

       public static void setTenantId(Object tenantId) {
          Assert.notNull(tenantId, "customerType cannot be null");
          contextHolder.set(tenantId);
       }

       public static Object getTenantId() {
          return contextHolder.get();
       }

       public static void clearTenant() {
          contextHolder.remove();
       }

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // Set the tenant Id into a ThreadLocal object
        ThreadLocalContextUtil.setTenantId(request);
        if(chain != null)
            chain.doFilter(request, response);
        else {
            //error
        }
    }

    public void init(FilterConfig filterconfig) throws ServletException {

    }
}

Feder Sicherheit xml     

<security:http auto-config="true" use-expressions="true" access-denied-page="/forms/auth/403" >
    <security:custom-filter before="FIRST" ref="tenantFilter" />
    ......
    </security:http>

Zugriffsanforderungsobjekt in Ihrer Authentifizierung Klasse

HttpServletRequest currRequest = (HttpServletRequest) ThreadLocalContextUtil.getTenantId();

Verwenden Sie dann das Request-Objekt Ihre benutzerdefinierten Parameter erhalten

Der Trick dabei ist, dass Sie einen neuen AuthenicationToken (vielleicht), die sich UsernameAndPasswordAuthenicationToken erstellen und als @emills sagt, Sie müssen dann eine neue AuthenciationProcessingFilter implementieren, um die Anforderungswerte an den Token zur Karte und senden Sie diese an die AuthenicationManager.

Grundsätzlich gibt es ein paar Teile, um eine benutzerdefinierte authenication Kette im Frühjahr Sicherheit Umsetzung

  • AuthenicationToken - Details der authenication Anfrage und es ist Ergebnis, dh enthält Anmeldeinformationen zur Authentifizierung benötigen
  • AuthenicationProvider - mit dem AuthenicationManager registriert, nimmt Ihre AuthenicationToken und überprüft den Benutzer und gibt einen Token mit den gewährten Behörden
  • AuthenciationFilter - nicht wirklich ein Filter sein müssen, nur mit AbstractProcessingFilter wird Ihr Leben ein wenig leichter
  • machen

Ich würde auf diese Weise:

<bean id="authenticationProcessingFilter"  
    class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  ...
  <property name="authenticationDetailsSource">
    <bean class="org.acegisecurity.ui.AuthenticationDetailsSourceImpl">
        <property name="clazz"  
           value="com.MyAuthenticationDetails"/>
    </bean>
  </property>
</bean>  

Dies ist die Klasse, die die Eigenschaften gilt:

package com;
import javax.servlet.http.HttpServletRequest;
import org.acegisecurity.ui.WebAuthenticationDetails;
public class MyAuthenticationDetails extends WebAuthenticationDetails {
    public MyAuthenticationDetails() {
      super();
    }
    //This constructor will be invoqued by the filter
    public MyAuthenticationDetails(HttpServletRequest request) {
        super(request);
        this.myCustom1 = request.getParameter("myCustom1");
    }
    public String getMyCustom1() {
        return myCustom1;
    }
    private String myCustom1;
}

Jetzt haben Sie den Benutzernamen, das Passwort und die Details.

Ich habe eine ähnliche Sache getan, aber anders als jemand hat hier vorgeschlagen. Ich sage das nicht der „richtige“ Weg, es zu tun - aber es ist sehr gut für mich gearbeitet. Im Hauptobjekt gibt es den Benutzer, und es gibt auch ein Detail im AuthenticationToken Objekt, das Sie eine Karte speichern können (String, String) von anderer Login-Info.

public class RequestFormDeatils extends SpringSecurityFilter {

   protected void doFilterHttp(HttpServletRequest request, ...) {
      SecurityContext sec = SecurityContextHolder.getContent();
      AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication();
      Map<String, String> m = new HashMap<String, String>;
      m.put("myCustom1", request.getParamtere("myCustom1"));
      m.put("myCustom2", request.getParameter("myCustom2"));
      auth.setDetails(m);
}

Jetzt überall in Ihrem Code erhalten Sie die Security verwenden diese sicherheitsrelevanten Informationen zu verbreiten, ohne es zu Ihren Userdetails zu Paar, Objekt, oder es als Argumente übergeben. Ich mache diesen Code in einem SecurityFilter am Ende der Spring Security-Filter-Kette.

<bean id="requestFormFilter" class="...RequestFormDetails">
   <custom-filter position="LAST" />
</bean> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top