¿Cómo habilito el registro para Spring Security?

94

Estoy configurando Spring Security para manejar el inicio de sesión de los usuarios. He iniciado sesión como usuario y se me lleva a una página de error Acceso denegado después de iniciar sesión correctamente. No sé qué roles se le han asignado realmente a mi usuario, o la regla que hace que se niegue el acceso, porque no puedo averiguar cómo habilitar la depuración para la biblioteca de Spring Security.

Mi xml de seguridad:

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

También intenté agregar log4j.logger.org.springframework.security=DEBUGa mis log4j.properties

¿Cómo puedo obtener resultados de depuración para Spring Security?

Martin Carney
fuente
2
consulte este enlace si esto puede ayudarlo.
pise
1
@pise, ¿puedes agregar eso como respuesta (con al menos un extracto / resumen relevante) para que pueda marcar esto como resuelto?
Martin Carney
Vea la respuesta a esta pregunta: stackoverflow.com/questions/7840088/…
nevster
Je: traté de agregarlo como una respuesta y SO lo convirtió en un comentario.
nevster

Respuestas:

171

Suponiendo que está usando Spring Boot, otra opción es poner lo siguiente en su application.properties:

logging.level.org.springframework.security=DEBUG

Esto también es lo mismo para la mayoría de los otros módulos Spring.

Si no está utilizando Spring Boot, intente establecer la propiedad en su configuración de registro, por ejemplo, logback.

Aquí está también la versión application.yml:

logging:
  level:
    org:
      springframework:
        security: DEBUG
delucasvb
fuente
2
¿Esto asume Spring Boot?
John Camerin
1
@JohnCamerin Sí, lo hace. Configurar los niveles de inicio de sesión application.propertieses una función de Spring Boot. Si no usa Spring Boot, puede configurar el nivel de registro org.springframework.securitypor otros medios (por ejemplo, en su logback.xml).
Dario Seidl
Agregar org.springframework.web.corspara habilitar los registros del procesador de Cors.
Siggen
70

Puede habilitar fácilmente el soporte de depuración usando una opción para la @EnableWebSecurityanotación:

@EnableWebSecurity(debug = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    …
}
Michael Piefel
fuente
¿Qué EnableWebFluxSecuritytal si no tiene la opción de depuración?
bzhu
1
Ah, interesante. Sin embargo, no tengo experiencia con WebFlux.
Michael Piefel
1
¿Hay alguna manera de controlar esta bandera desde application.properties
Ankit Katiyar
25

La depuración básica con Spring DebugFilterse puede configurar así:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.debug(true);
    }
}
Chris Suszyński
fuente
11
Eso es un registro de depuración bastante débil. Solo imprime los encabezados de solicitud y la "Cadena de filtros de seguridad". No es útil en absoluto para rastrear problemas de acceso.
Chloe
4

Puede habilitar fácilmente el soporte de depuración usando una opción para la anotación @EnableWebSecurity:

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

Si necesita un control específico del perfil en su aplicación- {profile} .properties file

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

Obtenga publicación detallada: http://www.bytefold.com/enable-disable-profile-specific-spring-security-debug-flag/

Ankit Katiyar
fuente
0

El registro de seguridad de Spring para aplicaciones reactivas de webflux ahora está disponible a partir de la versión 5.4.0-M2 (como lo menciona @bzhu en el comentario ¿Cómo habilito el registro para Spring Security? )

Hasta que esto llegue a una versión de GA, aquí se explica cómo obtener esta versión de hito en 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
fuente
-7

De forma predeterminada, Spring Security redirige al usuario a la URL que solicitó originalmente (/Load.do en su caso) después de iniciar sesión.

Puede establecer always-use-default-target en true para deshabilitar este comportamiento:

 <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
fuente
3
Esto no responde a la pregunta de op.
Madbreaks