无法将Spring Security BASIC身份验证集成到Jersey / JAX-RS和Tomcat中

问题描述

|| 我试图将BASIC身份验证添加到使用Jersey / JAX-RS和Tomcat Apache 7.0创建的RESTful Web服务中。将来,我想在WebSphere上部署此Web服务,因此我选择对项目使用Spring Security(2.5.6版)。 我的问题是这样的:尽管我相信我的各种xml文件都是正确的,并且已经将spring.jar添加到了我的类路径中,但是在启动服务器时却遇到了以下错误
SEVERE: Error configuring application listener of class
org.springframework.web.context.ContextLoaderListener java.lang.NoClassDefFoundError: javax/servlet/servletcontextlistener
at java.lang.classLoader.defineClass1(Native Method)
at java.lang.classLoader.defineClassCond(UnkNown Source)
    ...
等等。我所查看的每个资源都表明我应该将spring.jar添加到我的类路径中。我是Spring的新手,所以如果我的文件设置不正确,请告诉我。这是所有相关的XML文件和设置。 security-applicationContext.xml:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<beans xmlns=\"http://www.springframework.org/schema/beans\"
    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
    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
                       http://www.springframework.org/schema/security
                       http://www.springframework.org/schema/security/spring-security-2.0.xsd\">

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

<security:http>
    <security:http-basic/>
    <security:intercept-url pattern=\"/**\" access=\"ROLE_USER\"/>
</security:http>


<security:authentication-manager alias=\"authenticationManager\"/>


<bean id=\"basicProcessingFilter\" class=\"org.springframework.security.ui.basicauth.BasicProcessingFilter\">
    <property name=\"authenticationEntryPoint\" ref=\"authenticationEntryPoint\"/>
    <property name=\"authenticationManager\" ref=\"authenticationManager\"/>
</bean>


<bean id=\"httpSessionContextIntegrationFilter\" class=\"org.springframework.security.context.HttpSessionContextIntegrationFilter\">
    <!--property name=\"contextClass\" value=\"org.springframework.security.context.SecurityContextImpl\"/-->
    <property name=\"allowSessionCreation\" value=\"false\"/>
</bean>


<bean id=\"httpSessionContextIntegrationFilterWithASCFalse\" class=\"org.springframework.security.context.HttpSessionContextIntegrationFilter\">
    <property name=\"allowSessionCreation\" value=\"false\"/>
</bean>

<bean id=\"authenticationEntryPoint\"
        class=\"org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint\">
    <property name=\"realmName\" value=\"Your realm name\"/>
</bean>

<security:authentication-provider>
    <security:password-encoder hash=\"md5\"/>
    <security:user-service>
        <security:user name=\"admin\" password=\"2fa3fa1c2deff56ed33e0bf974f2e29e\" authorities=\"ROLE_PARTNER,ROLE_USER\"/>
    </security:user-service>
</security:authentication-provider>
applicationContext.xml(有人告诉我它可以为空):
<beans></beans>
web.xml:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"    
xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:web=\"http://java.sun.com/xml/ns/javaee
/web-app_2_5.xsd\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\" id=\"WebApp_ID\" version=\"2.5\">
<display-name>TestService</display-name>
<servlet>
   <servlet-name>Jersey REST Service</servlet-name>
   <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
 <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>TestService</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<listener>
  <listener-class>
    org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
      /WEB-INF/security-applicationContext.xml,/WEB-INF/applicationContext.xml
  </param-value>
</context-param>

<!-- Enables Spring Security -->

<filter> 
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy
  </filter-class>
  <init-param>
      <param-name>targetBeanName</param-name>
      <param-value>springSecurityFilterChain</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>
最后,我的文件结构: 和我的服务器的运行配置:     

解决方法

        这看起来像一个类似的问题。 您可能想尝试不同的Tomcat版本。 您缺少依赖项。 最小的spring-security依赖关系应为:
<properties>
    <spring.version>3.0.1.RELEASE</spring.version>
</properties>
<dependency>
    <groupId>org.springframework.security</groupId>
     <artifactId>spring-security-web</artifactId>
     <version>${spring.version}</version>
</dependency>
<dependency>
     <groupId>org.springframework.security</groupId>
     <artifactId>spring-security-config</artifactId>
     <version>${spring.version}</version>
</dependency>
<dependency>
     <groupId>org.springframework.security</groupId>
     <artifactId>spring-security-taglibs</artifactId>
     <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring.version}</version>
</dependency>
您似乎并没有使用maven,因此此站点将帮助您找到所需的jar。只需搜索ѭ5,您就可以下载依赖项的.jar。 此HOWTO可能会在最小的弹簧安全性配置上为您提供帮助。