2016-06-07 70 views
-1

我创建如下web服务的真正方式:是否实施春季安全与web服务CXF

的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"/> 

春天的安全性。 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. 通过这个配置,是请求过程的流程吗? : 请求 - > Spring安全(检查认证) - > cxf - >响应。

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

  3. 当我打电话给右:http://localhost:8089/MyService/rest/employeeservices/getemployeedetals?employeeId=004。没关系。 但是打电话错误的是: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 在org.apache.cxf.jaxrs.utils.SpecExceptions。 (org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:149) at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java: 477)

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

请帮帮我。谢谢。

回答

0

通过这个配置,它是请求过程的流程吗? :请求 - > Spring安全(检查身份验证) - > cxf - >响应。

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

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

这不是必要的CXF

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

的latests版本还你在CXFServlet /rest/*但在权威性*醒目。这是一个问题吗?你需要没有身份验证的休息服务吗?如果我们不知道系统的背景,很难分析问题。详细你的疑惑,我可以尝试帮助

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

没有任何建议的配置,因为CXF可以用弹簧或独立,JAX-WS或JAX-RS一起使用,作为服务器或作为客户端,经由弹簧安全执行的认证或RequestContextFilter两个集成或者在jax-rs服务器中的inInterceptor中,或者甚至在CXF总线中的全局级别中。

如果您正在讨论配置所需的模块,以便CXF在spring中执行,则您需要使用这些模块。

对于身份验证,您可以考虑使用JWT令牌代替bcrypt密码。

当我打电话正确 uri:http://localhost:8089/MyService/rest/employeeservices/getemployeedetals?employeeId=004。 它确定。但拨打错误的URI: http://localhost:8089/MyService/rest/employeeservices/getemployeedetallll?employeeId=004。 它抛出异常: 警告:无操作匹配的请求路径

这个警告是正常的。服务器使用HTTP错误代码响应404未找到因为在rest/employeeservices/getemployeedetallll

所以,我怎么可以过滤访问控制器课前右URI没有可用的资源。

如果路径未找到,CXF通过返回404来帮助您。这是正确的行为。你的意思是在春季安全之前执行CXF uri过滤器吗?由于auth过滤器先前无法使用此配置。

+0

谢谢pedrofb,它让我清楚 – KienNguyen