2013-11-25 19 views

回答

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(); 
    } 

您會注意到Tenant ID已正確打印,但沒有用戶名。雖然不明顯,那是因爲你從來沒有告訴服務員你是誰。雖然您已登錄到管理控制檯,但這並不意味着您已登錄到AS上託管的服務。如果要啓用類似的功能,則需要爲服務設置安全性(可以從管理控制檯執行此操作)。例如,我使用UsernameToken。然後TryIt應該提示您在調用服務時輸入用戶名和密碼。您僅獲得有效憑據的響應。

但是,即使你這樣做,代碼仍然會返回與CarbonContext上的用戶名相關的相同異常爲空。要解決這個問題,需要將以下兩個參數添加到相應服務的services.xml中(例如:samples/HelloService中的 - conf/services.xml)。

<parameter name="adminService" locked="true">true</parameter> 
    <parameter name="AuthorizationAction" 
      locked="false">/permission/admin/login</parameter> 

這將確保碳上下文被初始化爲關於在調用服務時登錄的用戶所需的信息。

爲了達到此目的,您當然必須重新部署具有對services.xml的更改的服務。而且,一旦重新部署,請務必檢查是否啓用安全性,因爲重新部署會刪除使用管理控制檯完成的安全設置。