I fully agree.
The simplest bridge would be to solve key based authentication schemes
outside JAAS and then simply create a JAAS context without doing further
authentication. This especially works well with how ws security is
designed right now.
A better though more complicated way is like you described to let a JAAS
module do the authentication of the token or certificate. This approach
would allow the user more flexibility by adding custom checks to the
JAAS config.
Perhaps a way to achieve this is to simply add JAAS support directly to
WS Security. So from cxf side we would simply configure ws security and
after it has done its processing we have a fully populated JAAS context.
Support for container based authentication is quite similar to ws
security in that regard. The simplest bridge is to let the container do
the authentication and on CXF side just create a JAAS security context
by populating the prinicples. The more advanced case would be to let the
container establish the full JAAS context.
So in both cases we should work with the respective communities to
ideally let them do all the JAAS authentication for us.
Christian
On 13.07.2014 16:21, Andrei Shakirin wrote:
Hi Christian,
I find your ideas great, IMO it will be the step in the right direction. The
JAAS helps to cleanly decouple authentication/authorization logic from business
code.
Some thoughts regarding that:
1. Authentication
Authentication scenarios can be collected in two large groups:
a) Service receives client credentials with request and it is
responsibility either of custom code or container to authenticate the user.
For example: usernameToken, basic and digest authentication, SSL with
client authentication, etc.
b) Client firstly communicates with some security server validating client
credentials and issuing security token. Client injects this token into the
request. Service validates the token (by sending request to security server or
itself). Samples are SAML token authentication, OAuth, Kerberos.
Group (a) fits very good to JAAS concept, it is necessary: extract credentials
from appropriate source (UT, AuthroizationPolicy, etc) depending on
authentication mode, create CallbackHandler and invoke login context.
Configured JAAS Login Modules will be used to authenticate user, create Subject
and Principles. Most of this is already implemented in JAASLoginInterceptor.
Group (b) is a bit tricky, because user is authenticated by security server and
service should just validate the token. In this case JAAS Login Module can
either take over token validation and fill Subject Principles based on token
attributes (like Kerberos does) or skip validation step (if it is already done
by CXF interceptors) and create Subject with Principles.
2. Authorization
IMO the task fit good for JAAS is mapping user to role and creating Role
Principles. Other authorization steps is either technology or container
specific: using security annotations, container configuration, role-method
maps, etc.
By the way, JEE 6 introduced some extensions for JAAS in Java Specification
Request 196 (http://docs.oracle.com/cd/E19575-01/820-3740/ghcwf/index.html). It
is more message processing oriented, introduces agents for validating security
tokens or signatures and determines a standard way to obtain user principals
and group principals. The JSR is primarily designed for JEE application
servers, but perhaps it makes sense to look in and use some ideas/API from that.
Regards,
Andrei.
--
Christian Schneider
http://www.liquid-reality.de
Open Source Architect
http://www.talend.com