这是实施弹簧安全的真正方法吗? CXF网络服务

时间:2016-06-07 07:15:01

标签: spring web-services spring-security cxf

我创建了一个webservice,如下所示:

的web.xml

<display-name>MyService</display-name>

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

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

<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<!-- Spring Security Filter -->
<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>

的beans.xml

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 

<context:component-scan base-package="com.*" />

<jaxrs:server id="employeeService" address="/employeeservices">
    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
    </jaxrs:providers>
    <jaxrs:serviceBeans>
        <ref bean="empService" />
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="xml" value="application/xml" />
        <entry key="json" value="application/json" />
    </jaxrs:extensionMappings>
</jaxrs:server>

<bean id="empService" class="com.service.impl.EmployeeServiceImpl"/>
<bean id="employeeDao" class="com.dao.EmployeeDao"/>

弹簧security.xml文件

<http auto-config="true" use-expressions="true" create-session="stateless" >
    <csrf disabled="true"/>
    <http-basic entry-point-ref="restAuthenticationEntryPoint"></http-basic>
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>

<beans:bean id="userAuthorService" class="com.auth.UserAuthorService"/>
<beans:bean id="restAuthenticationEntryPoint" class="com.auth.UserBasicAuthenticationEntryPoint">
    <beans:property name="realmName" value="Name Of Your Realm"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userAuthorService">
         <password-encoder ref="bcryptPasswordEncoder"/>
    </authentication-provider>
</authentication-manager>

<beans:bean id="bcryptPasswordEncoder"
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    <beans:constructor-arg name="strength" value="5" />
</beans:bean>
<beans:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener"/>
  1. 通过这种配置,请求流程是否流动? : 请求 - &gt; Spring安全性(检查身份验证) - &gt; cxf - &gt;响应。

  2. 在真实服务器上部署此配置时是否存在任何问题?使用cxf和spring时的标准配置是什么?

  3. 当我打电话给右uri时:http://localhost:8089/MyService/rest/employeeservices/getemployeedetals?employeeId=004。没关系。 但是打电话给错误的uri:http://localhost:8089/MyService/rest/employeeservices/getemployeedetallll?employeeId=004。它抛出异常:

  4.   

    警告:找不到匹配请求路径“/ MyService / rest / employeeservices / getemployeedetallll”的操作,相对路径:/ getemployeedetal,HTTP方法:GET,ContentType: / ,接受: / ,.请启用FINE / TRACE日志级别以获取更多详细信息。   2016年6月7日下午1:55:17 org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse

         

    警告:javax.ws.rs.ClientErrorException       at org.apache.cxf.jaxrs.utils.SpecExceptions.toHttpException(SpecExceptions.java:110)       at org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:149)       在org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:477)

    那么如何在访问控制器类之前过滤正确的uri。

    请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:0)

  

通过这种配置,请求流程是否流动? :请求 - &gt;   Spring安全性(检查身份验证) - &gt; cxf - &gt;响应。

是的,因为J2EE过滤器是围绕J2EE servlet执行的(在euqeust之前和之后),所以springSecurityFilterChain将在CXFServlet之前执行

  

当我在部署中配置时,此配置是否存在任何问题   真正的切断?

对于CXF的最新版本,这不是必需的

<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 

此外,你在CXFServlet /rest/*中,但在auth *中。这是一个问题吗?您需要没有身份验证的休息服务吗?如果我们不了解您的系统的上下文,很难分析问题。详述您的疑虑,我可以尝试帮助

  

使用cxf和spring时的标准配置是什么?

没有任何推荐的配置,因为CXF可以与spring或standalone,jax-ws或jax-rs一起使用,作为服务器或充当客户端,通过spring security执行身份验证或与RequestContextFilter或inInterceptor集成jax-rs服务器甚至在CXF总线的全局级别。

如果您正在讨论配置所需的模块,因此使用spring执行CXF,您就拥有了所需的模块。

对于身份验证,您可以考虑使用JWT令牌而不是bcrypt passwod。

  当我打电话的时候   URI:http://localhost:8089/MyService/rest/employeeservices/getemployeedetals?employeeId=004。   没关系。但是打电话给错误的uri:   http://localhost:8089/MyService/rest/employeeservices/getemployeedetallll?employeeId=004。   抛出异常:   警告:没有匹配请求路径的操作

此警告是正常的。服务器正在响应http错误代码 404-Not found ,因为rest/employeeservices/getemployeedetallll

没有资源可用
  

那么如何在访问控制器类之前过滤正确的uri。

如果找不到路径,CXF会通过返回404为您做。这是正确的行为。你的意思是在Spring-security之前执行CXF uri过滤器吗?您不能使用此配置,因为auth过滤器是先前的。