pl.bristleback.server.bristle.conf.namespace.BristlebackSecurityBeanDefinitionParser.java Source code

Java tutorial

Introduction

Here is the source code for pl.bristleback.server.bristle.conf.namespace.BristlebackSecurityBeanDefinitionParser.java

Source

/*
 * Bristleback Websocket Framework - Copyright (c) 2010-2013 http://bristleback.pl
 * ---------------------------------------------------------------------------
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation; either version 3 of the License, or (at your
 * option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but without any warranty; without even the implied warranty of merchantability
 * or fitness for a particular purpose.
 * You should have received a copy of the GNU Lesser General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>.
 * ---------------------------------------------------------------------------
 */

package pl.bristleback.server.bristle.conf.namespace;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
import pl.bristleback.server.bristle.security.UserDetailsParameterExtractor;
import pl.bristleback.server.bristle.security.authentication.AuthenticatingAction;
import pl.bristleback.server.bristle.security.authentication.AuthenticationConfiguration;
import pl.bristleback.server.bristle.security.authentication.AuthenticationInformer;
import pl.bristleback.server.bristle.security.authentication.AuthenticationInterceptor;
import pl.bristleback.server.bristle.security.authentication.AuthenticationInterceptorContextResolver;
import pl.bristleback.server.bristle.security.authentication.AuthenticationsContainer;
import pl.bristleback.server.bristle.security.authentication.LogoutAction;
import pl.bristleback.server.bristle.security.authentication.LogoutInterceptor;
import pl.bristleback.server.bristle.security.authentication.UserDisconnectedListener;
import pl.bristleback.server.bristle.security.authorisation.interceptor.AuthorizationInterceptor;
import pl.bristleback.server.bristle.security.authorisation.interceptor.AuthorizationInterceptorContextResolver;
import pl.bristleback.server.bristle.security.exception.handler.AuthorizationExceptionHandler;
import pl.bristleback.server.bristle.security.exception.handler.BristleSecurityExceptionHandler;

/**
 * Parser for Bristleback security tag.
 * <p/>
 * Created on: 23.02.13 17:56 <br/>
 *
 * @author Wojciech Niemiec
 */
public class BristlebackSecurityBeanDefinitionParser extends BaseBristlebackBeanDefinitionParser {

    protected Class getBeanClass(Element element) {
        return String.class;
    }

    protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) {
        return "bristle.system.server.security.id";
    }

    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        addBasicBeans(element, parserContext);
        addAuthenticationBeans(element, parserContext);
        addAuthorizationBeans(parserContext);
    }

    private void addAuthorizationBeans(ParserContext parserContext) {
        BeanDefinition authorizationInterceptor = BeanDefinitionBuilder
                .rootBeanDefinition(AuthorizationInterceptor.class).getBeanDefinition();
        registerBean(parserContext, authorizationInterceptor, "bristleAuthorizationInterceptor");

        BeanDefinition authorizationInterceptorContextResolver = BeanDefinitionBuilder
                .rootBeanDefinition(AuthorizationInterceptorContextResolver.class).getBeanDefinition();
        registerBean(parserContext, authorizationInterceptorContextResolver,
                "bristleAuthorizationInterceptorContextResolver");

        BeanDefinition authorizationExceptionHandler = BeanDefinitionBuilder
                .rootBeanDefinition(AuthorizationExceptionHandler.class).getBeanDefinition();
        registerBean(parserContext, authorizationExceptionHandler, "bristleAuthorizationExceptionHandler");
    }

    private void addAuthenticationBeans(Element element, ParserContext parserContext) {
        addInterceptorBeans(parserContext);

        boolean useDefaultAuthenticationAction = element.hasAttribute("userDetailsService");
        if (useDefaultAuthenticationAction) {
            registerAuthenticationActionBean(element, parserContext);
        }
        boolean useDefaultLogoutAction = Boolean.valueOf(element.getAttribute("useDefaultLogoutAction"));
        if (useDefaultLogoutAction) {
            registerLogoutAction(parserContext);
        }
        registerAuthenticationInformer(parserContext);

        registerUserDisconnectionListener(parserContext);
    }

    private void registerAuthenticationInformer(ParserContext parserContext) {
        BeanDefinition disconnectionListener = BeanDefinitionBuilder
                .rootBeanDefinition(AuthenticationInformer.class).getBeanDefinition();
        registerBean(parserContext, disconnectionListener, "bristleAuthenticationInformer");
    }

    private void registerUserDisconnectionListener(ParserContext parserContext) {
        BeanDefinition disconnectionListener = BeanDefinitionBuilder
                .rootBeanDefinition(UserDisconnectedListener.class).getBeanDefinition();
        registerBean(parserContext, disconnectionListener, "bristleAuthenticationUserDisconnectedListener");
    }

    private void addBasicBeans(Element element, ParserContext parserContext) {
        registerSecurityConfigurationBean(element, parserContext);

        BeanDefinition authenticationsContainer = BeanDefinitionBuilder
                .rootBeanDefinition(AuthenticationsContainer.class).getBeanDefinition();
        registerBean(parserContext, authenticationsContainer, "bristleAuthenticationsContainer");

        BeanDefinition securityExceptionHandler = BeanDefinitionBuilder
                .rootBeanDefinition(BristleSecurityExceptionHandler.class).getBeanDefinition();
        registerBean(parserContext, securityExceptionHandler, "bristleSecurityExceptionHandler");

        BeanDefinition userDetailsParameterExtractor = BeanDefinitionBuilder
                .rootBeanDefinition(UserDetailsParameterExtractor.class).getBeanDefinition();
        registerBean(parserContext, userDetailsParameterExtractor, "bristleUserDetailsParameterExtractor");
    }

    private void registerSecurityConfigurationBean(Element element, ParserContext parserContext) {
        Integer maxConcurrentConnectionsPerUsername = Integer
                .parseInt(element.getAttribute("maxConcurrentPerUsername"));
        BeanDefinition authenticationConfiguration = BeanDefinitionBuilder
                .rootBeanDefinition(AuthenticationConfiguration.class)
                .addPropertyValue("maximumAuthenticationsPerUsername", maxConcurrentConnectionsPerUsername)
                .getBeanDefinition();
        registerBean(parserContext, authenticationConfiguration, "bristleAuthenticationConfiguration");
    }

    private void addInterceptorBeans(ParserContext parserContext) {
        BeanDefinition authenticationInterceptor = BeanDefinitionBuilder
                .rootBeanDefinition(AuthenticationInterceptor.class).getBeanDefinition();
        registerBean(parserContext, authenticationInterceptor, "bristleAuthenticationInterceptor");

        BeanDefinition authenticationInterceptorContextResolver = BeanDefinitionBuilder
                .rootBeanDefinition(AuthenticationInterceptorContextResolver.class).getBeanDefinition();
        registerBean(parserContext, authenticationInterceptorContextResolver,
                "bristleAuthenticationInterceptorContextResolver");

        BeanDefinition logoutInterceptor = BeanDefinitionBuilder.rootBeanDefinition(LogoutInterceptor.class)
                .getBeanDefinition();
        registerBean(parserContext, logoutInterceptor, "bristleLogoutInterceptor");

    }

    private void registerAuthenticationActionBean(Element element, ParserContext parserContext) {
        String userDetailsServiceBeanName = element.getAttribute("userDetailsService");
        BeanDefinition authenticationAction = BeanDefinitionBuilder.rootBeanDefinition(AuthenticatingAction.class)
                .addPropertyReference("userDetailsService", userDetailsServiceBeanName).getBeanDefinition();
        registerBean(parserContext, authenticationAction, "bristleSystemUserAuthentication");
    }

    private void registerLogoutAction(ParserContext parserContext) {
        BeanDefinition logoutAction = BeanDefinitionBuilder.rootBeanDefinition(LogoutAction.class)
                .getBeanDefinition();
        registerBean(parserContext, logoutAction, "bristleSystemUserLogoutAction");
    }

}