实施oauth2
系统,我在使用以下代码时遇到一些问题:
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
import org.springframework.web.servlet.HandlerMapping;
...
HandlerMapping.class.isAssignableFrom(FrameworkEndpointHandlerMapping.class);
确实,作为班级FrameworkEndpointHandlerMapping
正在实现接口HandlerMapping
,这个函数应该总是返回true
。当我对此函数运行单元测试时就是这种情况。但是,在服务器启动期间,该函数返回false
(使用调试器检查)。这是一个很大的问题,因为当DispatcherServlet
被实例化后,它会搜索实现的类HandlerMapping
and my FrameworkEndpointHandlerMapping
被丢弃会导致应用程序中出现错误。
我搜索过类似这个问题的其他问题,但大多数人的回答是isAssignableFrom
方法未正确使用(类和函数参数的混合)。这里的情况并非如此,因为 JUnit 正在工作。
怀疑是进口的jar
文件是问题所在,我将它们限制为以下文件:
- spring-beans-4.1.4.RELEASE.jar
- spring-security-oauth2-2.0.6.RELEASE.jar
- spring-webmvc-4.1.4.RELEASE.jar(也尝试过4.0.9)
- spring-core-4.1.4.RELEASE.jar
- ...
您有什么解决方案可以探索吗?
欲了解更多信息,请参阅以下来源:
My own DispatcherServlet
(构造函数与String
作为参数由 JUnit 测试调用,并在系统启动期间调用默认构造函数)
import org.junit.Assert;
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
public class MobileDispatcherServlet extends DispatcherServlet
{
private static final long serialVersionUID = 1L;
public MobileDispatcherServlet()
{
super();
HandlerMapping.class.isAssignableFrom(FrameworkEndpointHandlerMapping.class);
}
public MobileDispatcherServlet(final WebApplicationContext webApplicationContext)
{
super(webApplicationContext);
final FrameworkEndpointHandlerMapping handlerMapping = webApplicationContext.getBean(FrameworkEndpointHandlerMapping.class);
HandlerMapping.class.isAssignableFrom(handlerMapping.getClass());
}
public MobileDispatcherServlet(final String test)
{
Assert.assertTrue(HandlerMapping.class.isAssignableFrom(FrameworkEndpointHandlerMapping.class));
}
}
The oauth
配置文件:
<?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:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2.xsd">
<!-- Root of the configuration -->
<!-- The FrameworkEndpointHandlerMapping is created here -->
<oauth:authorization-server client-details-service-ref="clientDetails"
token-services-ref="tokenServices"
user-approval-handler-ref="userApprovalHandler"
authorization-endpoint-url="/oauth/authorize.action"
token-endpoint-url="/oauth/token.action" >
<oauth:authorization-code authorization-code-services-ref="authorizationCodeServices" disabled="false" />
<oauth:refresh-token />
</oauth:authorization-server>
...
</beans>
The web.xml
:
<web-app id="sitestorefront" version="3.0" 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.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app.xsd"
metadata-complete="true">
...
<context-param>
<description>
The 'contextConfigLocation' param specifies where your configuration files are located.
The 'WEB-INF/config/web-application-config.xml' file includes several other XML config
files to build up the configuration for the application.
</description>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/config/web-application-config.xml</param-value>
</context-param>
<context-param>
<param-name>tagpoolMaxSize</param-name>
<param-value>50</param-value>
</context-param>
<servlet>
<description>
DispatcherServlet
</description>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>be.sbh.site.storefront.oauth2.MobileDispatcherServlet</servlet-class>
<init-param>
<description>
Specifies the location for Spring MVC to load an additional XML configuration file.
Because hybris is already configured with the XML spring configuration files to load
we must set this param value to EMPTY in order to prevent loading of the default
/WEB-INF/applicationContext.xml file.
</description>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- Map all requests to the DispatcherServlet -->
<url-pattern>/</url-pattern>
</servlet-mapping>
...
</web-app>
The web-application-config.xml
导入所有配置文件(其中,oauth
配置文件)。其中一个有一个<mvc:annotation-driven />
启用 mvc 注释。
我试图将我的资源限制在与我相关的资源上。如果您需要更多,请随时询问我。
感谢您阅读这个问题,
Laurent