2016-03-07 11 views
2

Мы используем wsdl2java и плагин cxf codegen для создания клиента для службы, защищенной ws-защитой.Отмена маркера контекста безопасности (SCT/Cancel)

Вызов службы через автоматически генерируемой клиента класса (OrganisationsEinheitenCoreService) довольно легко:

OrganisationsEinheitenCoreService service = new OrganisationsEinheitenCoreService(); 
IOrganisationsEinheitenCoreService serviceEndpoint = service.getServiceEndpoint(); 

BindingProvider bindingProvider = (BindingProvider) serviceEndpoint; 

Map<String, Object> ctx = bindingProvider.getRequestContext(); 
ctx.put("ws-security.username", "MyUsername"); 
ctx.put("ws-security.password", "MyPassword"); 

ArrayOfStaat staaten = serviceEndpoint.getStaaten(); 

При вызове метода «getStaaten» от службы, CXF автоматически обращается с запросом на SecurityContextToken с именем пользователя и паролем (action = http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT), перед вызовом фактического метода «getStaaten». После получения SCT из службы cxf сохраняет sct и использует его для следующего вызова (-ов).

По какой-то причине cxf никогда не вызывает http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/SCT/Cancel, чтобы прервать SCT. Мы также не могли понять, как это сделать явно, мы попробовали несколько вещей, таких как try-with-resource с классом, или получить клиент и вызвать метод close.

SCTs обычно истекает через определенное количество времени, к сожалению, нам нужно закрыть их сразу после вызова службы.

Любые идеи?

ответ

0

Вы можете написать простой перехватчик для извлечения + сохранения объекта SecurityToken, представляющего выданный токен. Затем вы можете явно отменить его, используя класс CXF STSClient. Некоторые из этих тестов могут вам помочь:

https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob;f=systests/ws-security/src/test/java/org/apache/cxf/systest/ws/wssc/WSSCUnitTest.java;h=3d524675b3b0ae435282e599f4d099338e24ede6;hb=HEAD