Just realized I did not CC tp dev when replying to Dan the other day :

Hi Dan

On Fri, Apr 9, 2010 at 2:50 PM, Daniel Kulp <dk...@apache.org> wrote:

>
> My main "concern" with the implementation of this is that it's done as a
> direct subclass of the WSS4JInInterceptor and thus not really usable by the
> policy based endpoints as those interceptors subclass WSS4JInInterceptor as
> well.
>
> I think the better approach may be to add a flag to wss4j (I can help
> commit
> changes there if needed) to have it not do any UserName token processing at
> all.   (aside:  this may be doable without changes to wss4j by registering
> our
> own "do nothing processor")    Then, have another interceptor that runs
> after
> the WSS4JInInterceptor that would actually handle the UsernameToken and
> verify
> anything it needs and such.
>

This sounds like a very good idea, I agree the proposed approach won't do
for the cases where policies drive the
creation of interceptors.

Having said that, I think the abstract utility interceptor extending
WSS4JInInterceptor
may still be used in cases where users start from manually configuring jaxws
endpoints. In these cases they'd need to
list up to 3 interceptors (the one which extends
AbstractWSS4JSecuriyContextInterceptor, the authorizing interceptor if the
authorization is needed plus may be a SAAJ one) but otherwise, when say a
clear text password has been encrypted, they'd still need to specify
WSS4JInInterceptor (with a flag disabling UsernameToken checks) plus
UsernameTokenInterceptor, etc.

At the moment AbstractWSS4JSecuriyContextInterceptor is a bit complicated
due to the fact it blocks the WSS4J digest checks and thus also creates a
security engine per every request, but it all will be gone in due time...


>
> To be honest, I WANT to do this for the Policy based stuff anyway.   There
> is
> currently some duplicated code between the PolicyBasedWSS4JIinInterceptor
> and
> the new UsernameTokenInterceptor that could be eliminated by having the
> PolicyBasedWSS4JIinInterceptor not do UsernameTokens at all and delegate
> that
> completely to the UsernameTokenInterceptor.
>

What I will do is I will experiment with the test you added (thanks :-)) and
see how UsernameTokenInterceptor can be refactored
so that a subclass can get an easy access to password, nonce, etc. I think I
will need to come up with a contextual property so that a custom
UsernameTokenInterceptor can be installed if needed. Or may be
UsernameTokenInterceptor can store the details in a message to be later
retrieved and processed for creating SecurityContext - but I'm not sure
about it just yet.


>
> Basically, it would be good if the WSS4JIn* stuff just handled the
> encryption/signature stuff and then let the authorization validations stuff
> to
> later interceptors.   That would include things like key validation
> checking
> and stuff as well.  Probably SAML token validation as well.
>
>
sounds good

cheers, Sergey

On Fri, Apr 9, 2010 at 2:50 PM, Daniel Kulp <dk...@apache.org> wrote:

