BlazeDS, Spring, and Acegi Security - Part 3

Update: The “start”-method-not-getting-called bug is now a filed in the adobe bug tracker: http://bugs.adobe.com/jira/browse/BLZ-190

This post is another baby step in getting acegi/spring security and blazeds to work together. The whole purpose of these exercises is to for acegi to handle authentication/authorization and destination security. Even bypassing container security.

In the last part I talked about how I was stumped by the LoginCommand and how the “start” method is never called. The reason I want the start method to be called is so that I am passed a ServletConfig and from there I can get access to the ServletContext, and thereby access to the Spring WebApplicationContext but unfortunately this method never seems to get called. I traced the BlazeDS source in SVN, not very thoroughly I should admit, and never found a spot where the start method gets called.

That’s not such a big deal because I can get access to the ServletContext by using the FlexContext singleton. I’m not generally a fan of singletons but what the hell; if it gets it to work =p

Anyway, here’s a brief outline of my AcegiLoginCommand, which extends AppServerLoginCommand:

.. class AcegiLoginCommand extends AppServerLoginCommand …

public AcegiLoginCommand() {
    initAuthenticationManager();
}

private void initAuthenticationManager()
{
    ServletContext servletContext = FlexContext.getServletContext();
    String beanId = servletContext.getInitParameter("loginCommandBean");

    if (beanId == null) {
        beanId = "authenticationManager";
    }

    WebApplicationContext context =
        WebApplicationContextUtils.getWebApplicationContext(servletContext);

    authenticationManager = (AuthenticationManager)context.getBean(beanId);

    if (authenticationManager == null) {
      throw new RuntimeException("AuthenticationManager could not be found.  Tried beanId='"+ beanId+"'");
    }
}

The LoginCommand needs access t othe authenticationManager so that it can pass it call the manager’s “authenticate” method. To make it more configurable, I added a little bit of code that will get the bean name from a web.xml init-parameter.

Finally, my “doAuthentication” method looks like this:

public Principal doAuthentication(String username, Object password) {
  Authentication authentication =
        new UsernamePasswordAuthenticationToken(username, password);
  authentication = authenticationManager.authenticate(authentication);
  SecurityContextHolder.getContext().setAuthentication(authentication);

  return (Principal)authentication;
}

I don’t need to override doAuthorization because when I’m doing MethodSecurityInterceptor, that class takes care of looking at the Authentication token’s “GrantedAuthority”es to see if they can execute the method.

That’s pretty much it. I need to figure out the extent of the security integration. I know that at the moment the authentication will not work on RTMP channels.

A good explanation and example for Spring and BlazeDS is important for driving adoption of BlazeDS into environments that run on Java. I know a potential client of mine is looking into using BlazeDS as a transport layer for a product they have running on a Tomcat container. They want to try following established practices in Java and want to use off-the-shelf, tried-and-true technologies like Spring and Hibernate, and having information on using these with BlazeDS would make them more confident when adopting BlazeDS.

Hope this helps. Also, I just found out someone else had documented a similar approach at this blog post:

http://blog.f4k3.net/fake/entry/acegi_logincommand_for_fds

4 Responses to “BlazeDS, Spring, and Acegi Security - Part 3”

  1. Flex Programming Tips of the Week 0805D | Flex Tech Says:

    [...] and the programmer’s creativity. I just love it! Great job, Sherif!All source code provided too.BlazeDS, Spring and Acei security - the part 3 of the integration series. I’m glad to see more and more efforts or focus shifting [...]

  2. Securing your Flex application with Spring Security and Active Directory | Mind the Flex Says:

    [...] BlazeDS and Spring Security http://www.machine501.com/blog/2008/02/14/blazeds-and-spring-security/ http://www.machine501.com/blog/2008/05/30/blazeds-spring-and-acegi-security-part-2/ http://www.machine501.com/blog/2008/06/01/blazeds-and-springacegi-security-part/ [...]

  3. Francois Says:

    Hello Robert,

    Thanks a lot for this blog entry.

    I re-used and included your spring security integration techniques in a library I released and documented here :
    http://fna.googlecode.com/svn/trunk/fna/site/flex-contrib-spring/index.html

    This library is also referenced in a maven archetype of mine:
    http://fna.googlecode.com/svn/trunk/fna/site/mvn_archetypes/blazeds-autowired-spring-hibernate-archetype/index.html
    Blazeds-autowired-spring-hibernate-archetype helps you generate a multi-module maven project : a flex front-end application communicating with the backend through Adobe’s blazeds messaging. The back-end relies on a spring hibernate architecture.

    Cheers !
    François

  4. jack Says:

    Hello,
    How can I implement Spring Security because my authorization is stored in DB. Depending on how i assign a particular access to a particular role.

    e.g
    role - bank_teller auth - can accept cash withdrawal,cash deposit, encashment
    role - bank_teller2 auth - can accept check withdrawal,cash deposit, encashment

    ..etc…and anytime i can remove/change/add access level.

    Thanks a lot.
    Cheers.

Leave a Reply