我已阅读http://wso2.com/library/articles/2012/03/carbon-context-its-usages-wso2-products/,您会发现底部有一条评论说明用例失败。请解释如何解决这个问题。
答案 0 :(得分:0)
这个问题实际上并不是CarbonContext中的错误或限制(至少在我尝试过的WSO2 AS 5.1.0中)。这可以通过使用以下代码片段来证明。
try {
CarbonContext carbonContext = CarbonContext.getCurrentContext();
int tenantId = carbonContext.getTenantId();
System.out.println("TENANT ID:" + tenantId);
String username = carbonContext.getUsername();
System.out.println("USERNAME:" + username);
UserRealm userRealm = carbonContext.getUserRealm();
String[] roleNames = userRealm.getUserStoreManager().getRoleNames();
userRealm.getUserStoreManager().getRoleListOfUser(username);
System.out.println("ALL ROLES:" + Arrays.toString(roleNames));
} catch (Exception e) {
e.printStackTrace();
}
您会注意到租户ID已正确打印,但不会打印用户名。虽然不是很明显,但那是因为你从未告诉过服务对象你是谁。虽然您已登录管理控制台,但这并不意味着您已登录到AS上托管的服务。如果要启用类似功能,则需要为服务设置安全性(可以从管理控制台完成)。例如,我使用了UsernameToken。然后TryIt会在调用服务时提示您输入用户名和密码。您只能获得有效凭据的响应。
但是,即使你这样做,代码仍然会返回与CarbonContext上的用户名相关的相同异常为null。要解决此问题,您需要将以下两个参数添加到相应服务的services.xml中(例如:samples / HelloService中的conf / services.xml)。
<parameter name="adminService" locked="true">true</parameter>
<parameter name="AuthorizationAction"
locked="false">/permission/admin/login</parameter>
这将确保使用有关在调用服务时登录的用户所需的信息初始化Carbon Context。
为了使其正常工作,您当然必须使用对services.xml的更改来重新部署服务。并且,一旦重新部署,请检查是否启用了安全性,因为重新部署会删除使用管理控制台完成的安全设置。