it-swarm.com.de

IP-Filter mit Spring Security

Ich frage mich, wie der Zugriff der Benutzer auf meine Web-App mithilfe von Spring Security nach ihrer IP-Adresse gefiltert werden kann. Soll ich AbstractAuthenticationProcessingFilter oder etwas ähnliches erweitern und seine Methoden auf meine eigene Weise überschreiben? Wenn ja, könnte Sie geben ein Beispiel für eine solche Erweiterung und ein Beispiel für die Filterbeschreibung in web.xml Vielen Dank im Voraus.

P.S. In meiner App habe ich auch Spring Security-Unterstützung (standardmäßig org.springframework.web.filter.DelegatingFilterProxy), aber ich möchte nicht nur die Anmeldeinformationen der Benutzer prüfen, sondern auch deren IP-Adressen.

16

Eine Möglichkeit hierfür ist die Verwendung von Spring Security Web Security Expressions . Zum Beispiel:

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

Anshus Antwort ist eine gute Idee, einen Benutzer über die IP-Adresse zu authentifizieren, funktioniert aber möglicherweise nicht mit der CAS-Authentifizierung. Ich habe eine andere Auflösung, die Verwendung eines Filters ist eher für diese Situation geeignet.

public class IPAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
    private AuthenticationUserDetailsService<CasAssertionAuthenticationToken> authenticationUserDetailsService;
    private static Set<String> ipWhitelist;

    @Autowired
    private AppProperty appProperty;

    @PostConstruct
    public void init() {
        ipWhitelist = new HashSet<>(Arrays.asList(appProperty.getIpWhitelist()));
        setAuthenticationSuccessHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(
                    HttpServletRequest httpServletRequest,
                    HttpServletResponse httpServletResponse,
                    Authentication authentication) throws IOException, ServletException {
                // do nothing
            }
        });
    }

    public IPAuthenticationFilter() {
        super("/");
    }

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException, IOException {
        String userName = request.getHeader(appProperty.getHeaderCurUser());
        Assertion assertion = new AssertionImpl(userName);
        CasAssertionAuthenticationToken token = new CasAssertionAuthenticationToken(assertion, "");
        UserDetails userDetails = authenticationUserDetailsService.loadUserDetails(token);

        CasAuthenticationToken result = new CasAuthenticationToken(
                "an-id-for-ip-auth",
                userDetails,
                request.getRemoteAddr(),
                userDetails.getAuthorities(),
                userDetails,
                assertion
        );
        return result;
    }

    protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {
        String userName = request.getHeader(appProperty.getHeaderCurUser());
        return ipWhitelist.contains(request.getRemoteAddr()) && !StringUtils.isEmpty(userName);
    }

    protected void successfulAuthentication(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain chain,
            Authentication authResult) throws IOException, ServletException {
        super.successfulAuthentication(request, response, chain, authResult);
        chain.doFilter(request, response);
    }

    public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> getAuthenticationUserDetailsService() {
        return authenticationUserDetailsService;
    }

    public void setAuthenticationUserDetailsService(
            AuthenticationUserDetailsService<CasAssertionAuthenticationToken> authenticationUserDetailsService) {
        this.authenticationUserDetailsService = authenticationUserDetailsService;
    }
}

Sie können diesen Filter wie folgt hinzufügen:

http.addFilterBefore(ipAuthenticationFilter(), CasAuthenticationFilter.class)
1
Hector