Как реализовать страницу входа с помощью Spring Security, чтобы она работала с веб-потоком Spring? - PullRequest
18 голосов
/ 21 мая 2010

У меня есть веб-приложение, использующее 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 Flow?

Редактировать: не было сообщения об ошибке, просто отображалась пустая страница.Теперь это работает - проблема заключалась в том, что в файле 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 Security и Web Flow для совместной работы.

Ответы [ 4 ]

2 голосов
/ 30 мая 2010

Вот документация, описывающая, почему требуется 'springSecurityFilterChain'.

Фильтр springSecurityFilterChain не создается явно, но неявно создается элементом схемы безопасности <http> spring в контексте приложения

<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 приведены в Простое веб-приложение со Spring Security - часть 13 .

В справочной документации описана настройка springSecurityFilterChain в качестве первой части настройки web.xml: Настройка пространства имен безопасности - начало работы .(Связано с версией 2.0.x, используемой OP. Последняя версия 3.1 - здесь .)

1 голос
/ 31 мая 2010

Из вашего кода не ясно, есть ли у вас конфигурация Spring Security вообще. Я полагаю, вы не.

0 голосов
/ 27 мая 2010

Мне пришлось изменить имя формы с j_security_check на что-то другое на Glassfish, так как оно, похоже, интерпретирует сам этот URL.

0 голосов
/ 26 мая 2010

Вы настроили свое приложение для использования Spring Web Flow в соответствии с главой Защита потоков Справочного руководства Spring Web Flow ?

...