Spring Security permissionAll erlaubt keinen anonymen Zugriff

Lesezeit: 4 Minuten

Benutzer-Avatar
Marceau

Ich habe eine einzige Methode, auf die ich sowohl anonymen als auch authentifizierten Zugriff zulassen möchte.

Ich verwende Spring Security 3.2.4 mit Java-basierter Konfiguration.

Die überschriebene configure-Methode (in meiner benutzerdefinierten Konfigurationsklasse extension WebSecurityConfigurerAdapter) hat folgendes http Block:

    http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

Der Ping-Request-Handler und die Methode befinden sich in einem Controller, der auch den Login-Handler enthält, und es gibt keinen separaten @PreAuthorize oder andere Anmerkungen, die das Problem verursachen könnten.

Das Problem ist, dass der anonyme Zugriff verweigert wird und der Benutzer auf die Anmeldeseite umgeleitet wird.

Bei der Protokollierung auf Debug-Ebene sehe ich das folgende Feedback von Spring Security:

[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.sprin[email protected]6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.sp[email protected]123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point

Was ich erreichen möchte, ist eine Methode, die jederzeit aufgerufen werden kann und die eine Antwort sendet, die angibt, ob sich die Anfrage innerhalb einer angemeldeten Sitzung befindet oder nicht.

  • Was passiert, wenn Sie “/ping” oder “/ping*” als Muster verwenden?

    – Shaun das Schaf

    11. Juli 2014 um 11:38 Uhr

  • Sind Sie das Luke Taylor, dessen Name ich schon oft in Spring Security Javadoc-Kommentaren gesehen habe? Eine ziemliche Ehre, wenn das so ist! Leider ist das Verhalten bei Verwendung von /ping und bei Verwendung von /ping* dasselbe.

    – Marceau

    11. Juli 2014 um 11:52 Uhr


  • Sollte nicht dein authorizeRequests().anyRequest().authenticated() der Letzte sein? In XML ist die Reihenfolge der Elemente wichtig, daher kann ich mir vorstellen, dass dies auch für die Java-Konfiguration gilt.

    – M.Deinum

    11. Juli 2014 um 11:55 Uhr

  • @M.Deinum, ich habe deinen Vorschlag ausprobiert, indem ich die .authorizeRequests().antMatchers(“/ping**”).permitAll() davor gesetzt habe, und jetzt funktioniert es. Vielen Dank!

    – Marceau

    11. Juli 2014 um 12:03 Uhr

Die Berechtigungsreihenfolge ist wichtig, sie funktioniert, wenn ich sie so konfiguriere:

.authorizeRequests()
        .antMatchers("/ping**")
        .permitAll()
        .and()
.authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()

Benutzer-Avatar
PeiSong

Ich habe das gleiche Problem gesehen. Stellen Sie sicher, dass Sie nicht angerufen haben
super.configure(http);
anyRequest().authenticated();

wird standardmäßig aufgerufen.

Benutzer-Avatar
Kris

Muss hinzufügen .annonymous()

http
    .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
    .addFilterBefore(cf, ChannelProcessingFilter.class)
    .anonymous().and()
    .authorizeRequests().anyRequest().authenticated().and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

Verweis von: https://stackoverflow.com/a/25280897/256245

  • Oh, wie ich wollte, dass das funktioniert. Ich erhalte: verschachtelte Ausnahme ist java.lang.IllegalStateException: AntMatchers kann nach einer Anfrage nicht konfiguriert werden. springBootVersion = ‘2.3.3.RELEASE’

    – GranadaCoder

    2. Oktober 2020 um 19:18 Uhr

  • FWIW, ich musste .anonymous() an das Ende der Filterkette setzen, damit die Dinge richtig funktionieren. Es scheint, dass das Verhalten von .anonymous darin besteht, einen “anonymen” Benutzer hinzuzufügen. Wenn Sie es also früher in die Filterkette einfügen, fügt es diesen als Benutzer hinzu und nennt es gut.

    – Wird Iverson

    5. Februar 2021 um 0:02 Uhr

Ich hatte einen Tag lang mit diesem Problem zu kämpfen. Was ich am Ende tun musste, ist, die zu entfernen @Component Anmerkung aus meinem Filter und instanziieren Sie sie manuell, wie in dieser Antwort beschrieben.

Für die ursprüngliche Frage würde dies also ungefähr so ​​​​aussehen:

http
    .addFilterBefore(new MultiPartFilter(), ChannelProcessingFilter.class)
    .addFilterBefore(new OtherFilter(), ChannelProcessingFilter.class)
    .authorizeRequests() // ... rest omitted for brevity

Ich musste diese Endpunkte auch vollständig aus der Spring Security entfernen, indem ich sie überschrieb configure(WebSecurity web) wie in der Antwort von J. Perez beschrieben:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/ping**");
}

@Override
public void configure(HttpSecurity http) throws Exception {
    http.anonymous().and()...;
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().mvcMatchers("/ping**");
}

Benutzer-Avatar
Krishna Majgaonkar

Dies ist mir aufgefallen, weil ich die leere Token-API-Anforderung setze, ich musste diese aus meinem Winkel entfernen

if (token) {
    newHeaders = newHeaders.append('Authorization', 'Bearer' + ' ' + token);
}

Hier ist das Token leer

Benutzer-Avatar
Anand Rockz

Stellen Sie sicher, dass die Klasse mit kommentiert ist @Configuration. 🤦‍♀️

1178850cookie-checkSpring Security permissionAll erlaubt keinen anonymen Zugriff

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy