On Thu, 20 Jan 2005 06:53:36 -0800, Dakota Jack <[EMAIL PROTECTED]> wrote:
> I am also too lazy to make a filter!  LOL  ;-)  Anyone have one of
> these in their toolbox they would like to share?
package com.sssc.csr.web.filters;

import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sssc.csr.ConfigurationNames;
import com.sssc.model.User;
import com.sssc.csr.utils.*;
import com.sssc.csr.web.SessionAttributeNames;
import com.sssc.generics.utilities.LogWrapper;
import com.sssc.generics.utilities.ResourceBucket;

/**Ensure that a user has the appropriate access for the url they are 
 * requesting.
 * By default all access to jsp pages are denied... however you can override 
 * this
 * in the configuration file, if you wish.  
 * <p>The configuration file should consist of name/value pairs where the name 
 * is
 * the regex, and the value is the role.  The filter goes through each name, and
 * checks to see if the URI matches, and if it does returns the role.  If the 
 * user
 * has the role, or the role is the value of [EMAIL PROTECTED] #ALLOW_ALL 
ALLOW_ALL} it 
 * will
 * allow anyone, logged in or not access.</p>
 * @version     $Revision$
 * @author $Author$
 */
public class AuthorizationFilter implements Filter {

    /**Any URL marked with this role will be denied access no matter what.
     * 
     */
    public static final String DENY_ALL = "DENY_ALL_ACCESS";
    /**Any URL marked with this role will be allowed access no matter what role,
     * or lack of role they may have.
     */
    public static final String ALLOW_ALL = "ALLOW_ALL_ACCESS";
    /**How the filter is configured.
     * 
     */
    private FilterConfig config = null;
    /**Maps urls to their respective roles.  If a map has a null, then that 
     * means
     * that no one is allowed to view that url.
     */
    private RegexMap url2RoleMap = new RegexMap();

    private ResourceBucket bucket =
        (ResourceBucket) ResourceBucket.getInstance();

    /* (non-Javadoc)
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    public void init(FilterConfig config) throws ServletException {
        LogWrapper.logEnter("init", AuthorizationFilter.class);
        setConfig(config);
        getUrl2RoleMap().put(".*\\.jsp", DENY_ALL);
        Properties properties =
            bucket.getProperties(
                ConfigurationNames.AUTHORIZATIONFILTERCONFIGURATIONFILE);
        for (Iterator iter = properties.keySet().iterator(); iter.hasNext();) {
            String regexUrl = (String) iter.next();
            String role = (String) properties.get(regexUrl);

            LogWrapper.log(
                LogWrapper.DEBUG,
                "Loading " + regexUrl + ":" + role,
                AuthorizationFilter.class);

            getUrl2RoleMap().put(regexUrl, role);
        }
        LogWrapper.logExit("init", AuthorizationFilter.class);
    }

    /* (non-Javadoc)
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, 
     * javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {

        LogWrapper.logEnter("doFilter", AuthorizationFilter.class);

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String path = req.getRequestURI();
        String roleNeededToAccess = (String) getUrl2RoleMap().get(path);
        //If the path doesn't match anything, then deny it by default
        roleNeededToAccess =
            (roleNeededToAccess == null ? DENY_ALL : roleNeededToAccess);
        User user =
            (User) req.getSession().getAttribute(
                SessionAttributeNames.CURRENT_USER);
        LogWrapper.log(
            LogWrapper.DEBUG,
            "Context path: "
                + req.getContextPath()
                + " Path: "
                + path
                + " roleNeededToAccess: "
                + roleNeededToAccess
                + " User: "
                + (user == null ? "None" : user.toString()),
            AuthorizationFilter.class);

        if ((roleNeededToAccess.equals(ALLOW_ALL))
            || ((user != null) && (user.hasRole(roleNeededToAccess)))
            || path.equals(req.getContextPath() + "/")) {

            chain.doFilter(request, response);

        } else { //Deny everything else.
            req.getSession().invalidate();
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            resp.sendRedirect(httpRequest.getContextPath() + "/showLogin.do");
            LogWrapper.logAlert(
                "Attempt to access a resource ("
                    + req.getRequestURL()
                    + ") which the user ("
                    + ((user != null) ? user.toString() : "No user logged in.")
                    + " from "
                    + req.getRemoteAddr()
                    + ") is not allowed.");
        }
        LogWrapper.logExit("doFilter", AuthorizationFilter.class);
    }

    /* (non-Javadoc)
     * @see javax.servlet.Filter#destroy()
     */
    public void destroy() {}

    public void setConfig(FilterConfig config) {
        this.config = config;
    }

    public FilterConfig getConfig() {
        return config;
    }

    public void setUrl2RoleMap(RegexMap url2RoleMap) {
        this.url2RoleMap = url2RoleMap;
    }

    public RegexMap getUrl2RoleMap() {
        return url2RoleMap;
    }

}

> 
> Jack
> 
> On Thu, 20 Jan 2005 12:49:41 +0800, Andrew Hill
> <[EMAIL PROTECTED]> wrote:
> > Id support the filter suggestion, though for myself I generally do the
> > check in the RequestProcessor, as Ive usually overrideen it to perform
> > other evil anyhow, and Im lazy to make a filter.
> >
> > If you dont keep your JSP under WEB-INF (IMHO thats where they belong
> > because they are 'code & config' , just like your classes,jars, and
> > struts-config.xml and tlds) then you should declare some sort of
> > security constraint so they can only be reached by a server side forward
> > from their respective preperation action.
> >
> >
> > Frank W. Zammetti wrote:
> >
> > > If the user clicks a button, you are either going to (a) go directly to
> > > a JSP, which is generally not a good idea in a Struts-based application
> > > anyway (or any servlet-based application for that matter) or (b) go to
> > > an Action, as you probably should be doing.  In either case, choice 1 is
> > > what I would do personally.  Putting things under WEB-INF as David
> > > suggests works great, but it just feels kind of wrong to me.
> > >
> > > You'll also want to call some common code from all your Actions that
> > > does the same basic check and forwards immediately to your "logon again"
> > > page.  I do this by means of an ActionHelpers class that has two static
> > > methods, start() and finish() that are called, as I'm sure you could
> > > guess, at the start and end of all my Actions.  They do some common
> > > tasks, including this check.
> > >
> > > If you want a real solution though, externalize your security using
> > > something like Netegrity Siteminder.  It will deal with this situation
> > > for you, in a theoretically more secure fashion than you could probably
> > > do on your own.
> > >
> > > Yet another idea is a filter that will check if a session is alive and
> > > redirect as appropriate.  This I believe can work no matter what your
> > > request is to (Action or JSP directly), or any other resource, assuming
> > > the app server serves everything.
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> 
> --
> ------------------------------
> 
> "You can lead a horse to water but you cannot make it float on its back."
> 
> ~Dakota Jack~
> 
> "You can't wake a person who is pretending to be asleep."
> 
> ~Native Proverb~
> 
> "Each man is good in His sight. It is not necessary for eagles to be crows."
> 
> ~Hunkesni (Sitting Bull), Hunkpapa Sioux~
> 
> -----------------------------------------------
> 
> "This message may contain confidential and/or privileged information.
> If you are not the addressee or authorized to receive this for the
> addressee, you must not use, copy, disclose, or take any action based
> on this message or any information herein. If you have received this
> message in error, please advise the sender immediately by reply e-mail
> and delete this message. Thank you for your cooperation."
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to