Перенос с Spring Security 2

#spring #spring-security

#spring #spring-безопасность

Вопрос:

Я пытаюсь перенести веб-приложение на основе Spring Security 2 на Spring 4 / Spring security 3 (последняя версия на июнь 2014 года), и я получаю очень странные исключения (java.lang.ClassNotFoundException) — похоже, что каким-то образом я все еще ссылаюсь на старые классы Spring Security 2, хотя мои пользовательские классы и входящие в комплект Spring Security 3 jar, конечно, их не имеют:

Вот банки, которые я использую (зависимости от Gradle):

 springVersion = '4.0.5.RELEASE'    
springSecurityVersion = '3.2.4.RELEASE'    
jstlVersion ="1.2.1"

compile "org.springframework:spring-core:" project.springVersion,
        "org.springframework:spring-context:" project.springVersion,
        "org.springframework:spring-webmvc:" project.springVersion,
        "org.springframework:spring-web:" project.springVersion

//Spring security
compile "org.springframework.security:spring-security-core:" project.springSecurityVersion,
        "org.springframework.security:spring-security-config:" project.springSecurityVersion,
        "org.springframework.security:spring-security-web:" project.springSecurityVersion,
        "org.springframework.security:spring-security-acl:" project.springSecurityVersion,
        "org.springframework.security:spring-security-taglibs:" project.springSecurityVersion


compile "org.springframework:spring-portlet:2.0.8",
        "org.springframework:spring-struts:3.2.9.RELEASE"
  

Вот мой securityContext.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-4.0.xsd
                    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<global-method-security secured-annotations="enabled" jsr250-annotations="enabled"/>

<http pattern="/nexuslogin.htm" security="none"/>
<http pattern="/plaksalogin.htm" security="none"/>
<http pattern="/schoolslogin.htm" security="none"/>
<http pattern="/accountverification.htm" security="none"/>    


<http  auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint">

    <intercept-url pattern="/dwr/interface/**" access="ROLE_ADMIN_USER,ROLE_CONSUMER,ROLE_EMPLOYER,ROLE_CAREER_SERVICES,ROLE_CARRER_SCHOLARSHIP"/>
    <intercept-url pattern="/admin/**" access="ROLE_ADMIN_USER"/>
    <intercept-url pattern="/employer/**" access="ROLE_EMPLOYER,ROLE_ADMIN_USER"/>
    <intercept-url pattern="/career/scholarshipDashboardPage.htm" access="ROLE_CARRER_SCHOLARSHIP,ROLE_ADMIN_USER"/>
    <intercept-url pattern="/career/**" access="ROLE_CAREER_SERVICES,ROLE_CARRER_SCHOLARSHIP,ROLE_ADMIN_USER"/>

    <intercept-url pattern="/jobs/**" access="ROLE_CONSUMER,ROLE_ADMIN_USER"/>

    <custom-filter position="FORM_LOGIN_FILTER" ref="customeAuthenticationFilter"/>
    <custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="customeAuthenticationFilter"/>
    <custom-filter position="LAST" ref="accountverificationFilter"/>

</http>

<!-- Determines the login page for the request -->
<beans:bean id="authenticationProcessingFilterEntryPoint" class="com.bodhtree.nexus.view.PlaksaAuthenticationMultiEntryPoint">
    <beans:property name="loginFormUrl" value="nexuslogin.htm" /> 
    <beans:property name="forceHttps" value="false" /> 
</beans:bean> 


<beans:bean id="customeAuthenticationFilter" class="com.bodhtree.nexus.filters.CustomeAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="filterProcessesUrl" value="/login.htm"/>
    <beans:property name="alwaysUseDefaultTargetUrl" value="false"/>
    <beans:property name="defaultTargetUrl" value="/static/secure.html" />
    <beans:property name="serverSideRedirect" value="false" />
</beans:bean>

<beans:bean id="switchUserProcessingFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
    <beans:property name="userDetailsService" ref="mySQLUserDetailService" />
    <beans:property name="switchUserUrl" value="/admin/j_spring_security_switch_user.htm"/>
    <beans:property name="exitUserUrl"  value="/j_spring_security_exit_user" />
    <beans:property name="targetUrl" value="/jobs/userdashboard.htm" />
