Spring Security Principal null

182
09 декабря 2020, 19:50

метод контроллера:

@GetMapping("/postauth")
public void postAuth(Principal principal, HttpSession session){
// principal = null
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); // = null
SecurityContext context = (SecurityContext)session.getAttribute("SPRING_SECURITY_CONTEXT");
String  login = ((org.springframework.security.core.userdetails.User) context.getAuthentication().getPrincipal()).getUsername(); // = "user"
}

security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:beans="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/security
      http://www.springframework.org/schema/security/spring-security-4.2.xsd">

   <http pattern="/resources/**" security="none"/>
    <http pattern="/auth" security="none"/>
    <http pattern="/views/service/**" security="none"/>
   <http auto-config="true" use-expressions="true">
      <intercept-url pattern="favicon.ico" access="permitAll" />
      <intercept-url pattern="/**"  access="hasRole('USER')"/>
      <form-login authentication-failure-url="/views/service/error_auth.jsp" default-target-url="/postauth" always-use-default-target="true"/>
       <remember-me key="ffw4334r2" token-validity-seconds="259200"/>
       <anonymous username="guest" granted-authority="ROLE_ANONYMOUSLY"/>
   </http>
    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service id="userService" data-source-ref="dataSourceMySQL"
            users-by-username-query="select login, password, true from users where login = ?"
            authorities-by-username-query="select login, authority from users where login = ?"/>
            <password-encoder ref="passwordEncoder"/>
        </authentication-provider>
    </authentication-manager>
    <beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" >
    </beans:bean>
</beans:beans>

Почему в параметре метода контроллера principal всегда null и Authentification, полученный выше тоже. Приходится вытягивать имя авторизованного пользователя из сессии.

Answer 1

Вам нужно зарегистрировать следующий фильтр:

/**
 * Binds Principal object to request and allows injection of @AuthenticationPrincipal, Authentication and Principal objects into controller params.
 */
@Bean
public SecurityContextHolderAwareRequestFilter securityContextHolderAwareRequestFilter() {
    return new SecurityContextHolderAwareRequestFilter();
}

Этот фильтр нужно регистрировать в цепочке перед AnonymousAuthenticationFilter и после объявления вашего UsernamePasswordAuthenticationFilter.

Важно! Если вы используете Spring Boot, вам нужно деактивировать этот фильтр, чтобы он не регистрировался контейнером сервлетов (иначе он будет вызван дважды, один раз контейнером сервлетов, второй раз, как бин в рамках внутренней цепочки фильтров filterChainProxy фильтра). Деактивировать его можно следующим образом:

@Bean
public FilterRegistrationBean deactivateSecurityContextHolderAwareRequestFilter(@Qualifier("securityContextHolderAwareRequestFilter") SecurityContextHolderAwareRequestFilter filter) {
    return deactivate(filter);
}
private FilterRegistrationBean deactivate(Filter filter) {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(filter);
    registrationBean.setEnabled(false); // container shouldn't register this filter under its ApplicationContext as this filter already registered within springSecurityFilterChain as bean
    return registrationBean;
}
READ ALSO
Не работает лямбда выражение в Collectors.toMap()

Не работает лямбда выражение в Collectors.toMap()

Пытаюсь собрать мапу с помощью стрима, падает ClassCastExceptionВ общем, есть класс Person:

128
Экранирование html символов в строках

Экранирование html символов в строках

Есть JSON со строковым значениемВ этом значении есть недопустимые символы (абзац, кавычки и т

152
Почему выдаёт ошибку StringIndexOutOfBoundsException: String index out of range

Почему выдаёт ошибку StringIndexOutOfBoundsException: String index out of range

Есть два класса: Bot и ParserДо недавнего времени бот парсил весь текст как надо, но после добавления класса TheGame появилась эта ошибка

131
Синхронизация Map

Синхронизация Map

Если из разных потоков в HashMap добавляются (только добавляются и не более того) записи, то необходимо ли при этом синхронизировать вызов метода...

152