1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.security.xwss.callback.acegi;
18
19 import java.io.IOException;
20 import java.security.cert.X509Certificate;
21 import javax.security.auth.callback.Callback;
22 import javax.security.auth.callback.UnsupportedCallbackException;
23
24 import com.sun.xml.wss.impl.callback.CertificateValidationCallback;
25 import org.acegisecurity.Authentication;
26 import org.acegisecurity.AuthenticationException;
27 import org.acegisecurity.AuthenticationManager;
28 import org.acegisecurity.context.SecurityContextHolder;
29 import org.acegisecurity.providers.x509.X509AuthenticationToken;
30
31 import org.springframework.beans.factory.InitializingBean;
32 import org.springframework.util.Assert;
33 import org.springframework.ws.soap.security.callback.AbstractCallbackHandler;
34 import org.springframework.ws.soap.security.callback.CleanupCallback;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class AcegiCertificateValidationCallbackHandler extends AbstractCallbackHandler implements InitializingBean {
53
54 private AuthenticationManager authenticationManager;
55
56 private boolean ignoreFailure = false;
57
58
59 public void setAuthenticationManager(AuthenticationManager authenticationManager) {
60 this.authenticationManager = authenticationManager;
61 }
62
63 public void setIgnoreFailure(boolean ignoreFailure) {
64 this.ignoreFailure = ignoreFailure;
65 }
66
67 public void afterPropertiesSet() throws Exception {
68 Assert.notNull(authenticationManager, "authenticationManager is required");
69 }
70
71
72
73
74
75
76
77 protected void handleInternal(Callback callback) throws IOException, UnsupportedCallbackException {
78 if (callback instanceof CertificateValidationCallback) {
79 ((CertificateValidationCallback) callback).setValidator(new AcegiCertificateValidator());
80 }
81 else if (callback instanceof CleanupCallback) {
82 SecurityContextHolder.clearContext();
83 }
84 else {
85 throw new UnsupportedCallbackException(callback);
86 }
87 }
88
89 private class AcegiCertificateValidator implements CertificateValidationCallback.CertificateValidator {
90
91 public boolean validate(X509Certificate certificate)
92 throws CertificateValidationCallback.CertificateValidationException {
93 boolean result;
94 try {
95 Authentication authResult =
96 authenticationManager.authenticate(new X509AuthenticationToken(certificate));
97 if (logger.isDebugEnabled()) {
98 logger.debug("Authentication request for certificate with DN [" +
99 certificate.getSubjectX500Principal().getName() + "] successful");
100 }
101 SecurityContextHolder.getContext().setAuthentication(authResult);
102 return true;
103 }
104 catch (AuthenticationException failed) {
105 if (logger.isDebugEnabled()) {
106 logger.debug("Authentication request for certificate with DN [" +
107 certificate.getSubjectX500Principal().getName() + "] failed: " + failed.toString());
108 }
109 SecurityContextHolder.clearContext();
110 result = ignoreFailure;
111 }
112 return result;
113 }
114 }
115 }