Thanks for the response.  I tried to keep the original post simple, to see if 
there was a known problem with declaring realms in Tomcat.  I've attached the 
most relevant parts of my web-app below.  I included the part of web.xml that 
defines the security constraints; the context.xml contents, which sets up the 
JAASRealm; my LoginModule's commit() method, and the output from Tomcat for the 
full authentication handshake.

I tested the implementation of isUserInRole() by wild-carding the role, to 
force Tomcat to authenticate but not authorize:

    <security-constraint>
        <web-resource-collection>
                <web-resource-name>Velocity templates</web-resource-name>
                <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
                <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>

Then I used a filter to intercept my request check for my roles.  After 
authentication, the request gets to my authorization check, whereby I tested my 
Subject for its Principals:

        boolean test = request.isUserInRole( "landscape" );

After my login module authenticates me, test == true.  However, as you can see 
from the Tomcat debug messages, attached below, Tomcat fails to see that my 
Subject holds the "landscape" Principal, even though a previous message shows 
that this Principal was added to my Subject.

Again, I appreciate any help and will try to add whatever info is asked for.  
As a side note, I wrote my own implementation of the login process, using a 
servlet to hook into my login module, thus avoiding the declarative security.  
However, while this works, I am left with the fact that the user's credentials 
are easily discovered by a misplaced logging message, whereas it's much 
trickier to get the credentials when using Tomcat's implementation.  The real 
pain, though, is that I would have to manage my own mappings between resources 
and roles.

Thanks again for any and all help.


Here's the relevant part to the web.xml (This section is actually much longer 
but I removed all the other url-patterns, as they obfuscated the part that I am 
testing):
<!-- Define Security Constraints -->
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Protected Velocity pages</web-resource-name>
      <url-pattern>/home.vm</url-pattern>
    </web-resource-collection>
    <auth-constraint>
       <role-name>landscape</role-name>
    </auth-constraint>
  </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
                <form-login-page>/login.jsp</form-login-page>
                <form-error-page>/error.jsp</form-error-page>
        </form-login-config>
    </login-config>

        <security-role>
                <description>Role required to see reports</description>
                <role-name>landscape</role-name>
        </security-role>

My context.xml:
<?xml version="1.0"?>

<Context>
        <Realm className="org.apache.catalina.realm.JAASRealm"
           appName="landscape"
           
userClassNames="com.kaleidescape.logdb.webapp.security.auth.UserPrincipal"
           
roleClassNames="com.kaleidescape.logdb.webapp.security.auth.UserGroupPrincipal"
           useContextClassLoader="false" />
</Context>

The JAAS module is not based on a security policy file, I wrote it to work from 
a database.  The login() method calls to my LDAP service provider and 
successfully authenticates me, returning my DN from the Active Directory 
server.  The commit() method of my login module looks like:

   public boolean commit()
        throws LoginException
    {
        if( m_authenticated ) {
            //add the user principal to the subject
            UserCredential usercred = new UserCredential( m_uid );
            m_subject.getPublicCredentials().add( usercred );

            UserPrincipal user = new UserPrincipal( m_username );
            m_subject.getPrincipals().add( user );

            //add the entitlements (i.e., roles) that the user belongs to
            try {
                Set entitlements = AuthUtil.getUserEntitlements( m_username );
                Iterator it = entitlements.iterator();
                while( it.hasNext() ) {
                    Entitlement entitlement = (Entitlement)it.next();
                    UserGroupPrincipal group = new UserGroupPrincipal( 
entitlement.getName() );
                    m_subject.getPrincipals().add( group );
                }
            } catch( KException e ) {
                throw new LoginException( "Error while attempting to retrieve 
group "
                                          + "names from the database." );
            }
        }

        // we can get the username from the <code>Subject</code>, so cleanup 
the reference
        m_username = null;

        return true;
    }

The full debug stack during the login in phase looks like:

