jersey 2.2 和 Spring Security 3 依赖项?

Posted

技术标签:

【中文标题】jersey 2.2 和 Spring Security 3 依赖项?【英文标题】:jersey 2.2 and Spring Security 3 dependencies? 【发布时间】:2013-09-22 23:38:15 【问题描述】:

我有一个使用 Jersey 2.2 实现的 REST 服务,并希望保护它。 我已经让 Apache Shiro 替补,没有任何重大问题。 现在我想用 Spring Security 3 制作同样的东西(基本的 http 安全)的原型。

问题是我真的迷失在混合两个框架所需的依赖项之间。 (球衣 2.2 没有弹簧球衣)。

因此,如果有人能指出我在 maven 项目中任何类型的 spring-sec3/jersey2.2 集成的工作示例,我将不胜感激。

提前致谢

【问题讨论】:

我也实现了一个 REST API。首先我用 Jersey 尝试了 Spring Security,但我很难让它们一起工作,所以我放弃了,只使用 Spring 构建了我的 api。我对结果非常满意。该 api 现在有几个月的生命并且运行良好。 【参考方案1】:

自从问题发布以来,我终于设法在一个应用程序中完成工作:

球衣 2.2 弹簧第 3.1 节 guice 3.0

maven pom.xml 文件中的相关属性和依赖部分:

<properties>
  <spring.version>3.1.0.RELEASE</spring.version>
  <jersey.version>2.2</jersey.version>
  <guice.version>3.0</guice.version>
  <hk2.version>2.2.0-b14</hk2.version>
 </properties>

<dependencies>
 <dependency>
   <groupId>org.glassfish.jersey.containers</groupId>
   <artifactId>jersey-container-servlet</artifactId>
   <version>$jersey.version</version>
 </dependency>
 <dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>$jersey.version</version>
 </dependency>
 <dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.12</version>
 </dependency>
 <dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.1</version>
 </dependency>
 <dependency>
  <groupId>com.google.inject.extensions</groupId>
  <artifactId>guice-servlet</artifactId>
  <version>$guice.version</version>
</dependency>
<dependency>
  <groupId>org.glassfish.hk2</groupId>
  <artifactId>guice-bridge</artifactId>
  <version>$hk2.version</version>
</dependency>
<!-- SECURITY (start) -->
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</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-web</artifactId>
 <version>$spring.version</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-ldap</artifactId>
  <version>$spring.version</version>
</dependency>
</dependencies>

现在在 web.xml 文件中,您需要处理过滤器顺序,以便在 spring 和 guice 之间进行和平交互:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns   /javaee/web-app_2_5.xsd">

<!-- Filter to secure Jersey (JAX-RS) services -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext-security.xml</param-value>
</context-param>

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

<!-- fist arm the 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> 

<!-- then filter all URLs through Guice Servlet -->
<filter>
  <filter-name>guiceFilter</filter-name>
  <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>guiceFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
    <listener-class>org.whatever.myapp.inject.GuiceServletConfig</listener-class>
</listener>

<!-- finaly define our rest app mapping -->
<servlet>
    <servlet-name>JerseyServletContainer</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
     <!-- Jersey would scan the specified package and register available    resources -->
          <param-name>jersey.config.server.provider.packages</param-name>
          <param-value>org.whatever.myapp.interfaces</param-value>
    </init-param>
    <init-param>
            <param-name>javax.ws.rs.Application</param-name>
    <param-value>org.whatever.myapp.inject.CurrentResourceConfig</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
</servlet>

 <servlet-mapping>
    <servlet-name>JerseyServletContainer</servlet-name>
    <url-pattern>/webapi/*</url-pattern>
 </servlet-mapping>

 </web-app>

请注意,如果您希望 guice 和 hk2 注射器同时使用,您需要: - 注意你正在使用的 hk2 版本(来自 pom.xml 的那个有效) - 注意避免在 Guice 类之外使用 guice 注入注解,在 guice 类之外使用 javax 标准。

最后,您需要使用以下代码从 hk2 引导 guice:

package org.whatever.myapp.inject.CurrentResourceConfig;

public class CurrentResourceConfig extends ResourceConfig
 
  @Inject
  public CurrentResourceConfig(ServiceLocator serviceLocator)
  
      GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
      GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
      guiceBridge.bridgeGuiceInjector(GuiceServletConfig.getInjectorInstance());
   
  

【讨论】:

以上是关于jersey 2.2 和 Spring Security 3 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

Jersey 2.2:输出 xml 正常,但在 json 上失败

使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept 标头的请求

带有 Jersey 客户端版本 2.2 的 Restful WebService 调用

Jersey+Spring+Maven(转)

Spring boot、jwt、jersey、spring security和CORS问题

Spring-Boot Jersey:允许 Jersey 提供静态内容