2016-07-11 5 views
1

Ich habe Tabelle mit Benutzern. In dieser Tabelle befindet sich die Spalte "ip_address".Wie kann Benutzer nur durch IP-Adresse im Frühjahr Sicherheit authentifizieren?

Ich habe Server - Java-Server Ich habe Web-App auf Spring-Boot.

Spring Boot kommuniziert mit Java-Server durch Ruhe.

Ich brauche realisieren Benutzer im System von ip autorisieren. Whem Benutzer öffnen Webseite - Spring-Boot-App erhalten RemoteIpAddress (String ipAddress = request.getRemoteAddr();) und übergeben Sie es an Java-Server in URL. Java-Server überprüfen Sie diese IP in db in der Tabelle Benutzer und wenn Benutzer anmelden können, geben Sie diesen Benutzer Spring Boot App.

Ich möchte dies mit Federsicherheit realisieren. Aber wenn ich die Webseite öffne, öffnet sich im Browser das Dialogfenster zur Eingabe von Login und Passwort. Aber ich brauche kein Login und Passwort. Ich brauche, wenn Benutzer nicht null ist - geben Sie Zugriff auf Seiten und speichern Sie den Benutzer.

und wenn ich Eingabe Login und Passwort ein und drücken Sie „OK“ -Taste ich bewegen, um meine IPAddressBasedAuthenticationProvider

@Component 
public class IPAddressBasedAuthenticationProvider implements AuthenticationProvider { 
    @Autowired 
    private HttpServletRequest request; 
    @Autowired 
    AuthService authService; 

    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
     String ipAddress = request.getRemoteAddr(); 
     AuthLkUser authLkUserByIp = authService.getAuthLkUserByIp(ipAddress); 

     if (authLkUserByIp == null) return null; 

     boolean b = authService.checkAuthLkUser(authLkUserByIp); 
     if (b) return null; 
     final List<GrantedAuthority> grantedAuths = new ArrayList<>(); 
     GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_ADMIN"); 
     grantedAuths.add(grantedAuthority); 
     UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(), grantedAuths); 
     result.setDetails(authentication.getDetails()); 
     return result; 
    } 

    @Override 
    public boolean supports(Class<?> aClass) { 
     return true; 
    } 
} 

Und in dieser Klasse gespeichert Benutzer-Session. Und danach, wenn ich Webseiten öffne, brauche ich keine Eingabe-Login und Passwort. Es enthält in Sitzung. aber meine wep Seite nicht mit Fehlern openned

Whitelabel Error Page 

This application has no explicit mapping for /error, so you are seeing this as a fallback. 
Mon Jul 11 14:27:59 ALMT 2016 
There was an unexpected error (type=Forbidden, status=403). 
Access is denied 
+2

keine Konfiguration, keine Stack-Trace. Haben Sie Ihren Code tatsächlich debuggt? Auch imho ist es eine schreckliche Idee, die 'HttpServletRequest' zu injizieren, um die benötigten Informationen zu erhalten. Es ist Teil der 'WebAuthenticatioNDetails' welche auf 'Authentication' gesetzt ist, benutze diese stattdessen. Auch nicht sicher, ob Authentifizierung basierend auf IP-Adresse ist eine gute Idee, was ist mit großen Unternehmen, in der Regel haben sie nur eine einzige externe IP-Adresse aufgrund eines Proxy alle verwenden. –

Antwort

1

können Sie verwenden Expression-Based Access Control von der Feder. Um einzelne URL zu sichern, Sie sind in der Lage, so etwas zu tun:

<http use-expressions="true"> 
    <intercept-url pattern="/admin*" 
     access="hasRole('admin') and hasIpAddress('192.168.1.0/24')"/> 
    ... 
    </http> 

Wo Sie Ausdruck erstellt, wie wenn er Rolle Admin hat und seine IP Adresse ist xxx.xxx.x.x, dann ist es erlaubt. Sie suchen also nach hasIpAddress. Mehr über Expression-basierte Zugriffskontrolle ist in ihrem docs.

Wenn Sie diese Einschränkungen für den Frühling-Boot erstellen möchten und wenn Sie Apache Tomcat verwenden, dann sind Sie in der Lage einen Servlet-Filter (here ist Beschreibung) zu aktivieren und dann können Sie nur Remote-Adressfilter aktivieren und dann Legen Sie Adressen fest, die Sie zulassen möchten. Mehr über diesen Filter ist in Apache Tomcat docs.

Und eine andere Option ist, dass wenn Sie Spring Security verwenden. There is Klasse WebAuthenticationDetails, die Methode bereitstellen getRemoteAddress().

+0

Ich habe diese Lösung schon gesehen, aber ich weiß nicht, wo ist das? Ich habe keine web.xml – user5620472

+0

Sie haben keine web.xml? Fügen Sie Ihrer Frage weitere Konfigurationen und Projektstrukturen hinzu. – Hrabosch

+0

alles funktioniert ohne web.xml in Spring-Boot-App – user5620472

1

Für Spring Boot-Anwendungen, die mit dem eingebetteten Apache Tomcat-Container ausgeführt werden, können Sie den org.apache.catalina.filters.RemoteAddrFilter von Apache Tomcat verwenden.

@Bean 
public FilterRegistrationBean remoteAddressFilter() { 
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); 
    RemoteAddrFilter filter = new RemoteAddrFilter(); 
// filter.setAllow("127.0.0.1"); 
    filter.setAllow("127\\.0\\.0\\.1"); 
    filterRegistrationBean.setFilter(filter); 
    filterRegistrationBean.addUrlPatterns("/gs/serving-web-content/testParameters"); 
    return filterRegistrationBean; 
} 

erlauben: Ein regulärer Ausdruck, dass der Remote- Client des IP-Adresse verglichen (java.util.regex verwenden). Wenn dieses Attribut angegeben wird, MUSS die entfernte Adresse übereinstimmen, damit diese Anforderung akzeptiert wird. Wenn dieses Attribut nicht angegeben ist, werden alle Anfragen akzeptiert, sofern die entfernte Adresse nicht mit einem Verweigerungsmuster übereinstimmt.

können Sie diesen Artikel verweisen - How do I restrict access to my application by IP address?

Verwandte Themen