2008-05-05 13:08:49,534 7641062 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - JAASRealm login requested for username 
"robin.coe" using LoginContext for application "landscape"
2008-05-05 13:08:50,343 7641871 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Login context created robin.coe
2008-05-05 13:08:52,997 7644525 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - JAAS LoginContext created for username 
"robin.coe"
2008-05-05 13:08:52,999 7644527 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Checking Principal "CN=Robin 
Coe,OU=Active,OU=Users,OU=Kaleidescape,DC=nextnewgig,DC=com" 
[com.kaleidescape.logdb.webapp.security.auth.UserPrincipal]
2008-05-05 13:08:53,000 7644528 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Principal "CN=Robin 
Coe,OU=Active,OU=Users,OU=Kaleidescape,DC=nextnewgig,DC=com" is a valid user 
class. We will use this as the user Principal.
2008-05-05 13:08:53,002 7644530 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Checking Principal "landscape" 
[com.kaleidescape.logdb.webapp.security.auth.UserGroupPrincipal]
2008-05-05 13:08:53,003 7644531 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Adding role Principal "landscape" to 
this user Principal's roles
2008-05-05 13:08:53,004 7644532 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.JAASRealm  - Username "robin.coe" successfully 
authenticated as Principal "{1}" -- Subject was created too
2008-05-05 13:08:53,035 7644563 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Velocity templates]' against GET /index.html --> true
2008-05-05 13:08:53,036 7644564 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Login Page]' against GET /index.html --> false2008-05-05 
13:08:53,037 7644565 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[home]' against GET /index.html --> false
2008-05-05 13:08:53,039 7644567 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Protected Velocity pages]' against GET /index.html --> false
2008-05-05 13:08:53,040 7644568 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Velocity templates]' against GET /index.html --> true
2008-05-05 13:08:53,041 7644569 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Login Page]' against GET /index.html --> false2008-05-05 
13:08:53,042 7644570 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[home]' against GET /index.html --> false
2008-05-05 13:08:53,043 7644571 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Protected Velocity pages]' against GET /index.html --> false
2008-05-05 13:08:53,044 7644572 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   User data constraint has no 
restrictions
2008-05-05 13:08:53,123 7644651 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Velocity templates]' against GET /home.vm --> true
2008-05-05 13:08:53,124 7644652 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Login Page]' against GET /home.vm --> false
2008-05-05 13:08:53,125 7644653 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[home]' against GET /home.vm --> true
2008-05-05 13:08:53,126 7644654 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking constraint 
'SecurityConstraint[Protected Velocity pages]' against GET /home.vm --> false
2008-05-05 13:08:53,127 7644655 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   User data constraint has no 
restrictions
2008-05-05 13:08:53,128 7644656 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  -   Checking roles CN=Robin 
Coe,OU=Active,OU=Users,OU=Kaleidescape,DC=nextnewgig,DC=com
2008-05-05 13:08:53,129 7644657 [http-9808-Processor24] DEBUG 
org.apache.catalina.realm.RealmBase  - No role found:  landscape

-----Original Message-----
From: Caldarale, Charles R [mailto:[EMAIL PROTECTED]
Sent: Monday, May 05, 2008 1:24 PM
To: Tomcat Users List
Subject: RE: JAAS authenticated user fails authorization check

> From: Robin Coe [mailto:[EMAIL PROTECTED]
> Subject: JAAS authenticated user fails authorization check
>
> However, when I declare a protected resource declaratively,
> and specify that the resource is protected with "rolename",
> Tomcat fails to authorize the user for that resource.

Post your web.xml for the webapp, since this works fine for everyone
else and we need to see what you really have configued.  Also post the
relevant parts of server.xml so we can see how the realm is set up.
Finally, what file does the system property
java.security.auth.login.config point to and what are the contents of
that file?

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY
MATERIAL and is thus for use only by the intended recipient. If you
received this in error, please contact the sender and delete the e-mail
and its attachments from all computers.

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to