Как реализовать страницу входа с помощью Spring Безопасность, чтобы она работала с веб-потоком Spring?
У меня есть веб-приложение, использующее Spring 2.5.6 и Spring Security 2.0.4. Я внедрил рабочую страницу входа, которая аутентифицирует пользователя против веб-службы. Аутентификация выполняется путем определения настраиваемого менеджера аутентификации, например:
<beans:bean id="customizedFormLoginFilter"
class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
<beans:property name="defaultTargetUrl" value="/index.do" />
<beans:property name="authenticationFailureUrl" value="/login.do?error=true" />
<beans:property name="authenticationManager" ref="customAuthenticationManager" />
<beans:property name="allowSessionCreation" value="true" />
</beans:bean>
<beans:bean id="customAuthenticationManager"
class="com.sevenp.mobile.samplemgmt.web.security.CustomAuthenticationManager">
<beans:property name="authenticateUrlWs" value="${WS_ENDPOINT_ADDRESS}" />
</beans:bean>
Класс менеджера аутентификации:
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 для входа выглядит следующим образом:
<c:url value="/j_spring_security_check" var="formUrlSecurityCheck"/>
<form method="post" action="${formUrlSecurityCheck}">
<div id="errorArea" class="errorBox">
<c:if test="${not empty param.error}">
${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
</c:if>
</div>
<label for="loginName">
Username:
<input style="width:125px;" tabindex="1" id="login" name="j_username" />
</label>
<label for="password">
Password:
<input style="width:125px;" tabindex="2" id="password" name="j_password" type="password" />
</label>
<input type="submit" tabindex="3" name="login" class="formButton" value="Login" />
</form>
Теперь проблема заключается в том, что приложение должно использовать Spring Web Flow. После того, как приложение было настроено на использование Spring Web Flow, логин больше не работает - действие формы для "/j_spring_security_check" приводит к пустой странице без сообщения об ошибке. Каков наилучший способ адаптации существующего процесса входа в систему, чтобы он работал с Spring веб-потоком?
Изменить: не было сообщения об ошибке, была показана только пустая страница. Он работает сейчас - проблема в том, что web.xml отсутствовал записи
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Поскольку я не могу отменить награду, хотя проблема решена, награда присуждается наиболее проницательному ответу или ссылке, что поможет другим людям в настройке Spring безопасности и веб-потока для совместной работы.
Ответы
Ответ 1
Здесь представлена документация, описывающая, почему нужен "springSecurityFilterChain".
Фильтр SpringSecurityFilterChain не создается явно, но неявно создается элементом схемы безопасности <http>
spring в контексте приложения
<http auto-config="false" session-fixation-protection="none">
<form-login login-page="/login.jsp" default-target-url="/home.htm" />
</http>
Для созданного beans требуется поставщик проверки подлинности, поэтому мы предоставляем один
<authentication-provider>
<user-service id="userDetailsService">
<user password="password" name="username" authorities="ROLE_USER" />
</user-service>
</authentication-provider
С учетом этих изменений, включая настройку фильтра безопасности, как описано в отредактированном вопросе, страница будет отображаться правильно, а сконфигурированный стек безопасности будет установлен на каждой обслуживаемой странице.
Эти подробности и прохождение простого приложения spring -security приведены в Целевое веб-приложение с spring Безопасность - часть 13.
В справочной документации описывается настройка springSecurityFilterChain
в качестве первой части настройки web.xml: Конфигурация пространства имен безопасности - Начало работы.
(Связано с версией 2.0.x, используемой OP. Последняя версия 3.1 здесь.)
Ответ 2
Из вашего кода неясно, есть ли у вас Spring Конфигурация безопасности вообще. Я полагаю, вы этого не делаете.
-
Вам нужно добавить пространство имен безопасности в свою конфигурацию. Что-то вроде этого
<beans xmlns="http://www.springframework.org/schema/beans" ... skipped ...
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
... skipped ...
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
код >
-
Вам необходимо настроить Spring Безопасность. Например:
<security:http once-per-request="false" auto-config="false">
<security:form-login login-page="path/to/your/login.jsp"/>
</security:http>
код >
-
Этого может быть достаточно, чтобы "просто работать", но я думаю, вы должны взглянуть на реализацию AuthenticationProvider а не AuthenticationManager. В этом случае вам понадобится конфигурация, подобная этому:
<bean class="my.company.project.MyAuthProvider"
autowire="byType">
<security:custom-authentication-provider/>
</bean>
код >
Ответ 3
Вы настроили приложение для использования Spring Web Flow в соответствии с Securing Flows в главе Spring Справочное руководство по веб-потоку?
Ответ 4
Мне пришлось изменить имя моей формы из j_security_check на что-то еще на стеклянную рыбку, поскольку она, похоже, интерпретирует этот url.