Jak włączyć logowanie dla Spring Security?

96

Konfiguruję Spring Security, aby obsługiwał logujących się użytkowników. Zalogowałem się jako użytkownik i po pomyślnym zalogowaniu jestem przenoszony na stronę błędu odmowy dostępu. Nie wiem, jakie role faktycznie przypisano mojemu użytkownikowi ani jaka reguła powoduje odmowę dostępu, ponieważ nie mogę dowiedzieć się, jak włączyć debugowanie dla biblioteki Spring Security.

Mój plik XML bezpieczeństwa:

<?xml version="1.0" encoding="UTF-8"?>
<beans ... >
    <!-- security -->

    <security:debug/><!-- doesn't seem to be working -->

    <security:http auto-config="true">

        <security:intercept-url pattern="/Admin**" access="hasRole('PROGRAMMER') or hasRole('ADMIN')"/>
        <security:form-login login-page="/Load.do"
            default-target-url="/Admin.do?m=loadAdminMain"
            authentication-failure-url="/Load.do?error=true"
            username-parameter="j_username"
            password-parameter="j_password"
            login-processing-url="/j_spring_security_check"/>
        <security:csrf/><!-- enable Cross Site Request Forgery protection -->
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="loginDataSource"
                users-by-username-query="SELECT username, password, active FROM userinformation WHERE username = ?"
                authorities-by-username-query="
                    SELECT ui.username, r.rolename 
                    FROM role r, userrole ur, userinformation ui 
                    WHERE ui.username=? 
                    AND ui.userinformationid = ur.userinformationid 
                    AND ur.roleid = r.roleid "
            />
            <security:password-encoder hash="md5"/>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>

Próbowałem też dodać log4j.logger.org.springframework.security=DEBUGdo mojego log4j.properties

Jak mogę uzyskać wyniki debugowania dla Spring Security?

Martin Carney
źródło
2
sprawdź ten link, jeśli to może ci pomóc.
pise
1
@pise czy możesz to dodać jako odpowiedź (z przynajmniej odpowiednim fragmentem / podsumowaniem), abym mógł oznaczyć to jako rozwiązane?
Martin Carney
Zobacz odpowiedź na to pytanie: stackoverflow.com/questions/7840088/ ...
nevster
Heh - próbował dodać to jako odpowiedź i SO przekształcił go w komentarz.
Nevster

Odpowiedzi:

179

Zakładając, że używasz Spring Boot, inną opcją jest umieszczenie w application.properties:

logging.level.org.springframework.security=DEBUG

To samo dotyczy większości innych modułów Spring.

Jeśli nie używasz Spring Boot, spróbuj ustawić właściwość w konfiguracji logowania, np. Logback.

Oto również wersja application.yml:

logging:
  level:
    org:
      springframework:
        security: DEBUG
delucasvb
źródło
2
Czy to zakłada Spring Boot?
John Camerin,
1
@JohnCamerin Tak, to prawda. Ustawianie poziomów logowania application.propertiesjest funkcją Spring Boot. Jeśli nie używasz Spring Boot, możesz ustawić poziom logowania org.springframework.securityw inny sposób (np. W swoim logback.xml).
Dario Seidl
1
W przypadku WebFlux to nie działa: github.com/spring-projects/spring-security/issues/5758
bzhu
Dodaj, org.springframework.web.corsaby włączyć dzienniki procesora Cors.
Siggen,
74

Możesz łatwo włączyć obsługę debugowania, korzystając z opcji @EnableWebSecurityadnotacji:

@EnableWebSecurity(debug = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    …
}
Michael Piefel
źródło
Co powiesz na EnableWebFluxSecurityto, że nie ma opcji debugowania
bzhu
1
Ach, ciekawe. Jednak nie mam doświadczenia z WebFlux.
Michael Piefel
1
czy istnieje sposób na kontrolowanie tej flagi z application.properties
Ankit Katiyar
26

Podstawowe debugowanie za pomocą Springa DebugFiltermożna skonfigurować w następujący sposób:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.debug(true);
    }
}
Chris Suszyński
źródło
13
To dość słabe logowanie do debugowania. Wyświetla tylko nagłówki żądań i „łańcuch filtrów bezpieczeństwa”. W ogóle nie jest przydatne podczas śledzenia problemów z dostępem.
Chloe
4

Możesz łatwo włączyć obsługę debugowania za pomocą opcji dla adnotacji @EnableWebSecurity:

@EnableWebSecurity(debug = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    …
}

Jeśli potrzebujesz kontroli specyficznej dla profilu, w pliku aplikacji- {profil} .properties

org.springframework.security.config.annotation.web.builders.WebSecurity.debugEnabled=false

Uzyskaj szczegółowy post: http://www.bytefold.com/enable-disable-profile-specific-spring-security-debug-flag/

Ankit Katiyar
źródło
0

Wiosenne rejestrowanie zabezpieczeń dla reaktywnych aplikacji webflux jest teraz dostępne od wersji 5.4.0-M2 (jak wspomniał @bzhu w komentarzu Jak włączyć rejestrowanie dla Spring Security? )

Dopóki to nie trafi do wydania GA, oto jak uzyskać to wydanie przełomowe w gradle

repositories {
    mavenCentral()
    if (!version.endsWith('RELEASE')) {
        maven { url "https://repo.spring.io/milestone" }
    }
}

// Force earlier milestone release to get securing logging preview
// https://docs.spring.io/spring-security/site/docs/current/reference/html5/#getting-gradle-boot
// https://github.com/spring-projects/spring-security/pull/8504
// https://github.com/spring-projects/spring-security/releases/tag/5.4.0-M2
ext['spring-security.version']='5.4.0-M2'
dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }

}
Guillaume Berche
źródło
-7

Domyślnie Spring Security przekierowuje użytkownika na adres URL, którego pierwotnie zażądał (w twoim przypadku /Load.do) po zalogowaniu.

Możesz ustawić always-use-default-target na true, aby wyłączyć to zachowanie:

 <security:http auto-config="true">

    <security:intercept-url pattern="/Admin**" access="hasRole('PROGRAMMER') or hasRole('ADMIN')"/>
    <security:form-login login-page="/Load.do"
        default-target-url="/Admin.do?m=loadAdminMain"
        authentication-failure-url="/Load.do?error=true"
        always-use-default-target = "true"
        username-parameter="j_username"
        password-parameter="j_password"
        login-processing-url="/j_spring_security_check"/>
    <security:csrf/><!-- enable Cross Site Request Forgery protection -->
</security:http>
Sohil
źródło
3
To nie odpowiada na pytanie op.
Madbreaks