I'm running into a situation where the IAuthorizationStrategy
interface is not sufficient enough. What I would like to propose is to
change:

        boolean isInstantiationAuthorized(Class componentClass);

to:

        boolean isInstantiationAuthorized(Class componentClass Object[] 
arguments);

This way an authorization strategy can capture the whole page request
and eventually redirect the user back to the original page that was
requested.

A little example will probably explain better.

Say we have a secure page like this:

  public abstract MyAuthenticatedWebPage extends WebPage {
       ...
  }

        public class EditProfilePage extends MyAuthenticatedWebPage {
           EditProfilePage() {
              ...
           }
        }

Intercepting this page with a IAuthorizationStrategy is simple:

        class MyAuthorizationStrategy implements IAuthorizationStrategy
        {
            public boolean isInstantiationAuthorized(Class componentClass)
            {
                if 
(MyAuthenticatedWebPage.class.isAssignableFrom(componentClass)) {
                    // Remember the page that was requested
                    session = ...
                    session.setRequestedAuthenticatedPage(componentClass);
                    // Show the login form - which will redirect back to the
original page after login
                    throw new 
RestartResponseAtInterceptPageException(LogInPage.class);
                }
                return true;
            }

            public boolean isActionAuthorized(Component component, Action 
action)
            {
                return true;
            }
        }

Somewhere in the LogInPage we can get back to the original page like this:

  session = ...
        Class responsePage = session.getRequestedAuthenticatedPage();
        if (responsePage == null) {
            responsePage = SomeHomePage.class;
        } else {
            session.setRequestedAuthenticatedPage(null);
        }
        setResponsePage(responsePage);

This is probably a pretty well known wicket pattern.

The problem is, it stops working when the page you want to protect
needs constructor arguments. Which is not an uncommon situation.

For example:

        public class ShowSomeStuffByCountryPage extends MyAuthenticatedWebPage {
           ShowSomeStuffByCountryPage(Country country) {
              ...
           }
        }

There is no way to protect this page using IAuthorizationStrategy
since the page arguments (Country) get lost.

So, the proposed change will result in two improvements:

 * The IAuthorizationStrategy can make a decision based not on just
the Page's class but also on the arguments to that Page. This will
allow for some more interesting advanced authorization schemes.

 * In case the IAuthorizationStrategy does the 'redirect to login page
and back to original page' thing, it can remember the whole request -
no information is lost.

If this sounds like a useful improvement then I would like to
implement this in the Wicket 2.0 tree this weekend.

I've been wanting to contribute to Wicket for a long time and I think
this is a good start.

If people here agree, what is a good way to do this? Shall I make a
patch and put that online so that the committers can look at it? How
does that process work for this project?

:-)

 S.

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Wicket-develop mailing list
Wicket-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-develop

Reply via email to