com.beto.test.securityinterceptor.security.CustomFilterInvocationSecurityMetadataSource.java Source code

Java tutorial

Introduction

Here is the source code for com.beto.test.securityinterceptor.security.CustomFilterInvocationSecurityMetadataSource.java

Source

package com.beto.test.securityinterceptor.security;

import com.beto.test.securityinterceptor.model.dao.RoleDAO;
import com.beto.test.securityinterceptor.model.domain.SingletonPageRole;
import com.beto.test.securityinterceptor.model.entity.SecPageRoleDef;
import com.beto.test.securityinterceptor.model.entity.SecRoleDef;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource;
import org.springframework.stereotype.Service;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Belgelerim
 */
@Service
public class CustomFilterInvocationSecurityMetadataSource extends DefaultFilterInvocationSecurityMetadataSource {

    private static final Logger LOOGER = Logger.getLogger(CustomFilterInvocationSecurityMetadataSource.class);

    @Autowired
    private UserPageRoleService urlRepository;

    @Autowired
    private RoleDAO roleDAO;

    @Autowired
    private SingletonPageRole sbean;

    private List<SecPageRoleDef> liste = null;

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public CustomFilterInvocationSecurityMetadataSource() {
        super(new java.util.LinkedHashMap());
    }

    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) {
        LOOGER.debug("CustomFilterInvocationSecurityMetadataSource.getAttributes() method called...");
        FilterInvocation fi = (FilterInvocation) object;

        String url = fi.getRequestUrl();

        String urlPropsValue = null;

        if (url.contains(".jsf")) {
            int lastSlashIndex = url.lastIndexOf(".jsf");
            url = url.substring(0, lastSlashIndex);
        }

        if (!StringUtils.isEmpty(url) && (url.startsWith("/css/") || url.startsWith("/img/")
                || url.startsWith("/assets/") || url.startsWith("/js/") || url.startsWith("/resources/"))) {
            return null;
        }

        urlPropsValue = getRole(url);

        String attr = "";
        if (urlPropsValue != null) {
            attr = addAttr(urlPropsValue, attr);
        }

        if (!url.endsWith("/")) {
            int lastSlashIndex = url.lastIndexOf("/");
            url = url.substring(0, lastSlashIndex + 1);
        }

        /**
         * Dorudan url'e atanm bir role tanm yoksa dizin role
         * atamalar var m diye kontrol et
         */
        if (attr == null || attr.equals("")) {
            attr = getUrlHigherDirectoryRoles(url, attr, urlPropsValue);
        }

        LOOGER.debug("getAttributes [Tespit Edilen Roller : " + attr + "]");

        if (attr.length() == 0) {
            // throw new
            // org.springframework.security.access.AccessDeniedException("Eriim Hatas");
            return null;
        }
        return SecurityConfig.createListFromCommaDelimitedString(attr);
    }

    private String addAttr(String role, String attr) {
        LOOGER.debug("CustomFilterInvocationSecurityMetadataSource.addAttr() method called...");
        if (attr != null) {
            String[] arr = attr.split(",");
            boolean contain = false;
            for (String e : arr) {
                if (e.equals(role)) {
                    contain = true;
                }
            }
            if (!contain) {
                attr += (attr != null && !attr.equals("") ? "," : "") + role;
            }
        } else {
            attr = role;
        }
        return attr;
    }

    private List<SecPageRoleDef> getPattern(String url) throws Exception {
        LOOGER.debug("CustomFilterInvocationSecurityMetadataSource.getPattern() method called...");
        /*
         * URL bilgisi ncelikle SecureSingletonBean ierisindeki permission
         * mapinde aranr. Bu sayede sorgulama konusunda hz kanlm olur.
         */
        liste = sbean.getPermissions(url);

        if (liste == null) {
            liste = urlRepository.findUrlByUrl(url);
            if (liste == null) {
                liste = new ArrayList<SecPageRoleDef>();
            }
            sbean.addPermissions(url, liste);
        }

        List<SecPageRoleDef> uliste = new ArrayList<>();

        for (SecPageRoleDef p : liste) { // .replaceAll(">", "/")
            if ((p.getViewId().getViewId()).equals(url)) {
                uliste.add(p);
            }
        }

        return uliste;
    }

    private String getRole(String url) {
        try {
            LOOGER.debug("getRole [url : " + url + "]");

            List<SecPageRoleDef> uliste = getPattern(url);
            String roles = null;
            for (SecPageRoleDef p : uliste) {
                SecRoleDef role = p.getRole();
                if (role != null) {
                    logger.debug("\n\nADD ROLE" + role.getRole() + "");
                    roles = addAttr(role.getRole(), roles);
                }
            }

            LOOGER.debug("getRole [roles : " + roles + "]");

            return roles;
        } catch (Exception e) {
            LOOGER.error(e.getMessage(), e);
        }
        return null;
    }

    private String getUrlHigherDirectoryRoles(String url, String attr, String urlPropsValue) {
        LOOGER.debug("CustomFilterInvocationSecurityMetadataSource.getUrlHigherDirectoryRoles() method called...");
        try {
            String[] urlParts = url.split("/");

            StringBuilder urlBuilder = new StringBuilder();
            for (String urlPart : urlParts) {
                if (urlPart.trim().length() == 0) {
                    continue;
                }
                urlBuilder.append("/").append(urlPart);
                urlPropsValue = getRole(urlBuilder.toString() + "/**");

                if (urlPropsValue != null) {
                    /**
                     * Yeni bir role tespit edilmi ise dier tespit edilen
                     * rolleri sil
                     */
                    attr = "";
                    attr = addAttr(urlPropsValue, attr);
                }
            }
            return attr;
        } catch (Exception e) {
            LOOGER.error(e.getMessage(), e);
        }
        return null;
    }

    @Override
    public Collection<ConfigAttribute> getAllConfigAttributes() {
        return null;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return FilterInvocation.class.isAssignableFrom(clazz);
    }

    public void setUrlRepository(UserPageRoleService urlRepository) {
        this.urlRepository = urlRepository;
    }

    public UserPageRoleService getUrlRepository() {
        return urlRepository;
    }

    public void setSbean(SingletonPageRole sbean) {
        this.sbean = sbean;
    }

    public SingletonPageRole getSbean() {
        return sbean;
    }

}