-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Jason,

On 8/6/2009 8:33 AM, Jason Royals wrote:
> Thanks for the advice, but I think <security-role-ref> is only valid
> within the context of a <servlet> element though? As such, it wont work
> on JSP's or other resources that might do a
> request.isUserInRole("admin") but are not servlets themselves (such as
> filters and listeners).

You might be able to get away with re-defining the JSP Servlet and
including the <security-role-ref>, but you're right: that won't cover
filters or listeners. It's a shame the spec is written in this way.

As for André's comment about the top-levelness of <security-role-ref>,
Chuck points out that it's <servlet>-specific, but does not say where
that is defined. I found it very quickly by looking at the 2.3 servlet
DTD (http://java.sun.com/dtd/web-app_2_3.dtd) which contains this
documentation:

"
<!--
The security-role-ref element contains the declaration of a security
role reference in the web application's code. The declaration consists
of an optional description, the security role name used in the code,
and an optional link to a security role. If the security role is not
specified, the Deployer must choose an appropriate security role.

The value of the role-name element must be the String used as the
parameter to the EJBContext.isCallerInRole(String roleName) method
or the HttpServletRequest.isUserInRole(String role) method.

Used in: servlet

- -->
<!ELEMENT security-role-ref (description?, role-name, role-link?)>
"

Searching for actual uses of security-role-ref confirms that it is only
valid within a <servlet> element. :(

> I'd also like to avoid changing anything in
> web.xml if possible. Configuring the container is fine (eg, server.xml)
> but messing around too much in the application WAR package could be
> trouble.

I know you mentioned you don't want to mess around with web.xml but I
think you'll probably have to do it. If you're willing to do that, you
could write a filter that wraps the request and overrides isUserInRole
to provide a look-up-table of mapped group names. Something like this:

public class GroupRenamingFilter
   implements Filter
{
   private Map roleNameMap; /* fill this yourself */

   public void invoke(ServletRequest request, ServletResponse,
FilterChain chain)
   {
      if(request instanceof HttpServletRequest)
        request = new GroupRenamingRequest((HttpServletRequest)request);

      chain.doFilter(request, response)
   }

   private class GroupRemaningRequest
     extends HttpServletRequestWrapper
   {
      public GroupRenamingRequest(HttpServletRequest wrapped)
      {
        super(wrapped);
      }

      public boolean isUserInRole(String roleName)
      {
        String realRoleName = (String)roleNameMap.get(roleName);

        if(null == realRoleName)
          realRoleName = roleName; // not sure what to do, here

        return super.isUserInRole(realRoleName);
      }
   }
}

Now that I've written it, I think you'll need to implement this as a
Valve that is invoked /before/ Tomcat's authorization code runs (which
may not be possible?).

On the other hand, what's wrong with a search-and-replace within the
web.xml to change the names of the security-role names to those you
actually use instead of the more generic "users" and "admins"?

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkp69AUACgkQ9CaO5/Lv0PC6qQCaAi3L37mYx5zBU50GUB675qdJ
dRsAoK6UoU7hpjMjvnNQwFVRLM7TAOOG
=zPlp
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to