Frage

Guten Tag, ich habe eine Spring-Boot 1.1.4.-Release-App, die die Frühlingssicherheit verwendet, die als Abhängigkeiten enthalten ist, wie z. B.:

compile("org.springframework.boot:spring-boot-starter-security")    
compile("org.springframework.security:spring-security-web:4.0.0.M1")
compile("org.springframework.security:spring-security-config:4.0.0.M1")
compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')

Ich habe zwei Arten von Rollen:„Benutzer“ und „Admin“.Letzteres verfügt über alles Erstere, verfügt aber auch über Zugriff auf einen Verwaltungsbildschirm.Auf meiner Thymeleaf-Seite zeige ich diesen Link nur Benutzern mit einer Admin-Rolle über an, was einwandfrei funktioniert:

<li sec:authorize="hasRole('ADMIN')">
    <i class="fa fa-link"></i><a th:href="@{/admin}">
            Administer User</a>
</li>

Wenn ich jedoch die URL zu dieser Seite manuell eingebe (http://localhost:9001/admin), können alle Rollen darauf zugreifen.Ich dachte, ich würde dies über die Security Configuration-Klasse steuern:

@Configuration
@EnableWebMvcSecurity
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers( "/" ).permitAll()
                .antMatchers("/admin/").hasRole("ADMIN")  <== also tried .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers( "/resources/**" ).permitAll()
                .antMatchers( "/css/**" ).permitAll()
                .antMatchers( "/libs/**" ).permitAll();

        http
                .formLogin().failureUrl( "/login?error" )
                .defaultSuccessUrl( "/" )
                .loginPage( "/login" )
                .permitAll()
                .and()
                .logout().logoutRequestMatcher( new AntPathRequestMatcher( "/logout" ) ).logoutSuccessUrl( "/" )
                .permitAll();

        http
                .sessionManagement()
                .maximumSessions( 1 )
                .expiredUrl( "/login?expired" )
                .maxSessionsPreventsLogin( true )
                .and()
                .sessionCreationPolicy( SessionCreationPolicy.IF_REQUIRED )
                .invalidSessionUrl( "/" );

        http
                .authorizeRequests().anyRequest().authenticated();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        auth.userDetailsService( customUserDetailsService ).passwordEncoder( encoder );
    }

}

Fehlt etwas oder ist etwas in meiner Konfiguration falsch?

Aktualisieren:Die Lösung, die ich basierend auf Daves Antwort verwendet habe, bestand darin, die folgenden drei Zeilen zu verwenden:

.antMatchers( "/admin**" ).hasAuthority("ADMIN" )
.antMatchers( "/admin/" ).hasAuthority( "ADMIN" )
.antMatchers( "/admin/**" ).hasAuthority( "ADMIN" )

Dies führt zu einem 403-Fehler im Browser.Irgendwann werde ich versuchen, eine Weiterleitung entweder auf eine Fehlerseite oder auf „/“ zu erreichen.

War es hilfreich?

Lösung

Sie haben „/admin/“ nur explizit geschützt (mit einem abschließenden Schrägstrich).Ich kann mir vorstellen, dass Sie genauer sein müssen, wenn Sie „/admin“ aufrufen (ohne abschließenden Schrägstrich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top