2015-07-19 7 views
-1

У меня есть этот диспетчерских servlet.xmlВесенняя миграция выпуск до версии 4.x

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/pages/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

</beans> 

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd   
     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> 

    <context:component-scan base-package="com.mkyong.*,com.mobapp.security.Login.handlers" /> 
    <mvc:annotation-driven /> 
    <mvc:resources mapping="/resources/**" location="/resources/" cache-period="31556926"/>  
    <import resource="ConfigFiles/Security.xml"/> 

security.xml

<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" 
    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.xsd"> 

    <http> 
     <form-login 
      username-parameter="username" 
      password-parameter="password" />   
    </http> 

    <beans:bean id="pwdEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> 
     <beans:constructor-arg name="strength" value="11" /> 
    </beans:bean> 
    <beans:bean id="appUserDetailService" class="com.mobapp.security.AppUserDetailService"></beans:bean> 

    <authentication-manager> 
     <authentication-provider user-service-ref="appUserDetailService"> 
      <password-encoder ref="pwdEncoder"/> 
     </authentication-provider> 
    </authentication-manager>   

</beans:beans> 

/login Вот

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public ModelAndView login(@RequestParam(value = "error", required = false) String error, 
     @RequestParam(value = "logout", required = false) String logout) { 

    ModelAndView model = new ModelAndView(); 
    if (error != null) { 
     model.addObject("error", "Invalid username and password!"); 
    } 

    if (logout != null) { 
     model.addObject("msg", "You've been logged out successfully."); 
    } 
    model.setViewName("login"); 

    return model; 

} 

Если я использую

<spring.version>3.2.8.RELEASE</spring.version> 
<spring.security.version>3.2.3.RELEASE</spring.security.version> 

все работает хорошо

но я использую

<spring.version>4.1.7.RELEASE</spring.version> 
<spring.security.version>4.0.1.RELEASE</spring.security.version> 

и попытаться получить доступ /login он показывает весной умолчанию регистрационную форму вместо моей собственной формы Custome loginf

+0

Возможный дубликат [Почему моя пользовательская страница входа в систему с Spring Security 4?] (Http://stackoverflow.com/questions/29595098/why-doesnt-my-custom-login-page-show-with жёсткости-безопасности-4) – manish

ответ

2

Spring Security не работает так, как вы думаете! Структура в основном обеспечивает цепочку фильтров, называемую DelegatingFilterProxy, и внедряет ее в ApplicationFilterChain в соответствии с настроенным (по умолчанию 100) порядком фильтра (очень простой вариант использования, иначе он огромен :)).

Но это очень настраиваемый вариант! (Спасибо команде Dev)

Ваш метод контроллера не выполняется, потому что цепочка фильтров использует URL-адрес для входа по умолчанию в качестве/login в версии 4+ (в 3.x это было что-то еще, не помню это больше;)). Всякий раз, когда вы пытаетесь попасть в URL-адрес/login, он перехватывается цепочкой фильтров, и когда вы запрашиваете страницу входа по умолчанию, она генерируется и предоставляется вам (что является ожидаемым поведением). Ваша конфигурация используется для работы с 3.x только по этой причине (вы пытаетесь использовать URL-адрес, доступ к которому можно было разрешить анонимно). Другими словами, вы использовали что-то (в 3.x), которое Spring Security может делать из коробки; сам.

Если вы хотите использовать другой URL, отличный от URL по умолчанию, вам необходимо явно установить его в элементе. Например,

<form-login login-page="/custom_login_url" 
     default-target-url="/" 
     login-processing-url="/auth" 
     authentication-failure-url="/custom_login_url?login=failed" 
     username-parameter="username_param" 
     password-parameter="password_param" 
     always-use-default-target="false"/> 

С такого рода конфигурации, вы можете заставить Spring безопасность искать логин URL в диспетчерском контексте. Ваш URL-адрес конфигурации/логин может все еще не повлиять на пользовательское действие входа в систему. Но вы можете использовать login.jsp (на основе вашего представления и разрешения модели контроллера, ваша страница входа в систему - login.jsp) в качестве вашей страницы входа, как показано в примере, а безопасность Spring позаботится обо всем остальном.

Возможно, вы захотите обратиться к этому migration doc from 3.x to 4.x (NS config) для получения дополнительной информации и помощи.

Смежные вопросы