Die Authentifizierung Durch IP-Adresse, die Im Frühjahr 3.1: Der Intelligenteste Weg, Das Zu Tun?

Habe ich umgesetzt LDAP-Authentifizierung mithilfe von Spring Security 3.1. Meine security.xml Datei, die unten gebucht.

Muss ich ändern, um meine Authentifizierungs-Prozess, so dass, wenn ein Benutzer kommt auf die Webseite von einer IP-Adresse auf eine "weiße Liste" ( gehalten in einer Datenbank-Tabelle ), dann wird dieser Benutzer automatisch authentifiziert werden, die mit Spring 3.1 und dann umgeleitet Weg von der login-Bildschirm( nicht meine Idee, wurde mir gesagt, so).

Ist, wenn der Nutzer nicht aus einem der weissen Liste IP-Adressen, dann sollte er/Sie gezwungen sein, zu gehen durch die LDAP-Authentifizierung auf der login-Seite.

Ich bin neu in Spring und Spring Security so ging ich auf die Spring 3.1 Referenz-Dokumentation und Lesen Sie alle von Teil I. Es, Las ich den Rat, dass, wenn Sie irgendwelche speziellen Authentifizierung benötigt, sollten Sie Lesen Abschnitt II Architektur und Implementierung. Das Tat ich sehr langsam und machte sich Notizen.

Aber nun, da ich bin neu auf all dies bin ich nicht sicher, ob ich ganz verstehe, was muss ich tun und was ist der intelligenteste Weg zu gehen, es zu tun.


Update 3: ich habe die skeleton-code zu arbeiten, hier sind die Dateien, die ich landete mit


Meine eigenen AuthenticationProvider-Implementierung für die Authentifizierung durch IP-Adresse

//Authentication Provider To Authenticate By IP Address With Allowed IPs
//Stored in a db table


package acme.com.controller.security;

//import acme.com.controller.security.CustomUserInfoHolder;

import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;

import org.apache.log4j.Logger;


public class CustomIPAddressAuthenticationProvider implements AuthenticationProvider
{

    private static final Logger logger = Logger.getLogger(CustomIPAddressAuthenticationProvider.class);
    private GrantedAuthoritiesMapper authoritiesMapper = new NullAuthoritiesMapper();


    @Override
    public Authentication authenticate(Authentication authentication)
    throws AuthenticationException {


        WebAuthenticationDetails wad = null;
        String userIPAddress         = null;
        boolean isAuthenticatedByIP  = false;

        //Get the IP address of the user tyring to use the site
        wad = (WebAuthenticationDetails) authentication.getDetails();
        userIPAddress = wad.getRemoteAddress();


        logger.debug("userIPAddress == " + userIPAddress);

        //Compare the user's IP Address with the IP address in the database
        //stored in the USERS_AUTHENTICATED_BY_IP table & joined to the
        //USERS tabe to make sure the IP Address has a current user
        //isAuthenticatedByIP =  someDataObject.hasIPAddress(userIPAddress);
        isAuthenticatedByIP = true;


        //Authenticated, the user's IP address matches one in the database
        if (isAuthenticatedByIP)
        {

            logger.debug("isAuthenticatedByIP is true, IP Addresses match");
            UserDetails user = null;


            UsernamePasswordAuthenticationToken result = null;

            result = new UsernamePasswordAuthenticationToken("John Principal",
                                                              "PlaceholderPWE"); 

            result.setDetails(authentication.getDetails());

            return result;
        }


        //Authentication didn't happen, return null to signal that the 
        //AuthenticationManager should move on to the next Authentication provider
        return null;
    }


    @Override
    public boolean supports(Class<? extends Object> authentication)
    {
        //copied it from AbstractUserDetailsAuthenticationProvider
        return(UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
    }

}

Meine *-security.xml Datei

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:s="http://www.springframework.org/schema/security"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <s:http pattern="/login*" security="none"/>
    <s:http pattern="/search*" security="none"/>
    <s:http pattern="/css/**" security="none"/>
    <s:http pattern="/js/**" security="none"/>
    <s:http pattern="/images/**" security="none"/>




    <s:http auto-config="true" use-expressions="true">
        <s:intercept-url pattern="/**" access="isAuthenticated()" />

        <s:form-login login-page="/login"
          authentication-failure-url="/loginfailed" />
        <s:logout logout-success-url="/logout" />
    </s:http>



