Como habilito o registro para Spring Security?

96

Estou configurando o Spring Security para lidar com o login de usuários. Fiz login como um usuário e fui levado a uma página de erro Acesso negado após o login bem-sucedido. Não sei quais funções meu usuário realmente foi atribuído, ou a regra que faz com que o acesso seja negado, porque não consigo descobrir como habilitar a depuração para a biblioteca Spring Security.

Meu xml de segurança:

<?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>

Também tentei adicionar log4j.logger.org.springframework.security=DEBUGao meu log4j.properties

Como posso obter saída de depuração para Spring Security?

Martin Carney
fonte
2
verifique este link se isso puder ajudá-lo.
pise
1
@pise você pode adicionar isso como uma resposta (com pelo menos um trecho / resumo relevante) para que eu possa marcar isso como resolvido?
Martin Carney
Veja a resposta a esta pergunta: stackoverflow.com/questions/7840088/…
nevster
Heh - tentei adicioná-lo como uma resposta e SO convertido em um comentário.
Nevster

Respostas:

178

Supondo que você esteja usando Spring Boot, outra opção é colocar o seguinte em application.properties:

logging.level.org.springframework.security=DEBUG

Este é o mesmo para a maioria dos outros módulos Spring também.

Se você não estiver usando Spring Boot, tente definir a propriedade em sua configuração de registro, por exemplo, logback.

Aqui está a versão do application.yml também:

logging:
  level:
    org:
      springframework:
        security: DEBUG
Delucasvb
fonte
2
Isso pressupõe Spring Boot?
John Camerin,
1
@JohnCamerin Sim, é verdade. Definir os níveis de log application.propertiesé um recurso do Spring Boot. Se você não usa Spring Boot, você pode definir o nível de log org.springframework.securitypor outros meios (por exemplo, em seu logback.xml).
Dario Seidl
1
Para WebFlux, não está funcionando: github.com/spring-projects/spring-security/issues/5758
bzhu
Adicione org.springframework.web.corspara habilitar os logs do processador Cors.
Siggen
73

Você pode habilitar facilmente o suporte à depuração usando uma opção para a @EnableWebSecurityanotação:

@EnableWebSecurity(debug = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    …
}
Michael Piefel
fonte
Que tal EnableWebFluxSecurity, ele não tem a opção de depuração
bzhu
1
Ah, interessante. No entanto, não tenho experiência com WebFlux.
Michael Piefel
1
existe uma maneira de controlar este sinalizador em application.properties
Ankit Katiyar
25

A depuração básica usando Spring DebugFilterpode ser configurada assim:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.debug(true);
    }
}
Chris Suszyński
fonte
12
Isso é um registro de depuração muito fraco. Ele apenas imprime os cabeçalhos de solicitação e "Cadeia de filtros de segurança". Nada útil ao rastrear problemas de acesso.
Chloe
4

Você pode habilitar facilmente o suporte à depuração usando uma opção para a anotação @EnableWebSecurity:

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

Se você precisar de controle específico de perfil em seu arquivo de aplicativo- {profile} .properties

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

Obtenha uma postagem detalhada: http://www.bytefold.com/enable-disable-profile-specific-spring-security-debug-flag/

Ankit Katiyar
fonte
0

O registro de segurança Spring para aplicativos reativos webflux agora está disponível a partir da versão 5.4.0-M2 (conforme mencionado por @bzhu no comentário Como faço para habilitar o registro para Spring Security? )

Até que chegue em uma versão GA, aqui está como obter esta versão milestone no 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
fonte
-7

Por padrão, o Spring Security redireciona o usuário para a URL que ele solicitou originalmente (/Load.do no seu caso) após o login.

Você pode definir always-use-default-target como true para desativar este comportamento:

 <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
fonte
3
Isso não responde à pergunta de op.
Madbreaks