У меня есть веб-приложение с помощью Spring 2.5.6 и безопасности Spring 2.0.4. Я реализовал рабочую страницу входа в систему, которая аутентифицирует пользователя против веб-сервиса. Аутентификация сделана путем определения пользовательского authentincation менеджера, как это:
Класс менеджера по аутентификации:
public class CustomAuthenticationManager implements AuthenticationManager, ApplicationContextAware {
@Transactional
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
//authentication logic
return new UsernamePasswordAuthenticationToken(principal, authentication.getCredentials(),
grantedAuthorityArray);
}
Основная часть входа в систему jsp похожа на это:
Теперь проблема состоит в том, что приложение должно использовать веб-Поток Spring. После того, как приложение было настроено для использования веб-Потока Spring, вход в систему больше не работает - действие формы к результатам "/j_spring_security_check" на пустой странице без сообщения об ошибке. Что лучший способ состоит в том, чтобы адаптировать существующий процесс входа в систему так, чтобы он работал с веб-Потоком Spring?
Править: не было никакого сообщения об ошибке, просто пустая страница была отображена. Это работает теперь - проблема состояла в том, что web.xml пропускал записи
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
Так как я не могу отменить щедрость, хотя проблема решена, щедрость присуждена большей части проницательного ответа или ссылки, которая помогла бы другим людям в конфигурировании безопасности Spring и веб-Потока сотрудничать.
Настроили ли вы свое приложение для использования Spring Web Flow в соответствии с главой Защита потоков в Справочном руководстве Spring Web Flow ?
Мне пришлось изменить имя моей формы с j_security_check на другое в Glassfish, поскольку, похоже, он сам интерпретирует этот URL.
Вот документация, описывающая, зачем нужен 'springSecurityFilterChain'.
Фильтр springSecurityFilterChain не создается явно, а создается неявно элементом
spring security schema в контексте приложения
<http auto-config="false" session-fixation-protection="none">
<form-login login-page="/login.jsp" default-target-url="/home.htm" />
</http>
Созданные бобы требуют провайдера аутентификации, поэтому мы предоставляем его
<authentication-provider>
<user-service id="userDetailsService">
<user password="password" name="username" authorities="ROLE_USER" />
</user-service>
</authentication-provider
С этими изменениями, включая настройку фильтра безопасности, как описано в отредактированном вопросе, страница будет отображаться правильно, и настроенный стек безопасности будет присутствовать на каждой обслуживаемой странице.
Эти подробности и обзор простого spring-security приложения приведены в A aimple web application with Spring Security - part 13.
Справочная документация описывает настройку springSecurityFilterChain
как первую часть конфигурирования web.xml: Security Namespace Configuration - Getting Started.
(Ссылка на версию 2.0.x, используемую ОП. Последняя версия 3.1 находится здесь.)
Из вашего кода неясно, есть ли у вас вообще конфигурация Spring Security. Я предполагаю, что нет.
Вы должны добавить пространство имен безопасности в вашу конфигурацию. Что-то вроде этого
Вам необходимо настроить Spring Security. Например:
.
Этого может быть достаточно, чтобы все "просто работало", но я думаю, что вам стоит посмотреть на реализацию AuthenticationProvider, а не AuthenticationManager. В этом случае вам понадобится конфигурация, подобная этой: