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