    <s:ldap-server url = "ldap://ldap-itc.smen.acme.com:636/o=acme.com"/>


    <bean id="customIPAddressAuthenticationProvider" class="com.acme.controller.security.CustomIPAddressAuthenticationProvider" />


    <s:authentication-manager>
        <!-- Proposed: Custom Authentication Provider: Try To Authenticate BY IP Address First, IF NOT, Authenticate WiTh THE LDAP Authentication Provider -->
        <s:authentication-provider ref="customIPAddressAuthenticationProvider" />
        <s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People"/>
    </s:authentication-manager>


</beans>
  • Das ist eine wirklich schlechte Idee. Was ist, wenn einer die weiß-gelistet-Adressen, die von einer NAT-firewall? Dann alle hinter firewall (könnte Hunderte von Leuten) werden automatisch authentifiziert, unabhängig davon, wer Sie sind.
  • Das wird nicht passieren, in unserer situation, und ich habe befohlen, dies zu tun.
  • Du bist wahrscheinlich gehen zu müssen, zu Experimentieren mit den Ansätzen, die Sie bereits erwähnt habe. Wenn die Liste der IP-Adressen nicht dynamisch ändern, könnten Sie laden Sie alle beim Systemstart.
  • Ein Teil von mir würde gerne eine statische Liste, so dass ich verwenden könnte, dass praktisch hasIPAddress () - Funktion, aber wir wollen wirklich, um die Dinge in eine Datenbank. Ich bin sicher, es wird die geringste meiner sorgen, aber ich Frage mich, wo unter einem benutzerdefinierten AuthenticationProvider, Authentifizierung, UserService ich werde in der Lage sein, um eine HTTPRequest-obj, so kann ich die IP-Adresse zu vergleichen, die für eine Datenbank-Liste
  • Schreiben Sie eine provider-Klasse ist der Weg zu gehen. In der provider-Klasse authenticate-Methode der authentication.getDetails(), standardmäßig gibt WebAuthenticationDetails(static.springsource.org/spring-security/site/docs/3.1.x/apidocs/...). Seine Methode getRemoteAddress geben Sie die IP-Adresse.
  • auch pls finden Sie unter stackoverflow.com/questions/5310147/...
  • Hilfreiche Kommentar! Danke Ritesh! Ich werde check it out heute und morgen. DANKE!
  • Hi Jungs. Ihre Kommentare waren sehr nützlich. Ich dachte über Sie, Lesen Sie weiter, versucht, einige Dinge, endete mit neuen Fragen. Wenn Sie nicht langweilen, aber ich wäre dankbar für jede weitere Unterstützung bekommen zu meinem Ziel. Danke. Steve
  • Es sieht gut aus. Null zurückgeben ist vollkommen in Ordnung. Die nächsten Anbieter in der Kette wird konsultiert, wenn Sie null zurückgeben, von der authenticate-Methode des providers. Siehe source-code von LdapUserDetailsManager, um zu sehen, wenn Sie es verwenden können zu bauen UserDetails (Methode loadUserByUsername). Sie nicht haben, um ObjThatImplementsAuthentication in SecurityContextHolder in der provider-Klasse. Stellen Sie sicher, dass ObjThatImplementsAuthentication, das sind Sie wieder, hat alles, was Sie brauchen (AUFTRAGGEBER, details und Behörden).
  • <s:authentication-provider ref="customAuthenticationProvider" /> Hinzufügen eines bean <bean id="customAuthenticationProvider" class="com.acme.controller.Sicherheit.die Authentifizierung.CustomAuthenticationProvider" />
  • Ich aktualisierte mein original-Beitrag im Licht der Kommentare. Ich bin immer noch ein problem. Vielen Dank im Voraus für irgendwelche Tipps.
  • static.springsource.org/spring-security/site/...
  • Vielleicht laufen in ein problem, wenn der application-server hinter einem reverse-proxy und Spring Security wird nicht versucht, die Abfrage für die Anfrage "X-Forwarded-For" HTTP-header, um den tatsächlichen Quell-IP-Adresse. In diesem Fall hast du Recht, es wäre toll, um Zugang zu den Rohstoffen des HttpServletRequest-Objekts.

InformationsquelleAutor Steve | 2012-04-13
Schreibe einen Kommentar