Yeah, Dan is correct, create a interceptor after WSS4JIn and there's actually an X509Certificate created already.

In new created interceptor you can do something like

List<Object> results = (Vector<Object>)message.get(WSHandlerConstants.RECV_RESULTS);
            if (results == null) {
                return;
            }
            for (Iterator iter = results.iterator(); iter.hasNext();) {
                WSHandlerResult hr = (WSHandlerResult) iter.next();
                if (hr == null || hr.getResults() == null) {
                    return;
                }

for (Iterator it = hr.getResults().iterator(); it.hasNext();) { WSSecurityEngineResult er = (WSSecurityEngineResult) it.next();
        
if (er != null && er.getCertificate() instanceof X509Certificate) {
                              X509Certificate cert = er.getCertificate();
                             //now you get X509Certificate you want
                          }
                        }

            }
Freeman
On 2010-12-18, at 上午5:54, Daniel Kulp wrote:


Colm might be the better one to answer this if he's around.

My gut feeling was to add an interceptor just after the WSS4JIn and grab the WSS4J results from the message and find the X509 stuff in there. There likely might already be an X509Principal created that you would just need to
authenticate.

Dan


On Friday 17 December 2010 10:50:33 am Juan Pedro Silva Gallino wrote:
Sorry, I had to resend as it got pulled into a different thread.
Below is the message.

Hi everybody. As always, let me first congratulate you on what a good
piece of software CXF is.
Now, on the subject that brings me here, I was able to secure my web
services in quite a straight forward way with the available documentation.
I'm using a org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor for
validating timestamps, signatures, and encryption. Now I'm trying to use
Spring Security (former Acegi) for authorization.

This is not a new topic, I've found quite a few threads of posts on the
subject, most remarkably
http://www.mail-archive.com/[email protected]/msg09944.html (I guess http://code.google.com/p/cxf-spring-security/wiki/Documentation derives from it), but most deal with UsernameToken authentication as opposed to authentication based on X509 certificates. My first guess was to try to
re-implement the same behavior for X509 tokens.
So, I parted from the code of the password callback handler in
http://nikofactory.blogspot.com/2009/10/receta-cxf-wss4j-y-spring-security .
html


public class SecurityInPasswordHandler implements CallbackHandler {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private UserDetailsService userService;

    public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException, AuthenticationException {

        WSPasswordCallback pwdCallback = (WSPasswordCallback)
callbacks[0];

        int usage = pwdCallback.getUsage();
        if ((usage == WSPasswordCallback.USERNAME_TOKEN) || (usage ==
WSPasswordCallback.USERNAME_TOKEN_UNKNOWN)) {
            String password = pwdCallback.getPassword();
            if (usage == WSPasswordCallback.USERNAME_TOKEN) {
                UserDetails userDetails =
userService.loadUserByUsername(pwdCallback.getIdentifier());
                password = userDetails.getPassword();
            }
            Authentication authentication = new
UsernamePasswordAuthenticationToken(pwdCallback.getIdentifier(), password);
            authentication =
authenticationManager.authenticate(authentication); //throws
AuthenticationException

SecurityContextHolder.getContext().setAuthentication(authentication);
            // Return the password to the caller
            pwdCallback.setPassword(password);
        }
    }
}

and figured I would try creating a X509AuthenticationToken instead of a
UN token.
However, to create one I need a ||X509Certificate, and I don't know
where to get one from.

So, my questions would be two:
A) First of all, Is this the correct approach?, or am I missing the big
picture here?
B) If this is the correct way to go, where can I get a X509Certificate
from to create the X509AuthenticationToken?.

Any examples/hints/tips on how to create this wiring would be very much
appreciated!!.
Regards,
                Juan Pedro

--
Daniel Kulp
[email protected]
http://dankulp.com/blog


--
Freeman Fang

------------------------

FuseSource: http://fusesource.com
blog: http://freemanfang.blogspot.com
twitter: http://twitter.com/freemanfang
Apache Servicemix:http://servicemix.apache.org
Apache Cxf: http://cxf.apache.org
Apache Karaf: http://karaf.apache.org
Apache Felix: http://felix.apache.org

Reply via email to