>
> My main "concern" with the implementation of this is that it's done as a
> direct subclass of the WSS4JInInterceptor and thus not really usable by the
> policy based endpoints as those interceptors subclass WSS4JInInterceptor as
> well.
>
> I think the better approach may be to add a flag to wss4j (I can help
> commit
> changes there if needed) to have it not do any UserName token processing at
> all.   (aside:  this may be doable without changes to wss4j by registering
> our
> own "do nothing processor")    Then, have another interceptor that runs
> after
> the WSS4JInInterceptor that would actually handle the UsernameToken and
> verify
> anything it needs and such.
>
> To be honest, I WANT to do this for the Policy based stuff anyway.   There
> is
> currently some duplicated code between the PolicyBasedWSS4JIinInterceptor
> and
> the new UsernameTokenInterceptor that could be eliminated by having the
> PolicyBasedWSS4JIinInterceptor not do UsernameTokens at all and delegate
> that
> completely to the UsernameTokenInterceptor.
>
> Basically, it would be good if the WSS4JIn* stuff just handled the
> encryption/signature stuff and then let the authorization validations stuff
> to
> later interceptors.   That would include things like key validation
> checking
> and stuff as well.  Probably SAML token validation as well.
>
> Dan
>
>
> On Thursday 08 April 2010 12:09:24 pm Sergey Beryozkin wrote:
> > Hi David
> >
> > thanks for the comments...
> >
> > On Wed, Apr 7, 2010 at 9:41 PM, David Valeri <dval...@apache.org> wrote:
> > > Sergey,
> > >
> > > I think this type of functionality would be very useful to a number of
> > > folks.  I have built two similar capabilities for clients very recently
> > > using CXF and Spring Security.  Based on the code provided below, I
> have
> > > several points that I would like to see addressed in a solution.
> > >
> > > 1) Architecture to support more than just UsernameTokens.  I have
> worked
> > > with systems that need to authenticate a user using UsernameTokens,
> > > BinarySecurityTokens, SAML Assertions, and a combination of more than
> one
> > > of
> > > these at a time.
> >
> > Supporting UsernameTokens is the initial requirement. At the moment I do
> > not even know how BinarySecurityTokens or SAML Assertions are
> > processed/validated in CXF or WSS4J.
> >
> > > For the most part, WSS4J simply validates the structural
> > > details of security.  That is, signature validity, trust chaining of
> > > digital
> > > certificates, etc.  As Glen pointed out with his reference to
> > > https://issues.apache.org/jira/browse/WSS-183, WSS4J sometimes
> performs
> > > its
> > > own password checking (authentication).  Unfortunately, WSS4J doesn't
> > > provide hooks for authenticating other forms of credentials that I have
> > > listed above (I don't consider trust to be equivalent to
> authentication).
> > > It would be best if the authentication interface supported multiple
> > > credential types and allowed for authentication to be performed in a
> > > single location in the same manner every time (not sometimes in the
> > > WSS4J callback and sometimes in another interceptor for non-UT based
> > > credentials).
> >
> > Makes sense. Assuming it is WSS4J which validates (the structure of)
> > BinarySecurityTokens then
>  AbstractWSS4JSecurityContextProvidingInterceptor
> > can also implement a processor for BinarySecurityTokens and delegate to
> > subclass to authenticate and setup a subject. Some extra methods will
> need
> > to be added, to be optionally overridden.
> >
> > If it is not only WSS4J which is involved then perhaps another option is
> to
> > store (from WSS4J callback handler, etc) relevant details such username
> > token details, etc to be acted upon by other interceptors.
> >
> > > That
> > > last bit there means disabling WSS4J's password authentication since it
> > > gets
> > > in the way of doing it later in our own interceptor.
> >
> > AbstractWSS4JSecurityContextProvidingInterceptor does it now by
> > implementing a simplified UsernameTokenProcessor
> >
> > > 2) Allow for end-user flexibility in choosing the credentials they want
> > > to authenticate.  For instance, each user is going to have their own
> > > security profiles and authentication requirements.  For instance, a
> > > message contains a UT for a portal user and a digital signature from
> the
> > > portal (I know using
> > > a SAML Assertion would be better here, but people still do it this
> way).
> > > Each organization will have different requirements as to which
> > > credentials get authenticated and what needs to end up in the security
> > > context.
> >
> > I suppose AbstractWSS4JSecurityContextProvidingInterceptor subclasses
> > should be able to do it, for username tokens and other tokens later on.
> >
> > > 3) Decouple the authentication interface from WSS4J.  What is passed in
> > > needs to be abstracted enough that it can work with other WS-Security
> > > libraries as well.
> >
> > the only WSS4J class which is leaked at the moment is
> WSSecurityException.
> > Perhaps we can come up later on with a different more generic approach
> > which does not depend on WSS4J at all. As Dan indicated, in some cases
> > WSS4JInInterceptor is not even used, so that case will need to be
> > addressed. Experimenting wuth binary tokens might help with identifying
> > another solution.
> >
> > > 4) It would be nice to be able to perform authorization using something
> > > like
> > > Spring Security at the service operation level.  With a POJO or JAX-WS
> > > based
> > > service, one can just use Spring Security's method interceptor to
> provide
> > > such security; however, in situations where one only has a WSDL based
> > > service or a provider style service, a method interceptor can't be
> used.
> > >
> > >  It
> > >
> > > would be nice to provide a hook into Spring Security to allow end-users
> > > to specify role based authorization policy based on a combination of
> > > interface,
> > > instance, and operation names.  It seems like your
> > > AbstractAuthorizingInterceptor and SimpleAuthorizingInterceptor are
> > > looking in this direction, but I think it would be best if we can stand
> > > on the shoulders of the Spring Security giant as much as possible so
> > > that we can take advantage of their rich authorization manager, voter,
> > > XML
> > > configuration
> > > capabilities.
> >
> > Not sure what to say here yet. But I think non-Spring users should be
> taken
> > care of too. Or when simpler cases are dealt with then perhaps there's no
> > need to bring in Spring security. Perhaps the utility authorization
> > interceptors should just not be used when Spring Security is preferred ?
> >
> > > 5) Try not to leave the ServiceMix CXF-BC out in the cold.  The CXF-BC
> > > currently has a limited capability to select the credentials to
> > > authenticate
> > > and would benefit from 1 and 2 above.  The CXF-BC ultimately delegates
> > > authentication to the JBI container through a ServiceMix components
> > > authentication service abstraction of JAAS.  Whatever solution we have
> > > for 1
> > > and 2 would help out the component if the ServiceMix authentication
> > > service abstraction could be wired up in lieu of whatever we provide
> out
> > > of the box.
> >
> > I'm not planning to contribute to ServiceMix. I agree though that an
> ideal
> > solution will meet multiple requirements
> >
> > thanks, Sergey
> >
> > > -----Original Message-----
> > > From: Sergey Beryozkin [mailto:sberyoz...@gmail.com]
> > > Sent: Wednesday, April 07, 2010 10:11 AM
> > > To: dev@cxf.apache.org
> > > Subject: Using WS-Security UsernameToken to authenticate users and
> > > populate SecurityContexts
> > >
> > > Hi
> > >
> > > I've been looking recently at extending the CXF WS-Security component
> > > such that a current UsernameToken could be used by custom interceptors
> > > to authenticate a user with the external security systems and, if
> > > possible, provide enough information for CXF to populate a
> > > SecurityContext [1] to be used later on for
> > > authorization decisions.
> > >
> > > Here is the approach I've taken so far.
> > > A custom interceptor extends
> > > AbstractWSS4JSecurityContextProvidingInterceptor [2] and the only
> method
> > > it overrides is
> > >
> > > abstract Subject createSubject(String name, String password, boolean
> > > isDigest,
> > >
> > >                                    String nonce,
> > >                                    String created) throws
> > >
> > > WSSecurityException;
> > >
> > >
> > > For example, see [3].
> > >
> > > The idea here is that a custom interceptor interfaces whichever way it
> > > needs
> > > to with the external system and populates a Subject following this
> simple
> > > rule : first Subject principal is the current user (identified by a
> > > 'name' argument), followed by one or more Groups this user is a member
> > > of. AbstractWSS4JSecurityContextProvidingInterceptor will use this
> > > Subject to provide a functional SecurityContext instance.
> > >
> > > This is the first part, next is how to utilize a SecurityContext and
> get
> > > the
> > > expected roles associated one way or the other with a current method to
> > > be invoked. There's a number of usual options available here, perhaps
> > > even SpringSecurity can be used now that SecurityContext is available,
> > > or application code or other custom CXF interceptor can check the known
> > > roles against SecurityContext.
> > >
> > > I've also added AbstractAuthorizingInInterceptor interceptor which
> custom
> > > interceptors can override and return a list of expected roles given a
> > > (service) Method to be invoked upon, AbstractAuthorizingInInterceptor
> > > will then ask available SecurityContext to match the roles; one
> concrete
> > > implementation is SimpleAuthorizingInterceptor[5], it can be injected
> > > with a
> > > method specific or class (applying to all methods) roles. Another
> > > implementation which I will likely add later on will be injected with a
> > > name
> > > of annotation such as RolesAlloved and it will introspect a method and
> > > its class.
> > >
> > > Note that I haven't looked into the case when a policy runtimes adds
> the
> > > interceptors yet (as opposed to interceptors being configured form
> > > Spring/programmatically). I think an optional contextual property will
> > > need to be setup in such cases for users be able to indicate that say
> an
> > > interceptor such as [3] has to be used as opposed to
> WSS4JInInterceptor,
> > > etc.
> > >
> > > I'm going to validate this approach with JBoss CXF. If you have any
> > > comments
> > > then please let me know.
> > >
> > > I think we may have a simpler alternative eventually to the way
> > > authorization decisions are made. [1]-[3] is specific to ws-security,
> but
> > > [4]-[5] is not
> > >
> > > cheers, Sergey
> > >
> > > [1] https://issues.apache.org/jira/browse/CXF-2754
> > > [2]
> > >
> > >
> http://svn.apache.org/repos/asf/cxf/trunk/rt/ws/security/src/main/java/or
> > > g/a
> > >
> > >
> pache/cxf/ws/security/wss4j/AbstractWSS4JSecurityContextProvidingIntercep
> > > tor<
> http://svn.apache.org/repos/asf/cxf/trunk/rt/ws/security/src/main/jav
> > >
> a/org/a%0Apache/cxf/ws/security/wss4j/AbstractWSS4JSecurityContextProvidi
> > > ngInterceptor> .java
> > > [3]
> > >
> > >
> http://svn.apache.org/repos/asf/cxf/trunk/rt/ws/security/src/test/java/or
> > > g/a
> > >
> pache/cxf/ws/security/wss4j/SimpleSubjectCreatingInterceptor.java<http:/
> > > /
> svn.apache.org/repos/asf/cxf/trunk/rt/ws/security/src/test/java/org/a%0A
> > > pache/cxf/ws/security/wss4j/SimpleSubjectCreatingInterceptor.java> [4]
> > >
> > >
> http://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apach
> > > e/c
> > > xf/interceptor/security/AbstractAuthorizingInInterceptor.java<
> http://svn
> > > .
> apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apache/c%0Axf/i
> > > nterceptor/security/AbstractAuthorizingInInterceptor.java> [5]
> > >
> > >
> http://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apach
> > > e/c
> > > xf/interceptor/security/SimpleAuthorizingInterceptor.java<
> http://svn.apa
> > >
> che.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apache/c%0Axf/inter
> > > ceptor/security/SimpleAuthorizingInterceptor.java>
>
> --
> Daniel Kulp
> dk...@apache.org
> http://dankulp.com/blog
>

Reply via email to