3

我正在尝试读取调用我的 OData 服务的用户的用户 ID。

在我的 web.xml 中,OData servlet 是一个保护区

<servlet>
    <servlet-name>EJODataServlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.apache.olingo.odata2.core.rest.app.ODataApplication</param-value>
    </init-param>
    <init-param>
        <param-name>org.apache.olingo.odata2.service.factory</param-name>
        <param-value>com.wombling.odata.service.EJServiceFactory</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>EJODataServlet</servlet-name>
    <url-pattern>/EJOData.svc/*</url-pattern>
</servlet-mapping>
<login-config>
    <auth-method>FORM</auth-method>
</login-config>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Area</web-resource-name>
        <url-pattern>/a/*</url-pattern>
        <url-pattern>/index.html</url-pattern>
        <url-pattern>*.html</url-pattern>
        <url-pattern>/EJOData.svc/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>extension_user</role-name>
    </auth-constraint>
</security-constraint>

当我创建工厂以响应查询时:

public class EJServiceFactory extends ODataServiceFactory {

@Override
public ODataService createService(ODataContext ctx) throws ODataException {
    return RuntimeDelegate
            .createODataSingleProcessorService(
                    new AnnotationEdmProvider(
                            "com.wombling.odata.models"),
                    new EJODataProcessor("admin")); //TODO this should not be hardcoded
}

}

我看不到可以从 ODataContext 获得已通过身份验证的用户的任何方式。如果我要使用基本身份验证 - 那么我可以只获取标头,但我没有使用基本身份验证,而是使用 OAuth2 不记名令牌(由 SAML 断言创建)。

我希望 ODataContext 为我提供对请求用户 ID 的访问权限,但没有运气。还有其他方法可以使用吗?或者我是否需要强制调用应用程序在请求标头中插入用户 ID(对我来说似乎并不理想!)

4

1 回答 1

1

通过ODataContext对象检索请求对象有点棘手。尝试这个:

HttpServletRequest r = (HttpServletRequest) ctx.getParameter(ODataContext.HTTP_SERVLET_REQUEST_OBJECT); 

ctx是你的ODataContext类的实例。从请求对象中,您可以获得所需的一切。

于 2014-05-20T06:25:37.360 回答