我正在尝试读取正在调用我的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(对我来说似乎不太合适!)
答案 0 :(得分:1)
通过ODataContext
对象检索请求对象有点棘手。试试这个:
HttpServletRequest r = (HttpServletRequest) ctx.getParameter(ODataContext.HTTP_SERVLET_REQUEST_OBJECT);
ctx
是ODataContext
类的实例。从请求对象中,您可以获得所需的一切。