#java #spring #spring-mvc #spring-security
#java #весна #spring-mvc #spring-безопасность
Вопрос:
Я знаю, что об этом много спрашивали, но ни один из ответов, похоже, на самом деле не работает для меня. Последние два дня я бился головой о Spring Security, и мне не повезло. В документации утверждается, что его очень легко настроить, но я не могу избавиться от ощущения, что в нем чего-то не хватает.
Мой web.xml:
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SpringProject</display-name>
<!-- Spring Configuration Files -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:mvcDispatcher-servlet.xml
classpath*:application-security.xml
</param-value>
</context-param>
<!-- Spring Security Filters -->
<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 Listeners -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- MVC Filter -->
<servlet>
<servlet-name>mvcDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvcDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
И мой application-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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<global-method-security secured-annotations="enabled" />
<http use-expressions="true">
<form-login login-page="/login"
login-processing-url="/j_spring_security_check"
default-target-url="/view"
authentication-failure-url="/login?login_error=t" />
<intercept-url pattern="/login" access="isAnonymous()" />
<intercept-url pattern="/**" access="isAuthenticated()" />
</http>
<authentication-manager>
<authentication-provider user-service-ref="userService" />
</authentication-manager>
<user-service id="userService">
<user name="user" password="password" authorities="ROLE_ADMIN" />
</user-service>
</beans:beans>
Когда я развертываю (до WAS8.0) и пытаюсь перейти на свою страницу входа, я получаю сообщение об ошибке:
com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[mvcDispatcher]: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
Если я изменюсь web.xml от:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:mvcDispatcher-servlet.xml
classpath*:application-security.xml
</param-value>
</context-param>
Для:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/mvcDispatcher-servlet.xml
WEB-INF/application-security.xml
</param-value>
</context-param>
Я получаю сообщение об ошибке
[Servlet Error]-[mvcDispatcher]: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/security]
Я понятия не имею, что является причиной этого или почему Spring Security здесь не работает. Это было невероятно неприятно. Любая помощь будет очень признательна, спасибо!
Комментарии:
1. Где вы размещаете application-security.xml ? Это на пути к классу? Кажется , что application-security.xml не загружается.
2. Это в WEB-INF/application-security.xml
3. Является mvcDispatcher-servlet.xml также в каталоге WEB-INF? (WEB-INF/mvcDispatcher-servlet.xml )
4. Да, это так. Если я удалю путь к классу *: из обеих этих записей, я получу
java.io.FileNotFoundException: Could not open ServletContext resource [/mvcDispatcher-servlet.xml]
5. Хорошо, я опубликовал свой ответ.
Ответ №1:
Попробуйте выполнить следующие действия в вашем web.xml .
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/application-security.xml</param-value>
</context-param>
Примечание:
- Каталог WEB-INF отсутствует в пути к классу.
- DispatcherServlet ищет WEB-INF/ [servlet-name]-servlet.xml по умолчанию.
Комментарии:
1. Я внес это изменение, которое выдает ошибку:
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/security] Offending resource: ServletContext resource [/WEB-INF/application-security.xml]
2. Попробуйте удалить
-3.0
URL-адрес из вашей XML-схемы.spring-security.xsd
вместоspring-security-3.0.xsd
.3. Это сделало это! Большое вам спасибо! Я рвал на себе волосы, пытаясь заставить это работать.