【问题标题】:Cannot integrate Spring Security BASIC Authentication into Jersey/JAX-RS and Tomcat无法将 Spring Security BASIC Authentication 集成到 Jersey/JAX-RS 和 Tomcat
【发布时间】:2011-09-14 18:41:53
【问题描述】:

我正在尝试将 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>

最后,我的文件结构:

和我服务器的运行配置:

【问题讨论】:

    标签: java spring-security jersey basic-authentication


    【解决方案1】:

    This 看起来类似的问题。

    您可能想尝试不同的 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,所以this site 将帮助您找到所需的罐子。只需搜索 &lt;artifactId&gt; 即可下载依赖项的 .jar。

    This HOWTO 可能会帮助您进行最小的弹簧安全配置。

    【讨论】:

    • 我过去添加了所有这些 jar,但我收到了同样的错误,这就是我尝试使用 Spring 2.5.6 的原因,因为它只有一个 jar 文件作为依赖项。我再次尝试使用您的解决方案,但错误仍然存​​在。我已经添加了罐子,然后将它们添加到类路径中。
    • 嗯,丢失的类通常在 servlet.jar 中找到,您是否尝试过在这个确切的服务器上部署其他东西?
    • 我的意思是 servlet 的东西 :)
    • @Simeon 我不确定您所说的 servlet.jar 是什么意思。我从来没有处理过那个特定的 jar 文件。至于你的第二个问题,我已经部署了这个完全没有 Spring Security 的 Web 服务。只有当我添加 Spring Security 时我才会遇到问题。
    • @SC servlet.jar(或 servlet-api.jar)是包含 javax/servlet/ServletContextListener 类的 jar。它应该在 Tomcat 的 /commons/lib 文件夹中。这可能是一些与 ClassLoader 相关的 Tomcat/Spring 问题,您可以尝试不同的 Tomcat 版本,如果它有效,您会发现 IMO 的错误。
    猜你喜欢
    • 2012-04-20
    • 2019-01-08
    • 2017-07-02
    • 1970-01-01
    • 2012-06-03
    • 2013-02-16
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多