Подтвердить что ты не робот

Как реализовать страницу входа с помощью 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 безопасности и веб-потока для совместной работы.

4b9b3361

Ответ 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>
    
    код >

Ответ 4

Мне пришлось изменить имя моей формы из j_security_check на что-то еще на стеклянную рыбку, поскольку она, похоже, интерпретирует этот url.