Hi Wolfgang,

Thanks much for the great work on this! We should talk to the Axis guys
about what their plans regarding security are -- Dims, Ias? Are you guys
planning on implementing a role-based security model in Axis -- that
e.g. pipes the container security configuration (user, roles) through to
the WebService?

I haven't tried out your code, yet -- just looked at it. I like the fact
that it's pretty much separate from the rest of the WSM implementation,
integrated only through the XML (config) file. I'll give it a spin soon.
This way, it can easily be customized and integrated when needed.

It's awesome to have support for security extensions in WS running on
Tomcat/Axis! :) Since the security annotations are also particularly
interesting (since mandatory) for the JSR-109-type deployment scenario,
we should try to make as few assumptions about the runtime as possible.
Maybe we can come up with an abstraction layer once we gathered some
experience with the whole security model. The Axis model could implement
such an abstract interface. Comments, ideas anyone?

Cheers,

-michael


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
Sent: Monday, October 25, 2004 10:14 AM
To: [email protected]
Cc: Michael Merz; Jonathan Colwell
Subject: @SecurityIdentity, @SecurityRoles

Hi Michael and Jonathan,

I've not forgot about @SecurityRoles stuff, but been think how 
to integrate @SecurityXXX annotation with Tomcat/Axis's security 
model.

The section "Authenticating the caller" of Axis's Web Service 
Security page ( http://ws.apache.org/axis/java/security.html ) 
states "Note that Axis does not yet integrate with the servlet 
API authentication stuff."

I think the integration will never be implemented unless the 
securiy model of servlet spec is changed.

All authentication/authorization stuff of servlet container is 
done in the container itself.
There's no way for servlets to get involved in the
 authentication/authorization process of the servlet container.

Exactly same thing happens to Axis since Axis is just a servlet 
so that it's impossible for Axis to be integrated with the servlet 
API authentication.
Thus, Axis has its own security mechanism using users.lst and 
perm.lst.
As long as I investigated, the security model of Axis is 
user-based.
The users.lst holds username/password combinations.
The perms.lst holds username/action( which is allowed to be 
invoked by the username)

We have two choices to build the security model.
One is just to use Axis's users.lst. (user-based)
The other is to make our(Beehive) own role-based security model.
(probably we can make a file like tomcat-users.xml and read 
username/password and roles out of the file.)

The advantage of the former one is that the current Axis users 
can reuse thier users.lst file.
The disadvantage is that it's user-based authorization and 
always sticks with Axis.

The advantage of the latter one is that role-based authorization 
and can be used with a web service container other than Axis.
The disadvantage is that it required for admin to maintain two 
username list files. ( Axis's one and Beehive's one ) It's kinda 
troublesome for developers and admins.

I've implemented with the former one. (Attached on this email)
The file, WsmAuthenticationHandler.java, resides in 
the wsm/src/runtime/org/apache/beehive/wsm/axis/handlers directory.
( Please create a "handlers" directory under the "axis" directory )

To enable the security, please follow the procedures below.

1. Adding <handler
type="java:org.apache.beehive.wsm.axis.handlers.WsmAuthenticationHandler
"/>
element between <handler
type="java:org.apache.beehive.wsm.axis.DropInDeploymentHandler"> 
element and <handler type="java:org.apache.axis.handlers.JWSHandler">
element
in the server-config.wsdd. ( I think the order is not that important
though. )

2. Creating a users.lst file in AnnotatedAxis/WEB-INF directory.
File can be like this. ( Don't need hyphens )
---------------
wolfgang mypass
michael yourpass
---------------

3. Modifying AddressBookWebService.jws like below.

@WebService( targetNamespace="http://www.beehive.com/AddressBook";)
@SecurityRoles(rolesAllowed={"wolfgang"})
public class AddressBookWebService implements AddressBook {
.....
@WebMethod
@SecurityRoles(rolesAllowed={"michael"})
public void addEntry(String name, Address address) throws
RemoteException {
    addressBook.addEntry(name, address);
}
.....
@WebMethod
public Address getAddressFromName(String name) throws RemoteException {
    return addressBook.getAddressFromName(name);
}

4. In client side, use the wsdl2java tool to generate java files.

This is snippet of my client code.

binding =
(com.beehive.www.AddressBook.AddressBookWebServiceSoapBindingStub)
new
com.beehive.www.AddressBook.AddressBookWebServiceServiceLocator().getAdd
ressBookWebService();
binding.setUsername("wolfgang");
binding.setPassword("mypass");
binding.addEntry("Nick",new Address());

The user "wolfgang" can invoke all methods.
The user "michael" can invoke ony addEntry method.
The getAddressFromName method is allowed to be invoked by only user
"wolfgang".
( This is because even though the getAddressFromName method is not
annotated with
 @SecurityRoles, the CLASS is annotated with @SecurityRoles(
rolesAllowed={"wolfgang"}) )

If user "michael" trys to invoke the getAddressFromName method,
(401)Unauthorized 
exception will be thrown.

@SecurityRoles.rolesReferenced and @SecurityIdentity are not implemented
yet.
How can we use these annotations with web service ?
@SecurityRoles.rolesReferenced can be used with servlets if role is
hardcoded like 
below in the source of servlet and allow admin/deployer to change role
to access 
the servlet.

doGet(HttpServletRequest req, HttpServletResponse res )...{
   if( req.isUserInRole("myrole") ){
      ...
   }else{
      ...
   }
}

But it's impossible for web serivce to do like that because web service
don't get 
an interface object such as req object above from web service container.

Can I think about @SecurityIdentity later or when we integrate Beehive
with EJB ?

Thanks in advance.

wolfgang
ps)
To Michael, please don't check in the attachment. I gotta put comments
and might 
need some modification.
Although I said we have two ways for implementing security models above,
I can 
implement both and let developers/deployers choose one out of two.


Reply via email to