</beans:bean>

<beans:bean id="accountverificationFilter" class="com.bodhtree.nexus.filters.AccountVerificationFilter">
    <beans:property name="userDetailsService" ref="mySQLUserDetailService" />    
    <beans:property name="verificationUrl" value="/accverification.htm"/>        
    <beans:property name="failureUrl" value="/accountverification.htm" />
</beans:bean>


<beans:bean id="plaksaAuthenticationProvider" class="com.bodhtree.nexus.security.provider.PlaksaAuthenticationProvider">
    <beans:property name="roles" value="ROLE_ADMIN_USER,ROLE_CONSUMER,ROLE_EMPLOYER,ROLE_CAREER_SERVICES" />
</beans:bean>
<!-- This ensures that remember-me is added as an authentication provider -->
<beans:bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider">

    <beans:property name="key" value="boker"/> 
</beans:bean>

<beans:bean id="mySQLUserDetailService" class="com.bodhtree.nexus.model.dao.mysqlimpl.MySQLUserDetailService"/>

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="plaksaAuthenticationProvider" />
    <authentication-provider ref="rememberMeAuthenticationProvider" />
    <authentication-provider user-service-ref="mySQLUserDetailService"/>
</authentication-manager>      
</beans:beans>
  

Вот исключения:

22:18:23 549 ИНФОРМАЦИЯ [io.undertow.servlet] (поток службы MSC 1-3) В пути к классу не обнаружено типов Spring WebApplicationInitializer
22:18:23 557 ИНФОРМАЦИЯ [io.undertow.servlet] (поток службы MSC 1-3) Инициализация Spring root WebApplicationContext
22:18:23 557 ИНФОРМАЦИЯ [org.springframework.web.context.ContextLoader] (поток службы MSC 1-3) Root WebApplicationContext: начата инициализация
22:18:23 619 ИНФОРМАЦИЯ [org.springframework.web.context.support.XmlWebApplicationContext] (поток службы MSC 1-3) Обновление корневого WebApplicationContext: дата запуска [Вс Июль 06 22:18:23 PDT 2014]; корень иерархии контекста
22:18:23,646 ИНФОРМАЦИЯ [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (поток службы MSC 1-3) Загрузка определений XML-компонентов из ресурса class path [applicationContext.xml ]
22:18:23 667 ИНФОРМАЦИЯ [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (поток службы MSC 1-3) Загрузка определений XML-компонентов из ресурса class path [securityContext.xml ]
22:18:23,696 ИНФОРМАЦИЯ [org.springframework.security.core.SpringSecurityCoreVersion] (поток службы MSC 1-3) Вы работаете с ядром Spring Security версии 3.2.4.
22:18:23,696 ИНФОРМАЦИЯ [org.springframework.security.config.SecurityNamespaceHandler] (поток службы MSC 1-3) Версия модуля Spring Security 'config' - 3.2.4.RELEASE
22:18:23 753 ИНФОРМАЦИЯ [org.springframework.security.config.http.HttpSecurityBeanDefinitionParser] (поток службы MSC 1-3) Проверка цепочки отсортированных фильтров: [Корневой компонент: класс [org.springframework.security.web.context.SecurityContextPersistenceFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 200 , Корневой компонент: класс [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate= true; primary= false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 400, , order = 1100, Корневой компонент: класс [org.springframework.security.web. сохраненный запрос.RequestCacheAwareFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate= true; primary=false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 1600, корневой компонент: класс [org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 1700, корневой компонент: класс [org.springframework.security.web.authentication.AnonymousAuthenticationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate= true; primary= false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 2000, корневой компонент: класс [org.springframework.security.web.session.SessionManagementFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate= true; primary= false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, order = 2100, корневой компонент: класс [org.springframework.security.web.access.ExceptionTranslationFilter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initmethod name=null; destroyMethodName=null, заказ = 2200, , заказ = 2300, , заказ = 2301, , заказ = 2147483647]
22:18:23 772 ПРЕДУПРЕЖДЕНИЕ [org.jboss.modules] (поток службы MSC 1-3) Не удалось определить класс com.bodhtree.nexus.view.PlaksaAuthenticationMultiEntryPoint в модуле "deployment.smarthires.war:main" из загрузчика сервисного модуля: java.lang.LinkageError: не удалось связать com /bodhtree/nexus/view/PlaksaAuthenticationMultiEntryPoint (модуль "deployment.smarthires.war:main" из загрузчика сервисного модуля) 
 в org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:487) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:277) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.Модульный загрузчик $1.loadClassLocal(модульный загрузчик.java:92) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.Модуль.loadModuleClass(Module.java: 568) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ModuleClassLoader.FindClass(ModuleClassLoader.java:205) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.Проверен ConcurrentClassLoader.performloadclass(ConcurrentClassLoader.java:408) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134) [jboss-modules.jar:1.3.3.Final]
 в org.springframework.util.ClassUtils.forName(ClassUtils.java:247) [spring-core-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.Абстрактное определение.resolveBeanClass(абстрактное определение.java:395) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.AbstractBeanFactory.Доразрешайте beanclass(AbstractBeanFactory.java:1348) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1319) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.Абстрактно-управляемый BeanFactory.predictBeanType(абстрактно-управляемый BeanFactory.java:594) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java: 1396) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:385) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:354) [spring-beans-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:82 ) [spring-context-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.context.support.Абстрактное приложение context.invokeBeanFactoryPostProcessors(абстрактное приложение context.java:609) [spring-context-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.context.support.Абстрактное приложение Context.refresh(абстрактное приложение Context.java:464) [spring-context-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403 ) [spring-web-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) [spring-web-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106 ) [spring-web-4.0.5.RELEASE.jar:4.0.5.RELEASE]
 в io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
 в io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:190) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
 в org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87) 
 в org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
 в org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
 в org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
 в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_05]
 в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_05]
 на java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_05]
