метод контроллера:
@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, полученный выше тоже. Приходится вытягивать имя авторизованного пользователя из сессии.
Вам нужно зарегистрировать следующий фильтр:
/**
* 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пытаюсь собрать мапу с помощью стрима, падает ClassCastExceptionВ общем, есть класс Person:
Есть JSON со строковым значениемВ этом значении есть недопустимые символы (абзац, кавычки и т
Есть два класса: Bot и ParserДо недавнего времени бот парсил весь текст как надо, но после добавления класса TheGame появилась эта ошибка
Если из разных потоков в HashMap добавляются (только добавляются и не более того) записи, то необходимо ли при этом синхронизировать вызов метода...