From 7f209de51c19aef8c7b219b6b04bdf83b786fff0 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 5 Feb 2008 11:25:06 +0000 Subject: [PATCH] SWS-279 --- .../AcegiUsernamePasswordCallbackHandler.java | 67 +++++++++++++++++++ ...giUsernamePasswordCallbackHandlerTest.java | 51 ++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 security/src/main/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandler.java create mode 100644 security/src/test/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandlerTest.java diff --git a/security/src/main/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandler.java b/security/src/main/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandler.java new file mode 100644 index 00000000..c903fcb0 --- /dev/null +++ b/security/src/main/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandler.java @@ -0,0 +1,67 @@ +/* + * Copyright 2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.security.xwss.callback.acegi; + +import java.io.IOException; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.UnsupportedCallbackException; + +import com.sun.xml.wss.impl.callback.PasswordCallback; +import com.sun.xml.wss.impl.callback.UsernameCallback; +import org.acegisecurity.Authentication; +import org.acegisecurity.context.SecurityContext; +import org.acegisecurity.context.SecurityContextHolder; + +import org.springframework.ws.soap.security.xwss.callback.AbstractCallbackHandler; + +/** + * Callback handler that adds username/password information to a mesage using an Acegi {@link SecurityContext}. + *

+ * This class handles UsernameCallbacks and PasswordCallbacks, and throws an + * UnsupportedCallbackException for others + * + * @author Arjen Poutsma + * @since 1.5.0 + */ +public class AcegiUsernamePasswordCallbackHandler extends AbstractCallbackHandler { + + protected void handleInternal(Callback callback) throws IOException, UnsupportedCallbackException { + if (callback instanceof UsernameCallback) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getName() != null) { + UsernameCallback usernameCallback = (UsernameCallback) callback; + usernameCallback.setUsername(authentication.getName()); + return; + } + else { + logger.warn("Cannot handle UsernameCallback: Acegi SecurityContext contains no Authentication"); + } + } + else if (callback instanceof PasswordCallback) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getName() != null) { + PasswordCallback passwordCallback = (PasswordCallback) callback; + passwordCallback.setPassword(authentication.getCredentials().toString()); + return; + } + else { + logger.warn("Canot handle PasswordCallback: Acegi SecurityContext contains no Authentication"); + } + } + throw new UnsupportedCallbackException(callback); + } +} diff --git a/security/src/test/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandlerTest.java b/security/src/test/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandlerTest.java new file mode 100644 index 00000000..c6f0cc16 --- /dev/null +++ b/security/src/test/java/org/springframework/ws/soap/security/xwss/callback/acegi/AcegiUsernamePasswordCallbackHandlerTest.java @@ -0,0 +1,51 @@ +/* + * Copyright ${YEAR} the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.security.xwss.callback.acegi; + +import com.sun.xml.wss.impl.callback.PasswordCallback; +import com.sun.xml.wss.impl.callback.UsernameCallback; +import junit.framework.TestCase; +import org.acegisecurity.Authentication; +import org.acegisecurity.context.SecurityContextHolder; +import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; + +public class AcegiUsernamePasswordCallbackHandlerTest extends TestCase { + + private AcegiUsernamePasswordCallbackHandler handler; + + protected void setUp() throws Exception { + handler = new AcegiUsernamePasswordCallbackHandler(); + Authentication authentication = new UsernamePasswordAuthenticationToken("Bert", "Ernie"); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + protected void tearDown() throws Exception { + SecurityContextHolder.clearContext(); + } + + public void testUsernameCallback() throws Exception { + UsernameCallback usernameCallback = new UsernameCallback(); + handler.handleInternal(usernameCallback); + assertEquals("Invalid username", "Bert", usernameCallback.getUsername()); + } + + public void testPasswordCallback() throws Exception { + PasswordCallback passwordCallback = new PasswordCallback(); + handler.handleInternal(passwordCallback); + assertEquals("Invalid username", "Ernie", passwordCallback.getPassword()); + } +} \ No newline at end of file