2017-02-17 1 views
0

Für Spring Sicherheitseinstellungen im Spring Boot. Der LDAP-Authentifizierungsanbieter ist standardmäßig für die Verwendung der BindAuthenticator-Klasse konfiguriert.Wie wird BindAuthenticator übergangen? HandleBindException für Spring LDAP-Authentifizierungseinstellung im Spring Boot

Diese Klasse enthält Methode

/** 
* Allows subclasses to inspect the exception thrown by an attempt to bind   with a 
* particular DN. The default implementation just reports the failure to  the debug 
* logger. 
*/ 
protected void handleBindException(String userDn, String username,  Throwable cause) { 
if (logger.isDebugEnabled()) { 
logger.debug("Failed to bind as " + userDn + ": " + cause); 
} 
} 

dieser Methode ist die Authentifizierung bezogenen Ausnahmen wie ungültige Anmeldeinformationen zu handhaben.

Ich möchte diese Methode übersteuern, damit ich dieses Problem behandeln und richtige Fehlermeldung auf der Grundlage von Fehlercodes zurückgeben kann, die von LDAP zurückgegeben werden. wie ein ungültiges Passwort oder der Account ist gesperrt.

Die aktuelle LDAP-Implementierung gibt immer "Bad Credentials" zurück, die nicht das richtige Bild dafür liefern, warum meine Anmeldeinformationen ungültig sind. Ich will die Fälle

  1. abzudecken, in denen das Konto gesperrt wird
  2. Passwort abgelaufen ist, so kann ich umleiten Passwort aufgrund Anzahl der ungültigen Kennwort
  3. Konto gesperrt Änderungen wiederholt

Bitte helfen

+0

Sollte es ... Wollen Sie das wirklich zu Ihrem Endbenutzer zurückgeben? Aus Sicherheitsgründen möchten Sie diese Informationen nicht veröffentlichen. Wenn ein Konto gesperrt ist, weiß ein Hacker, dass er einen gültigen Benutzernamen hat. Das gleiche gilt, wenn Sie ihm sagen, dass das Passwort falsch ist oder wenn kein Benutzername existiert. –

+0

@Denium Ich baue dies für die interne App nur der Mitarbeiter kann ins Intranet zugreifen. Das ist also die Erwartung von meinem Product Owner :) – Ahsan

+1

Aus Sicherheitsgründen spielt das keine Rolle. Wer sagt, alle Nutzer sind gutwillig, was ist mit verärgerten Mitarbeitern.Ich kann mir vorstellen, dass Sie diese Informationen in Ihren Protokollen möchten, aber Sie möchten so allgemein wie möglich für die Außenwelt sein. –

Antwort

1

Das Problem, das ich durch Definieren des LDAP-Kontexts anstelle der Verwendung des Spring Boot LDAPAuthenticationProviderConfigurer behoben.

Dann erstellt die FilterBasedLdapUserSearch und überschrieb die BindAuthentication mit meinem ConnectBindAuthenticator.

Ich habe eine separate LDAPConfiguration-Klasse für die Spring Boot-Konfiguration erstellt und alle diese benutzerdefinierten Objekte als Beans registriert.

Aus den oben genannten Objekten i LDAPAuthenticationProvider erstellt meine benutzerdefinierten Objekte, indem

Der Config ist Konstruktor wie unten

@Bean 
public DefaultSpringSecurityContextSource contextSource() { 
    DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(env.getProperty("ldap.url")); 
    contextSource.setBase(env.getProperty("ldap.base")); 
    contextSource.setUserDn(env.getProperty("ldap.managerDn")); 
    contextSource.setPassword(env.getProperty("ldap.managerPassword")); 
    return contextSource; 
} 

@Bean 
public ConnectBindAuthenticator bindAuthenticator() { 
    ConnectBindAuthenticator connectBindAuthenticator = new ConnectBindAuthenticator(contextSource()); 
    connectBindAuthenticator.setUserSearch(ldapUserSearch()); 
    connectBindAuthenticator.setUserDnPatterns(new String[]{env.getProperty("ldap.managerDn")}); 
    return connectBindAuthenticator; 
} 

@Bean 
public LdapUserSearch ldapUserSearch() { 
    return new FilterBasedLdapUserSearch("", env.getProperty("ldap.userSearchFilter"), contextSource()); 
} 
0

Sie haben Ihre Federsicherheitskonfiguration zu ändern, um Ihre Erweiterung von BindAuthenticator hinzuzufügen:

CustomBindAuthenticator.java

public class CustomBindAuthenticator extends BindAuthenticator { 

    public CustomBindAuthenticator(BaseLdapPathContextSource contextSource) { 
     super(contextSource); 
    } 

    @Override 
    protected void handleBindException(String userDn, String username, Throwable cause) { 
     // TODO: Include here the logic of your custom BindAuthenticator 
     if (somethingHappens()) { 
      throw new MyCustomException("Custom error message"); 
     } 

     super.handleBindException(userDn, username, cause); 
    } 
} 

feder security.xml

<beans:bean id="contextSource" 
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <beans:constructor-arg value="LDAP_URL" /> 
    <beans:property name="userDn" value="USER_DN" /> 
    <beans:property name="password" value="PASSWORD" /> 
</beans:bean> 

<beans:bean id="userSearch" 
    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <beans:constructor-arg index="0" value="USER_SEARCH_BASE" /> 
    <beans:constructor-arg index="1" value="USER_SEARCH_FILTER" /> 
    <beans:constructor-arg index="2" ref="contextSource" /> 
</beans:bean> 

<beans:bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <beans:constructor-arg> 
     <beans:bean class="com.your.project.CustomBindAuthenticator"> 
      <beans:constructor-arg ref="contextSource" /> 
      <beans:property name="userSearch" ref="userSearch" /> 
     </beans:bean> 
    </beans:constructor-arg> 
</beans:bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="ldapAuthProvider" /> 
</security:authentication-manager> 

Hoffe, es ist hilfreich.

Verwandte Themen