2009-11-12 42 views
1

我正在使用最新的Apache CXF創建web服務。我使用org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor配置了ws-security。在我的passwordCallbackClass中,我可以通過調用getIdentifier()類的org.apache.ws.security.WSPasswordCallback類訪問用戶或標識符。如何讀取ws-security中提供的用戶或標識符

我也用整個設置的彈簧。

我想知道如何訪問代碼中的任何其他地方的標識符?我能想到在我的passwordCallbackClass中使用ThreadLocal?另一種方法是在我的所有服務方法參數中定義一個標識符屬性,但這意味着客戶端需要兩次傳遞標識符,一個在安全塊中,另一個在服務調用中?


編輯

我的服務類看起來是這樣的,我需要閱讀標識符sayHi方法。

@WebService(endpointInterface = "com.webservice.HelloWorld") 
public class HelloWorldImpl implements HelloWorld { 
    public String sayHi(String text) { 
     return "Hello " + text; 
    } 
} 

我的密碼回調方法就是這樣,我可以得到標識符。

public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackExceptio { 
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
    pc.getIdentifier(); 
} 

回答

2

我在我的密碼回調方法中使用了ThreadLocal來存儲標識符。然後,我訪問代碼中任何位置的ThreadLocal以瞭解標識符。

1

定義「代碼中的任何其他地方」?你在談論其他攔截器嗎?在你的服務器實現?你使用JAXWS還是簡單的前端?等...

如果使用jaxws並且希望在服務器中使用impl,則JAXWS WebServiceContext有一個getUserPrincipal()方法,該方法在驗證用戶之後將成爲WSS4J創建的主體。

差不多其他任何地方(甚至在使用上下文服務器IMPL),你可以這樣做:

message.get(SecurityContext.class).getUserPrincipal();

以實現相同的結果。

相關問題