Author: coheigea
Date: Mon Dec 19 17:18:16 2011
New Revision: 1220854
URL: http://svn.apache.org/viewvc?rev=1220854&view=rev
Log:
Adding an interceptor to send and process SAML tokens with no binding policy
- Finished with the ws-security-example tests
Added:
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SamlTokenInterceptorProvider.java
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/SamlTokenInterceptor.java
Modified:
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/WSSecurityPolicyLoader.java
cxf/trunk/systests/ws-security-examples/src/test/java/org/apache/cxf/systest/wssec/examples/saml/SamlTokenTest.java
Modified:
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/WSSecurityPolicyLoader.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/WSSecurityPolicyLoader.java?rev=1220854&r1=1220853&r2=1220854&view=diff
==============================================================================
---
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/WSSecurityPolicyLoader.java
(original)
+++
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/WSSecurityPolicyLoader.java
Mon Dec 19 17:18:16 2011
@@ -70,6 +70,7 @@ import org.apache.cxf.ws.security.policy
import
org.apache.cxf.ws.security.policy.interceptors.HttpsTokenInterceptorProvider;
import
org.apache.cxf.ws.security.policy.interceptors.IssuedTokenInterceptorProvider;
import
org.apache.cxf.ws.security.policy.interceptors.KerberosTokenInterceptorProvider;
+import
org.apache.cxf.ws.security.policy.interceptors.SamlTokenInterceptorProvider;
import
org.apache.cxf.ws.security.policy.interceptors.SecureConversationTokenInterceptorProvider;
import
org.apache.cxf.ws.security.policy.interceptors.UsernameTokenInterceptorProvider;
import
org.apache.cxf.ws.security.policy.interceptors.WSSecurityInterceptorProvider;
@@ -181,6 +182,7 @@ public final class WSSecurityPolicyLoade
reg.register(new KerberosTokenInterceptorProvider());
reg.register(new IssuedTokenInterceptorProvider());
reg.register(new UsernameTokenInterceptorProvider(bus));
+ reg.register(new SamlTokenInterceptorProvider());
reg.register(new SecureConversationTokenInterceptorProvider());
}
Added:
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SamlTokenInterceptorProvider.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SamlTokenInterceptorProvider.java?rev=1220854&view=auto
==============================================================================
---
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SamlTokenInterceptorProvider.java
(added)
+++
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/policy/interceptors/SamlTokenInterceptorProvider.java
Mon Dec 19 17:18:16 2011
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.cxf.ws.security.policy.interceptors;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.ws.policy.AbstractPolicyInterceptorProvider;
+import org.apache.cxf.ws.security.policy.SP12Constants;
+import org.apache.cxf.ws.security.wss4j.SamlTokenInterceptor;
+
+/**
+ *
+ */
+public class SamlTokenInterceptorProvider extends
AbstractPolicyInterceptorProvider {
+ private static final Collection<QName> ASSERTION_TYPES;
+ static {
+ ASSERTION_TYPES = new ArrayList<QName>();
+
+ ASSERTION_TYPES.add(SP12Constants.SAML_TOKEN);
+ }
+
+ public SamlTokenInterceptorProvider() {
+ super(ASSERTION_TYPES);
+ this.getOutInterceptors().add(new SamlTokenInterceptor());
+ this.getInInterceptors().add(new SamlTokenInterceptor());
+ }
+
+}
Added:
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/SamlTokenInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/SamlTokenInterceptor.java?rev=1220854&view=auto
==============================================================================
---
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/SamlTokenInterceptor.java
(added)
+++
cxf/trunk/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/SamlTokenInterceptor.java
Mon Dec 19 17:18:16 2011
@@ -0,0 +1,493 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.cxf.ws.security.wss4j;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.CallbackHandler;
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.binding.soap.SoapHeader;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.common.classloader.ClassLoaderUtils;
+import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.StringUtils;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.security.DefaultSecurityContext;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.resource.ResourceManager;
+import org.apache.cxf.security.SecurityContext;
+import org.apache.cxf.ws.policy.AssertionInfo;
+import org.apache.cxf.ws.policy.AssertionInfoMap;
+import org.apache.cxf.ws.policy.PolicyException;
+import org.apache.cxf.ws.security.SecurityConstants;
+import org.apache.cxf.ws.security.policy.SP12Constants;
+import org.apache.cxf.ws.security.policy.model.SamlToken;
+import org.apache.ws.security.WSConstants;
+import org.apache.ws.security.WSDocInfo;
+import org.apache.ws.security.WSPasswordCallback;
+import org.apache.ws.security.WSSConfig;
+import org.apache.ws.security.WSSecurityEngine;
+import org.apache.ws.security.WSSecurityEngineResult;
+import org.apache.ws.security.WSSecurityException;
+import org.apache.ws.security.components.crypto.Crypto;
+import org.apache.ws.security.components.crypto.CryptoFactory;
+import org.apache.ws.security.handler.RequestData;
+import org.apache.ws.security.handler.WSHandlerConstants;
+import org.apache.ws.security.handler.WSHandlerResult;
+import org.apache.ws.security.processor.SAMLTokenProcessor;
+import org.apache.ws.security.saml.ext.AssertionWrapper;
+import org.apache.ws.security.saml.ext.SAMLParms;
+import org.apache.ws.security.validate.Validator;
+
+import org.opensaml.common.SAMLVersion;
+
+/**
+ * An interceptor to create and add a SAML token to the security header of an
outbound
+ * request, and to process a SAML Token on an inbound request.
+ */
+public class SamlTokenInterceptor extends AbstractSoapInterceptor {
+ private static final Logger LOG =
LogUtils.getL7dLogger(SamlTokenInterceptor.class);
+ private static final Set<QName> HEADERS = new HashSet<QName>();
+ static {
+ HEADERS.add(new QName(WSConstants.WSSE_NS, "Security"));
+ HEADERS.add(new QName(WSConstants.WSSE11_NS, "Security"));
+ }
+
+ /**
+ * @param p
+ */
+ public SamlTokenInterceptor() {
+ super(Phase.PRE_PROTOCOL);
+ addAfter(PolicyBasedWSS4JOutInterceptor.class.getName());
+ addAfter(PolicyBasedWSS4JInInterceptor.class.getName());
+ }
+
+ public Set<QName> getUnderstoodHeaders() {
+ return HEADERS;
+ }
+
+ public void handleMessage(SoapMessage message) throws Fault {
+
+ boolean isReq = MessageUtils.isRequestor(message);
+ boolean isOut = MessageUtils.isOutbound(message);
+
+ if (isReq != isOut) {
+ //outbound on server side and inbound on client side doesn't need
+ //any saml token stuff, assert policies and return
+ assertSamlTokens(message);
+ return;
+ }
+ if (isReq) {
+ if
(message.containsKey(PolicyBasedWSS4JOutInterceptor.SECURITY_PROCESSED)) {
+ //The full policy interceptors handled this
+ return;
+ }
+ addSamlToken(message);
+ } else {
+ if (message.containsKey(WSS4JInInterceptor.SECURITY_PROCESSED)) {
+ //The full policy interceptors handled this
+ return;
+ }
+ processSamlToken(message);
+ }
+ }
+
+ private void processSamlToken(SoapMessage message) {
+ Header h = findSecurityHeader(message, false);
+ if (h == null) {
+ return;
+ }
+ Element el = (Element)h.getObject();
+ Element child = DOMUtils.getFirstElement(el);
+ while (child != null) {
+ if ("Assertion".equals(child.getLocalName())) {
+ try {
+ List<WSSecurityEngineResult> samlResults =
processToken(child, message);
+ if (samlResults != null) {
+ List<WSHandlerResult> results =
CastUtils.cast((List<?>)message
+ .get(WSHandlerConstants.RECV_RESULTS));
+ if (results == null) {
+ results = new ArrayList<WSHandlerResult>();
+ message.put(WSHandlerConstants.RECV_RESULTS,
results);
+ }
+ WSHandlerResult rResult = new WSHandlerResult(null,
samlResults);
+ results.add(0, rResult);
+
+ assertSamlTokens(message);
+
+ Principal principal =
+
(Principal)samlResults.get(0).get(WSSecurityEngineResult.TAG_PRINCIPAL);
+ message.put(WSS4JInInterceptor.PRINCIPAL_RESULT,
principal);
+
+ SecurityContext sc =
message.get(SecurityContext.class);
+ if (sc == null || sc.getUserPrincipal() == null) {
+ message.put(SecurityContext.class, new
DefaultSecurityContext(principal, null));
+ }
+
+ }
+ } catch (WSSecurityException ex) {
+ throw new Fault(ex);
+ }
+ }
+ child = DOMUtils.getNextElement(child);
+ }
+ }
+
+ private List<WSSecurityEngineResult> processToken(Element tokenElement,
final SoapMessage message)
+ throws WSSecurityException {
+ SAMLTokenProcessor p = new SAMLTokenProcessor();
+ WSDocInfo wsDocInfo = new WSDocInfo(tokenElement.getOwnerDocument());
+ RequestData data = new RequestData() {
+ public CallbackHandler getCallbackHandler() {
+ return getCallback(message);
+ }
+ public Validator getValidator(QName qName) throws
WSSecurityException {
+ String key = null;
+ if (WSSecurityEngine.SAML_TOKEN.equals(qName)) {
+ key = SecurityConstants.SAML1_TOKEN_VALIDATOR;
+ } else if (WSSecurityEngine.SAML2_TOKEN.equals(qName)) {
+ key = SecurityConstants.SAML2_TOKEN_VALIDATOR;
+ }
+ if (key != null) {
+ Object o = message.getContextualProperty(key);
+ try {
+ if (o instanceof Validator) {
+ return (Validator)o;
+ } else if (o instanceof Class) {
+ return (Validator)((Class)o).newInstance();
+ } else if (o instanceof String) {
+ return
(Validator)ClassLoaderUtils.loadClass(o.toString(),
+
SamlTokenInterceptor.class)
+
.newInstance();
+ }
+ } catch (RuntimeException t) {
+ throw t;
+ } catch (Throwable t) {
+ throw new WSSecurityException(t.getMessage(), t);
+ }
+ }
+ return super.getValidator(qName);
+ }
+ };
+ data.setWssConfig(WSSConfig.getNewInstance());
+ List<WSSecurityEngineResult> results =
+ p.handleToken(tokenElement, data, wsDocInfo);
+ return results;
+ }
+
+ private SamlToken assertSamlTokens(SoapMessage message) {
+ AssertionInfoMap aim = message.get(AssertionInfoMap.class);
+ Collection<AssertionInfo> ais =
aim.getAssertionInfo(SP12Constants.SAML_TOKEN);
+ SamlToken tok = null;
+ for (AssertionInfo ai : ais) {
+ tok = (SamlToken)ai.getAssertion();
+ ai.setAsserted(true);
+ }
+ ais = aim.getAssertionInfo(SP12Constants.SUPPORTING_TOKENS);
+ for (AssertionInfo ai : ais) {
+ ai.setAsserted(true);
+ }
+ ais = aim.getAssertionInfo(SP12Constants.SIGNED_SUPPORTING_TOKENS);
+ for (AssertionInfo ai : ais) {
+ ai.setAsserted(true);
+ }
+ return tok;
+ }
+
+
+ private void addSamlToken(SoapMessage message) {
+ SamlToken tok = assertSamlTokens(message);
+
+ Header h = findSecurityHeader(message, true);
+ try {
+ AssertionWrapper wrapper = addSamlToken(tok, message);
+ if (wrapper == null) {
+ AssertionInfoMap aim = message.get(AssertionInfoMap.class);
+ Collection<AssertionInfo> ais =
aim.getAssertionInfo(SP12Constants.SAML_TOKEN);
+ for (AssertionInfo ai : ais) {
+ if (ai.isAsserted()) {
+ ai.setAsserted(false);
+ }
+ }
+ return;
+ }
+ Element el = (Element)h.getObject();
+ el.appendChild(wrapper.toDOM(el.getOwnerDocument()));
+ } catch (WSSecurityException ex) {
+ policyNotAsserted(tok, ex.getMessage(), message);
+ }
+ }
+
+
+ private AssertionWrapper addSamlToken(
+ SamlToken token, SoapMessage message
+ ) throws WSSecurityException {
+ //
+ // Get the SAML CallbackHandler
+ //
+ Object o =
message.getContextualProperty(SecurityConstants.SAML_CALLBACK_HANDLER);
+
+ CallbackHandler handler = null;
+ if (o instanceof CallbackHandler) {
+ handler = (CallbackHandler)o;
+ } else if (o instanceof String) {
+ try {
+ handler = (CallbackHandler)ClassLoaderUtils
+ .loadClass((String)o, this.getClass()).newInstance();
+ } catch (Exception e) {
+ handler = null;
+ }
+ }
+ if (handler == null) {
+ return null;
+ }
+
+ SAMLParms samlParms = new SAMLParms();
+ samlParms.setCallbackHandler(handler);
+ if (token.isUseSamlVersion11Profile10() ||
token.isUseSamlVersion11Profile11()) {
+ samlParms.setSAMLVersion(SAMLVersion.VERSION_11);
+ } else if (token.isUseSamlVersion20Profile11()) {
+ samlParms.setSAMLVersion(SAMLVersion.VERSION_20);
+ }
+ AssertionWrapper assertion = new AssertionWrapper(samlParms);
+
+ boolean selfSignAssertion =
+ MessageUtils.getContextualBoolean(
+ message, SecurityConstants.SELF_SIGN_SAML_ASSERTION, false
+ );
+ if (selfSignAssertion) {
+ Crypto crypto =
+ getCrypto(
+ token, SecurityConstants.SIGNATURE_CRYPTO,
+ SecurityConstants.SIGNATURE_PROPERTIES, message
+ );
+
+ String userNameKey = SecurityConstants.SIGNATURE_USERNAME;
+ String user = (String)message.getContextualProperty(userNameKey);
+ if (crypto != null && StringUtils.isEmpty(user)) {
+ try {
+ user = crypto.getDefaultX509Identifier();
+ } catch (WSSecurityException e1) {
+ throw new Fault(e1);
+ }
+ }
+ if (StringUtils.isEmpty(user)) {
+ return null;
+ }
+
+ String password =
(String)message.getContextualProperty(SecurityConstants.PASSWORD);
+ if (StringUtils.isEmpty(password)) {
+ password = getPassword(user, token,
WSPasswordCallback.SIGNATURE, message);
+ }
+ if (password == null) {
+ password = "";
+ }
+
+ // TODO configure using a KeyValue here
+ assertion.signAssertion(user, password, crypto, false);
+ }
+
+ return assertion;
+ }
+
+ private Crypto getCrypto(
+ SamlToken samlToken,
+ String cryptoKey,
+ String propKey,
+ SoapMessage message
+ ) throws WSSecurityException {
+ Crypto crypto = (Crypto)message.getContextualProperty(cryptoKey);
+ if (crypto != null) {
+ return crypto;
+ }
+
+ Object o = message.getContextualProperty(propKey);
+ if (o == null) {
+ return null;
+ }
+
+ Properties properties = null;
+ if (o instanceof Properties) {
+ properties = (Properties)o;
+ } else if (o instanceof String) {
+ ResourceManager rm =
message.getExchange().get(Bus.class).getExtension(ResourceManager.class);
+ URL url = rm.resolveResource((String)o, URL.class);
+ try {
+ if (url == null) {
+ url = ClassLoaderUtils.getResource((String)o,
this.getClass());
+ }
+ if (url == null) {
+ try {
+ url = new URL((String)o);
+ } catch (Exception ex) {
+ //ignore
+ }
+ }
+ if (url != null) {
+ InputStream ins = url.openStream();
+ properties = new Properties();
+ properties.load(ins);
+ ins.close();
+ } else if (samlToken != null) {
+ policyNotAsserted(samlToken, "Could not find properties
file " + o, message);
+ }
+ } catch (IOException e) {
+ if (samlToken != null) {
+ policyNotAsserted(samlToken, e.getMessage(), message);
+ }
+ }
+ } else if (o instanceof URL) {
+ properties = new Properties();
+ try {
+ InputStream ins = ((URL)o).openStream();
+ properties.load(ins);
+ ins.close();
+ } catch (IOException e) {
+ if (samlToken != null) {
+ policyNotAsserted(samlToken, e.getMessage(), message);
+ }
+ }
+ }
+
+ if (properties != null) {
+ crypto = CryptoFactory.getInstance(properties);
+ }
+ return crypto;
+ }
+
+ private Header findSecurityHeader(SoapMessage message, boolean create) {
+ for (Header h : message.getHeaders()) {
+ QName n = h.getName();
+ if (n.getLocalPart().equals("Security")
+ && (n.getNamespaceURI().equals(WSConstants.WSSE_NS)
+ || n.getNamespaceURI().equals(WSConstants.WSSE11_NS))) {
+ return h;
+ }
+ }
+ if (!create) {
+ return null;
+ }
+ Document doc = DOMUtils.createDocument();
+ Element el = doc.createElementNS(WSConstants.WSSE_NS, "wsse:Security");
+ el.setAttributeNS(WSConstants.XMLNS_NS, "xmlns:wsse",
WSConstants.WSSE_NS);
+ SoapHeader sh = new SoapHeader(new QName(WSConstants.WSSE_NS,
"Security"), el);
+ sh.setMustUnderstand(true);
+ message.getHeaders().add(sh);
+ return sh;
+ }
+
+ private CallbackHandler getCallback(SoapMessage message) {
+ //Then try to get the password from the given callback handler
+ Object o =
message.getContextualProperty(SecurityConstants.CALLBACK_HANDLER);
+
+ CallbackHandler handler = null;
+ if (o instanceof CallbackHandler) {
+ handler = (CallbackHandler)o;
+ } else if (o instanceof String) {
+ try {
+ handler = (CallbackHandler)ClassLoaderUtils
+ .loadClass((String)o, this.getClass()).newInstance();
+ } catch (Exception e) {
+ handler = null;
+ }
+ }
+ return handler;
+ }
+
+ public String getPassword(String userName, SamlToken info, int type,
SoapMessage message) {
+ //Then try to get the password from the given callback handler
+
+ CallbackHandler handler = getCallback(message);
+ if (handler == null) {
+ policyNotAsserted(info, "No callback handler and no password
available", message);
+ return null;
+ }
+
+ WSPasswordCallback[] cb = {new WSPasswordCallback(userName, type)};
+ try {
+ handler.handle(cb);
+ } catch (Exception e) {
+ policyNotAsserted(info, e, message);
+ }
+
+ //get the password
+ return cb[0].getPassword();
+ }
+
+ protected void policyNotAsserted(SamlToken assertion, String reason,
SoapMessage message) {
+ if (assertion == null) {
+ return;
+ }
+ AssertionInfoMap aim = message.get(AssertionInfoMap.class);
+
+ Collection<AssertionInfo> ais;
+ ais = aim.get(assertion.getName());
+ if (ais != null) {
+ for (AssertionInfo ai : ais) {
+ if (ai.getAssertion() == assertion) {
+ ai.setNotAsserted(reason);
+ }
+ }
+ }
+ if (!assertion.isOptional()) {
+ throw new PolicyException(new Message(reason, LOG));
+ }
+ }
+
+ protected void policyNotAsserted(SamlToken assertion, Exception reason,
SoapMessage message) {
+ if (assertion == null) {
+ return;
+ }
+ AssertionInfoMap aim = message.get(AssertionInfoMap.class);
+ Collection<AssertionInfo> ais;
+ ais = aim.get(assertion.getName());
+ if (ais != null) {
+ for (AssertionInfo ai : ais) {
+ if (ai.getAssertion() == assertion) {
+ ai.setNotAsserted(reason.getMessage());
+ }
+ }
+ }
+ throw new PolicyException(reason);
+ }
+
+
+}
Modified:
cxf/trunk/systests/ws-security-examples/src/test/java/org/apache/cxf/systest/wssec/examples/saml/SamlTokenTest.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/systests/ws-security-examples/src/test/java/org/apache/cxf/systest/wssec/examples/saml/SamlTokenTest.java?rev=1220854&r1=1220853&r2=1220854&view=diff
==============================================================================
---
cxf/trunk/systests/ws-security-examples/src/test/java/org/apache/cxf/systest/wssec/examples/saml/SamlTokenTest.java
(original)
+++
cxf/trunk/systests/ws-security-examples/src/test/java/org/apache/cxf/systest/wssec/examples/saml/SamlTokenTest.java
Mon Dec 19 17:18:16 2011
@@ -69,7 +69,6 @@ public class SamlTokenTest extends Abstr
* 2.3.1.1 (WSS1.0) SAML1.1 Assertion (Bearer)
*/
@org.junit.Test
- @org.junit.Ignore
public void testBearer() throws Exception {
SpringBusFactory bf = new SpringBusFactory();