> -----Original Message-----
> From: David Jencks [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, January 07, 2004 12:42 AM
>
> On Tuesday, January 6, 2004, at 08:48 PM, Alan D. Cabrera wrote:
>
> >
> >
> >> -----Original Message-----
> >> From: David Jencks [mailto:[EMAIL PROTECTED]
> >> Sent: Tuesday, January 06, 2004 10:44 PM
> >>
> >> I'm working to finish up the outbound connector architecture
security
> >> implementation and there are a few things I'm not quite clear on
and
> >> think may have wider relevance. I think the best way to view the
> >> situation is as a login to one security realm from another that the
> >> user is already authenticated in.
> >>
> >> In the outbound connector framework, using container managed
security,
> >> the ConnectionManager (part of the app server, not the resource
> >> adapter) is responsible for providing a Subject containing a single
> >> "Resource Principal" (the use of which I have not yet discerned)
and
> >> the credential for logging into the remote EIS (such as a
database).
> >> For the standard user/password type of db login, this credential is
a
> >> PasswordCredential holding the user name and password needed to log
> > in,
> >> and the ManagedConnectionFactory instance used to create the
> >> connection. The connector spec indicates this Subject should be
> >> generated through use of JAAS LoginModules. The LoginModule can
> > either
> >> actually authenticate the credentials itself or simply create a
> > Subject
> >> with some credentials and rely on the EIS to do the actual
> >> authentication. This Subject is then passed to the resource
adapter
> > to
> >> use in creating a new connection, matching existing connections, or
> >> reauthenticating an existing connection.
> >>
> >> I think a similar scheme may be appropriate for generating
credentials
> >> for calling ejbs in a different server. There may also be other
uses
> >> for such a scheme.
> >>
> >> Anyway, lets consider how the contents of the new Subject can be
> >> derived. Basically, they can be regarded as mapped from the
security
> >> context of the realm the calling application is operating in.
There
> >> are several choices for this mapping:
> >>
> >> 1. "Configured Identity". No matter who the caller is, you always
get
> >> the same resource principal and credentials (user/pw).
> >>
> >> 2. "Caller Impersonation". The resource principal is the same as
the
> >> caller, and the credentials are the same as the caller. For
instance,
> >> the username/password you log into the app with are those used to
log
> >> your connections into the database.
> >>
> >> 3. Principal and Credential Mapping. Some algorithm is used (such
as
> >> looking up in some kind of table or map or service) to find the
> >> principal and credentials for the constructed Subject from those of
> > the
> >> caller.
> >>
> >> --------------------------
> >> Implementation proposal/notes
> >>
> >> It's necessary to get the "previous" security info. I think the
way
> > to
> >> do this is from the previously logged in Subject. It appears this
is
> >> available from ContextManager.peekContext().getSubject(). At the
> >> moment I don't see any reason or possibility to push the generated
> >> Subject on the stack in ContextManager (for instance, there is no
> >> access control context AFAIK).
> >
> > I agree and got rid of it.
> Not yet committed? Is there anywhere to get the current subject
from?
> >
> >> (Also, in the future, it may prove
> >> better to include the Subject and AccessControlContext in a
> > generalized
> >> InvocationContext object.)
> >
> > Nice idea. Something like?
> >
> > ContextManager.setContext(subject, key, value);
> > ContextManager.setCaller(subject);
> > Object value = ContextManager.getContext(key);
>
> I was thinking more along the lines of the TransactionContext idea in
> Nova to avoid thread locals. The "environment", what ever that might
> be, would supply something implementing
> setContext(Subject, AccessControlContext)//maybe split up into 2 calls
> getSubject()
> getAccessControlContext()
>
> The EJB invocation object could implement this, and other things could
> also as necessary.
I think that we need the current subject in a static. For example, my
implementation of getCallerPrincipal is:
public static Principal getCallerPrincipal() {
Context context = (Context)
subjectContexts.get(currentCaller.get());
assert context != null : "No registered context";
return context.principal;
}
where currentCaller is a ThreadLocal object. The call to
isCallerInRole() would work in a similar manner. I'm not sure how this
would work if we stored the information in the EJB invocation object.
> >> It will also be necessary to include the authentication info used
to
> >> authenticate the Subject in the Subject as credentials. It appears
> >> this is left out of the current example login modules. I'm assuming
> >> this is an oversight.
> >
> > I had always thought that the credentials that were mentioned in
> > credential mapping would be something generated by the LoginModule,
> > e.g.
> > certs. I think that these are saved in the Subject.
>
> Well, to make what I'm saying concrete, if you want to log into the db
> using the same user/pw as you logged into the app with, you need the
> password you logged into the app with to be available. Right now it's
> not saved in the Subject filled in by either example LoginModule. I
> think they should be.
If I have the user/pw from one realm, how useful would the password be
in the target realm? The only thing I can think of is a mapping a cert
to a cert who's expiration is no more than the original cert.
> >> I propose an interface ConnectorRealm to be implemented by
> >> SecurityRealms used by container managed security for connectors.
It
> >> will have two methods:
> >>
> >> //used to specify the ManagedConnectionFactory used in
> >> PasswordCredentials, and as an mbean endpoint.
> >> void setManagedConnectionFactory(ManagedConnectionFactory
> >> managedConnectionFactory);
> >
> > I'm not sure what ManagedConnectionFactory and PasswordCredentials
have
> > to do with this example.
>
> Having two interfaces/objects is a much better idea. The MCF instance
> has to be included in the PasswordCredential that the resource
adapter
> expects.
> >
> >> //used to "login" and get the Subject for the connector
> >> Subject getSubject();
> >>
> >> getSubject will typically look like this:
> >>
> >> Subject getSubject() {
> >> Subject contextSubject =
ContextManager.peekContext().getSubject();
> >> //this callback handler extracts user/password from the supplied
> >> subject
> >> CallbackHandler callbackHandler = new
> >> SubjectUserPasswordCallbackHandler(contextSubject);
> >> Subject returnedSubject = new Subject();
> >> LoginContext loginContext = new LoginContext(this.realm,
> >> returnedSubject, callbackHandler);
> >> loginContext.login();
> >> return returnedSubject;
> >> }
> >>
> >> The LoginModule can cooperate with this Realm to map the principal
and
> >> credentials as necessary.
> >
> > I was thinking of something very, very, similar but I was thinking
of a
> > new Bridge Bean:
> >
> > Subject mapSubject(Subject subject) {
> > }
>
> How about calling this interface RealmBridge? Do you think it
deserves
> a package of its own, maybe o.a.g.security.bridge? With this model
> the mappings aren't specific to resource adapters, so I'd be happy to
> put them in the security module.
Neat idea. I think it should go in o.a.g.security for now, until the
number of patterns get really large.
> > I was trying to shy away from having the SecurityRealm do all things
> > for
> > all situations. Also, a mapping may be very specific between two
types
> > of realms. I don't think it's a good idea to put all that nxm
mapping
> > information in a security realm. I was thinking, what if I don't
have
> > access to the code for a Security realm, e.g. from a 3rd party
vendor,
> > I
> > could use my Bridge Bean to do the mapping.
>
> So in your model the BridgeBean and/or the CallbackHandler do the
> mapping? Indeed, that provides a better separation of concerns. I've
> been slightly confused because the login modules/ realms I've been
> thinking of just fill in a subject, they don't actually talk to the
EIS
> to validate them. Having the mapping outside of the realm certainly
> allows for other realms/login modules that actually do something.
> >
> >> Presumably the realm can cache the contextSubject to
returnedSubject
> >> map to speed up calls.
> >>
> >>
> >> I'd really appreciate comments on this.
> >>
> >> -------------------
> >> As mentioned before, I think a similar process could be appropriate
> > for
> >> determining who the caller is and what their credentials are when
> >> calling from one ejb application to another, especially from one
> > server
> >> to another.
> >
> > I was thinking the same thing. Maybe it could be used for the CORBA
> > interoperability part of the ejb spec also.
>
> I haven't looked at that part yet:-)
You better get crackin' :p
Regards,
Alan