如何在Olingo ODataServiceFactory中获取经过身份验证的用户的ID

时间:2014-05-19 06:22:46

标签: authorization olingo

我正在尝试读取正在调用我的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(对我来说似乎不太合适!)

1 个答案:

答案 0 :(得分:1)

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

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

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