Как включить ведение журнала для Spring Security?

94

Я настраиваю Spring Security для обработки входа пользователей в систему. Я вошел в систему как пользователь и после успешного входа в систему попадаю на страницу с ошибкой «Доступ запрещен». Я не знаю, какие роли на самом деле были назначены моему пользователю, или правила, которое вызывает отказ в доступе, потому что я не могу понять, как включить отладку для библиотеки Spring Security.

Моя безопасность xml:

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

Я также пробовал добавить log4j.logger.org.springframework.security=DEBUGв свой log4j.properties

Как я могу получить отладочные данные для Spring Security?

Мартин Карни
источник
2
проверьте эту ссылку, если это может вам помочь.
писа
1
@pise, можете ли вы добавить это в качестве ответа (по крайней мере, с соответствующей выдержкой / резюме), чтобы я мог отметить это как решенное?
Мартин Карни,
См. Ответ на этот вопрос: stackoverflow.com/questions/7840088/…
nevster
Хех - попытался добавить это как ответ, и ТАК преобразовал его в комментарий.
Невстер

Ответы:

171

Предполагая, что вы используете Spring Boot, другой вариант - добавить в ваш application.properties:

logging.level.org.springframework.security=DEBUG

То же самое и для большинства других модулей Spring.

Если вы не используете Spring Boot, попробуйте установить свойство в конфигурации ведения журнала, например, logback.

Вот и версия application.yml:

logging:
  level:
    org:
      springframework:
        security: DEBUG
delucasvb
источник
2
Предполагается ли это Spring Boot?
Джон Камерин
1
@JohnCamerin Да, это так. Установка уровней журнала application.properties- это функция Spring Boot. Если вы не используете Spring Boot, вы можете установить уровень org.springframework.securityжурнала другими способами (например, в вашем logback.xml).
Дарио
1
Для WebFlux это не работает: github.com/spring-projects/spring-security/issues/5758
bzhu
Добавьте, org.springframework.web.corsчтобы включить журналы процессора Cors.
Зигген,
70

Вы можете легко включить поддержку отладки, используя опцию @EnableWebSecurityаннотации:

@EnableWebSecurity(debug = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    …
}
Майкл Пифель
источник
Как насчет того EnableWebFluxSecurity, у него нет опции отладки
бжу
1
Ах, интересно. Однако у меня нет опыта работы с WebFlux.
Майкл Пифель
1
есть ли способ управлять этим флагом из application.properties
Анкит Катияр
25

Базовую отладку с использованием Spring DebugFilterможно настроить следующим образом:

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.debug(true);
    }
}
Крис Сушиньски
источник
11
Это довольно слабое ведение журнала отладки. Он выводит только заголовки запросов и «цепочку фильтров безопасности». Совершенно бесполезен при отслеживании проблем с доступом.
Хлоя
4

Вы можете легко включить поддержку отладки, используя параметр аннотации @EnableWebSecurity:

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

Если вам нужно управление для конкретного профиля, в файле приложения- {profile} .properties

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

Получить подробный пост: http://www.bytefold.com/enable-disable-profile-specific-spring-security-debug-flag/

Анкит Катияр
источник
0

Ведение журнала безопасности Spring для реактивных приложений webflux теперь доступно, начиная с версии 5.4.0-M2 (как указано @bzhu в комментарии Как включить ведение журнала для Spring Security? )

Пока это не войдет в выпуск GA, вот как получить этот этапный выпуск в 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}"
    }

}
Гийом Берше
источник
-7

По умолчанию Spring Security перенаправляет пользователя на URL-адрес, который он изначально запрашивал (/Load.do в вашем случае) после входа в систему.

Вы можете установить для always-use-default-target значение true, чтобы отключить это поведение:

 <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>
Сохил
источник
3
Это не ответ на вопрос op.
Madbreaks