Hi,

In your interceptor you can save the authentication parameter in message, and in your impl class you can have code like

@Resource
    private WebServiceContext wsContext;

Then can use code like
            MessageContext ctx = wsContext.getMessageContext();
Message message = ((WrappedMessageContext)ctx).getWrappedMessage(); //here you can get authentication parameter you saved previously from message

Freeman
On 2012-4-13, at 下午9:48, shashi wrote:

Hi,

I am learning to develop a web service using cxf with spring framework. I
have developed a sample  authenticated web service application using
interceptors and I am stuck in passing authentication parameter(username and
password) to service class which implements the interface.

Web service code is as follows.

Student class:
public class Student {
 private String name;
 public String getName() {
   return name;
 }
 public void setName(String name) {
   this.name = name;
 }
}

Interface:
@WebService
public interface ChangeStudentDetails {
 Student changeName(Student student);
}

Implementation:
@WebService(endpointInterface = "com.student.ChangeStudentDetails")
public class ChangeStudentDetailsImpl implements ChangeStudentDetails {
   public Student  changeName(Student student) {
     student.setName("Hello "+student.getName());
      return student;

   }


Interceptor class:
public class WSSecurityInterceptor extends AbstractPhaseInterceptor<Message>
{

   public SVWSSecurityInterceptor() {
       super(Phase.PRE_PROTOCOL);
   }

   public SVWSSecurityInterceptor(String s) {
       super(Phase.PRE_PROTOCOL);
   }

   public void handleMessage(Message message) throws Fault {

       Map props = new HashMap();
       props.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
       CallbackHandler callbackHandler = (CallbackHandler)
SpringApplicationContextProvider.getInstance().getBean("handler");
       props.put(WSHandlerConstants.PW_CALLBACK_REF, panPassCallback);
WSS4JInInterceptor wss4jInHandler = new WSS4JInInterceptor(props);
       message.getInterceptorChain().add(new SAAJInInterceptor());
       message.getInterceptorChain().add(wss4jInHandler);

   }
}

Callback handler class:
public class CallbackHandler implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
String uname= pc.getIdentifier();
String upassword=pc.getPassword();

if (uname != null ) {

           List<GrantedAuthority> authorities =
testmethod.getAuthorities(user, instance);
            authorities.addAll(authorities);
            UsernamePasswordAuthenticationToken result = new
UsernamePasswordAuthenticationToken(uname, upassword, authorities);
SecurityContextHolder.getContext().setAuthentication(result);
       }
   }
}

While debugging the application the workflow was as follows Interceptor
class->callback handler->service class(ChangeStudentDetailsImpl)

Suppose if I want to pass the username and password to service class for additional verification of username(username and password are obtained in
callback handler). How do I do this?

What is the best way to pass the authentication credentials to service
class?

Any suggestion would be great.

Thank you
shashi



--
View this message in context: 
http://cxf.547215.n5.nabble.com/how-to-pass-authentication-credentials-to-service-class-in-cxf-webservice-tp5638346p5638346.html
Sent from the cxf-issues mailing list archive at Nabble.com.

---------------------------------------------
Freeman Fang

FuseSource
Email:[email protected]
Web: fusesource.com
Twitter: freemanfang
Blog: http://freemanfang.blogspot.com
http://blog.sina.com.cn/u/1473905042
weibo: http://weibo.com/u/1473905042










Reply via email to