Вызвано: java.lang.Ошибка в NoClassDefFoundError: org/springframework/security/ui / webapp/AuthenticationProcessingFilterEntryPoint 
 на java.lang.ClassLoader.defineClass1(собственный метод) [rt.jar:1.8.0_05]
 на java.lang.ClassLoader.defineClass(ClassLoader.java:760) [rt.jar:1.8.0_05]
 в org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:361) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:482) [jboss-modules.jar:1.3.3.Final]
 ... еще 31
Вызвано: java.lang.Исключение ClassNotFoundException: org.springframework.security.ui.webapp.Аутентификация, обработка, фильтрация, точка доступа из [Модуля "deployment.smarthires.war:main" из загрузчика сервисного модуля] 
 в org.jboss.modules.ModuleClassLoader.FindClass(ModuleClassLoader.java:213) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.Проверен ConcurrentClassLoader.performloadclass(ConcurrentClassLoader.java:408) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389) [jboss-modules.jar:1.3.3.Final]
 в org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134) [jboss-modules.jar:1.3.3.Final]
 ... еще 35


Комментарии:

1. Ваш PlaksaAuthenticationMultiEntryPoint , по-видимому, расширяет старые классы. Возможно, это еще одна зависимость в вашем приложении.

2. М. Дейнум, спасибо, но я так не думаю. Взгляните: импортируйте javax.servlet.http. HttpServletRequest; импортировать javax.servlet.http. HttpServletResponse; импортировать org.springframework.security.core. Исключение аутентификации; импортируйте org.springframework.security.web.authentication. LoginUrlAuthenticationEntryPoint; общедоступный класс PlaksaAuthenticationMultiEntryPoint расширяет LoginUrlAuthenticationEntryPoint {

3. Странно то, что проект компилируется только под Spring Security 3, поэтому нет возможности задействовать Spring Security 2 jar. Я очень жестко контролирую, какие банки попадают в файл WAR.

4. Ваш сервер считает иначе. У вас нет модуля, который предоставляет Spring Security jars доступ к глобальному пути к классам или что-то в этом роде? Также убедитесь, что у вас нет неиспользуемых импортированных файлов, ссылающихся на старые классы.