[jboss-user] [JBossWS] - EJB3 SessionBean endpoint and security

cboatwright do-not-reply at jboss.com
Fri Sep 22 00:28:04 EDT 2006


I recently [finally] had time to upgrade to Eclipse 3.2 and JBoss 4.0.4 and ejb3 and am prototyping out some Web Services using the "181" way. I did the "HelloWorld" example in the Wiki (http://wiki.jboss.org/wiki/Wiki.jsp?page=JBWS181HelloWorld) and got things working very quickly.

I then saw many examples about how to create an endpoint out of a EJB3 session bean. Again, very easy. Very nice.

However, when I searched for how to setup security, I've run into problems. I added the @SecurityDomain and so forth, but cannot get it to secure and/or a client to authenticate.

My goal is simply: create a Web Service that a client can call with a username and password that the JBoss JAAS container can handle. It appears that this can be done, but I must be missing something simple. I appears you add the "@PortComponent" and "@SecurityDomain" and "@RolesAllowed" annotations and pass in the valid information.

When a client access the Web Service it get an authentication error even though I think I'm passing in the correct username/password. I'm using the defaults (kermit/thefrog in the role "friend").

The EJB3 Stateless Session Bean endpoint:


  | package com.buildlinks.ejb;
  | 
  | import java.rmi.RemoteException;
  | import java.security.Identity;
  | import java.security.Principal;
  | 
  | import javax.annotation.Resource;
  | import javax.annotation.security.RolesAllowed;
  | import javax.ejb.EJB;
  | import javax.ejb.SessionContext;
  | import javax.ejb.Stateless;
  | import javax.jws.WebMethod;
  | import javax.jws.WebService;
  | import javax.jws.soap.SOAPBinding;
  | import javax.naming.Context;
  | import javax.naming.InitialContext;
  | import javax.naming.NamingException;
  | import javax.persistence.Transient;
  | 
  | import org.jboss.annotation.security.SecurityDomain;
  | import org.jboss.ws.annotation.PortComponent;
  | 
  | @EJB(name="HelloWorldBean", description="", beanInterface=com.buildlinks.ejb.HelloWorld.class, beanName="HelloWorldBean")
  | @WebService(name="HelloWorld")
  | @SOAPBinding(style = SOAPBinding.Style.RPC)
  | @PortComponent(authMethod="BASIC", transportGuarantee="NONE", urlPattern="/*", contextRoot="/BuildLinksEjb3")
  | @SecurityDomain("JBossWS")
  | @RolesAllowed("friend")
  | 
  | /**
  |  * @author cboatwright
  |  */
  | public @Stateless class HelloWorldBean implements HelloWorld
  | {
  | 	@Resource
  | 	@Transient
  | 	SessionContext ctx;
  | 	
  | 	public HelloWorldBean()
  | 	{
  | 		System.out.println("HelloWorldBean created");
  | 	}
  | 
  | 	@WebMethod
  | 	public String echoString(String str1, String str2) throws RemoteException
  | 	{
  | 		System.out.println("str=" + str1 + ", str2=" + str2);
  | 
  | 		if (ctx != null)
  | 		{
  | 			Principal caller = ctx.getCallerPrincipal();
  | 			Identity identity = ctx.getCallerIdentity();
  | 			System.out.println("isCallerInRole(friend)=" + ctx.isCallerInRole("friend"));
  | 			System.out.println("caller=" + caller);
  | 			System.out.println("identity=" + identity);
  | 		}
  | 		
  | 		return "Thanks you for sending [" + str1 + "] and [" + str2 + "]";
  | 	}
  | }
  | 

The calling client:

  | package com.buildlinks.client;
  | 
  | import java.net.URL;
  | import java.util.Properties;
  | 
  | import javax.xml.namespace.QName;
  | import javax.xml.rpc.Service;
  | import javax.xml.rpc.ServiceFactory;
  | import javax.xml.rpc.Stub;
  | 
  | import org.jboss.ws.jaxrpc.ServiceFactoryImpl;
  | import org.jboss.ws.jaxrpc.StubExt;
  | 
  | import com.buildlinks.ejb.HelloWorld;
  | 
  | public class WsClientTest
  | {
  | 	public static void main(String[] args)
  | 	{
  | 		try
  | 		{
  | 			// http://java.sun.com/j2se/1.4.2/docs/guide/net/properties.html 
  | 			Properties systemSettings = System.getProperties();
  | 			systemSettings.put("http.basic.username", "kermit");
  | 			systemSettings.put("http.basic.password", "thefrog");
  | //			systemSettings.put("http.proxyHost", "localhost");
  | //			systemSettings.put("http.proxyPort", "8888");
  | //			systemSettings.put("http.nonProxyHosts", ""); 
  | //			systemSettings.put("http.proxyUserName",username);
  | //			systemSettings.put("http.proxyPassword",password);
  | 			System.setProperties(systemSettings);			
  | 			
  | 			URL url = new URL("http://localhost/BuildLinksEjb3/HelloWorldBean?wsdl");
  | 			QName qname = new QName("http://ejb.buildlinks.com/jaws", "HelloWorldBeanService");
  | 			
  | 			ServiceFactory  factory = ServiceFactoryImpl.newInstance();
  | 			Service service = factory.createService(url, qname);
  | 			
  | 			HelloWorld webServiceProxy = (HelloWorld)service.getPort(HelloWorld.class);
  | 			((Stub)webServiceProxy)._setProperty(StubExt.USERNAME_PROPERTY, "kermit");
  | 			((Stub)webServiceProxy)._setProperty(StubExt.PASSWORD_PROPERTY, "thefrog");
  | 
  | 			System.out.println("Before");
  | 			String rv = webServiceProxy.echoString("Colin", "Boatwright");
  | 			System.out.println("After");
  | 			
  | 			System.out.println("rv=" + rv);
  | 			
  | 		}
  | 		catch (Exception e)
  | 		{
  | 			e.printStackTrace(System.err);
  | 		}
  | 	}
  | }
  | 
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3973462#3973462

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3973462



More information about the jboss-user mailing list