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 javax.security.auth.callback.Callback;
21 import javax.security.auth.callback.UnsupportedCallbackException;
22
23 import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
24 import org.acegisecurity.Authentication;
25 import org.acegisecurity.AuthenticationException;
26 import org.acegisecurity.AuthenticationManager;
27 import org.acegisecurity.context.SecurityContextHolder;
28 import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
29
30 import org.springframework.beans.factory.InitializingBean;
31 import org.springframework.util.Assert;
32 import org.springframework.ws.soap.security.callback.AbstractCallbackHandler;
33 import org.springframework.ws.soap.security.callback.CleanupCallback;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public class AcegiPlainTextPasswordValidationCallbackHandler extends AbstractCallbackHandler
54 implements InitializingBean {
55
56 private AuthenticationManager authenticationManager;
57
58 private boolean ignoreFailure = false;
59
60
61 public void setAuthenticationManager(AuthenticationManager authenticationManager) {
62 this.authenticationManager = authenticationManager;
63 }
64
65 public void setIgnoreFailure(boolean ignoreFailure) {
66 this.ignoreFailure = ignoreFailure;
67 }
68
69 public void afterPropertiesSet() throws Exception {
70 Assert.notNull(authenticationManager, "authenticationManager is required");
71 }
72
73
74
75
76
77
78
79 protected void handleInternal(Callback callback) throws IOException, UnsupportedCallbackException {
80 if (callback instanceof PasswordValidationCallback) {
81 PasswordValidationCallback validationCallback = (PasswordValidationCallback) callback;
82 if (validationCallback.getRequest() instanceof PasswordValidationCallback.PlainTextPasswordRequest) {
83 validationCallback.setValidator(new AcegiPlainTextPasswordValidator());
84 return;
85 }
86 }
87 else if (callback instanceof CleanupCallback) {
88 SecurityContextHolder.clearContext();
89 return;
90 }
91 throw new UnsupportedCallbackException(callback);
92 }
93
94 private class AcegiPlainTextPasswordValidator implements PasswordValidationCallback.PasswordValidator {
95
96 public boolean validate(PasswordValidationCallback.Request request)
97 throws PasswordValidationCallback.PasswordValidationException {
98 PasswordValidationCallback.PlainTextPasswordRequest plainTextRequest =
99 (PasswordValidationCallback.PlainTextPasswordRequest) request;
100 try {
101 Authentication authResult = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
102 plainTextRequest.getUsername(), plainTextRequest.getPassword()));
103 if (logger.isDebugEnabled()) {
104 logger.debug("Authentication success: " + authResult.toString());
105 }
106 SecurityContextHolder.getContext().setAuthentication(authResult);
107 return true;
108 }
109 catch (AuthenticationException failed) {
110 if (logger.isDebugEnabled()) {
111 logger.debug("Authentication request for user '" + plainTextRequest.getUsername() + "' failed: " +
112 failed.toString());
113 }
114 SecurityContextHolder.clearContext();
115 return ignoreFailure;
116 }
117 }
118 }
119
120 }