Ben,

I am still having troubles getting messages to the developer list.  My
messages keep bouncing back.  Hopefully, you can put this into the list. 
However...

I had to force Basic authentication by modifying the BasicProcessingFilter
class so that the doFilter method sets the header field is set to "Basic "
if header is null.  I know this is ugly, but the SOAP client (Flash
component) is not sending this value when the request is made.  I do not
understand this.

Anyways, here is what I had to code to force this to happen.  If you know
a better way then I would like to know about it.  I think that the Flash
client is not setting this header field correctly to indicate that it is
Basic auth, but I am not sure.  If I do not use this code then a
subsequent Acegi filter will try to redirect to a login page.  Please
advise.

    public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
            throws IOException, ServletException {
        if (!(request instanceof HttpServletRequest)) {
            throw new ServletException("Can only process
HttpServletRequest");
        }

        if (!(response instanceof HttpServletResponse)) {
            throw new ServletException("Can only process
HttpServletResponse");
        }

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String header = httpRequest.getHeader("Authorization");

        if (logger.isDebugEnabled()) {
            logger.debug("Authorization header: " + header);
        }

        // ADDED CODE START  - YUCK....
//if ((header != null) && header.startsWith("Basic ")) {
        if(header == null){
            header = "Basic ";
        }

        // ADDED CODE END  - YUCK....

        String base64Token = header.substring(6);
        String token = new
String(Base64.decodeBase64(base64Token.getBytes()));

        String username = "";
        String password = "";
        int delim = token.indexOf(":");

        if (delim != -1) {
            username = token.substring(0, delim);
            password = token.substring(delim + 1);
        }

        UsernamePasswordAuthenticationToken authRequest = new
UsernamePasswordAuthenticationToken(username,
                password);
        authRequest.setDetails(httpRequest.getRemoteAddr());

        Authentication authResult;

        try {
            authResult = authenticationManager.authenticate(authRequest);
        } catch (AuthenticationException failed) {
            // Authentication failed
            if (logger.isDebugEnabled()) {
                logger
                        .debug("Authentication request for user: " +
username + " failed: "
                                + failed.toString());
            }

            authenticationEntryPoint.commence(request, response);

            return;
        }

        // Authentication success
        if (logger.isDebugEnabled()) {
            logger.debug("Authentication success: " + authResult.toString());
        }

        
httpRequest.getSession().setAttribute(HttpSessionIntegrationFilter.ACEGI_SECURITY_AUTHENTICATION_KEY,
                authResult);
        // if }

        chain.doFilter(request, response);
    }

Thanks,

Mark Eagle

> [EMAIL PROTECTED] wrote:
>
>>First, thanks to Ben for helping me understand some of the Acegi
>> internals.
>>My question revolves around using BASIC authentication with Acegi.
>> First,
>>let me start by stating that I am not using HTML.  I am using Flex which
>>uses a Flash client with SOAP requests.  What I want to know is if I use
>>BASIC authentication will Acegi still be able to use the notion of a
>>ContextHolder to store authentication credentials such as roles?  I want
>> to
>>use the roles for my Spring managed business objects of course.
>>Furthermore, is there a filter that I should be using that will not
>>redirect to a page if authentication fails?  Instead of the filter
>>redirecting to a JSP, or other page, I would like to just send a
>>response.sendError(HttpServlet.SC_UNAUTHORIZED) back to the client.
>> Should
>>I just write my own filter that is similar to the BasicProcessingFilter
>> and
>>append it in the chain of filters?  The Flash client is expecting a 401
>>HTTP error to notice a Client.Authentication fault/exception.  The
>> current
>>filter tries to redirect to the custom login form which does not apply in
>>my context.
>>
>>
>>
> Hi Mark
>
> The normal approach to BASIC authentication is to use
> SecurityEnforcementFilter, which detects any Acegi Security related
> exceptions. If the user is not logged in, the AuthenticationEntryPoint
> implementation will be called, which is usually
> BasicProcessingFilterEntryPoint in this case. If the user is logged in,
> a straight 403 (access denied) will be thrown.
> BasicProcessingFilterEntryPoint will throw a 401 (unauthorised) which
> will cause the calling browser to attempt login.
>
> Whilst SecurityEnforcementFilter can provide HTTP URL security, you
> don't _have_ to use it for this. The main value in your case is it
> detects security exceptions thrown by later executed code (namely the
> MethodSecurityInterceptor), meaning it can send the 403 or redirect to
> the AuthenticationEntryPoint accordingly.
>
> Does that answer your questions, as I think these classes will provide
> the behaviour you need?
>
> Best regards
> Ben
>
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by BEA Weblogic Workshop
> FREE Java Enterprise J2EE developer tools!
> Get your free copy of BEA WebLogic Workshop 8.1 today.
> http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
> _______________________________________________
> Acegisecurity-developer mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/acegisecurity-developer
>



-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
_______________________________________________
Acegisecurity-developer mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/acegisecurity-developer

Reply via email to