我创建了一个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"/>
通过这种配置,请求流程是否流动? : 请求 - &gt; Spring安全性(检查身份验证) - &gt; cxf - &gt;响应。
在真实服务器上部署此配置时是否存在任何问题?使用cxf和spring时的标准配置是什么?
当我打电话给右uri时:http://localhost:8089/MyService/rest/employeeservices/getemployeedetals?employeeId=004。没关系。 但是打电话给错误的uri:http://localhost:8089/MyService/rest/employeeservices/getemployeedetallll?employeeId=004。它抛出异常:
警告:找不到匹配请求路径“/ 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。
请帮帮我。谢谢。
答案 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过滤器是先前的。