All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.digitalchina.platform.security.auth.CustomMetadataSource Maven / Gradle / Ivy

The newest version!
package com.digitalchina.platform.security.auth;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.digitalchina.platform.security.constants.SecurityConstants;
import com.digitalchina.platform.security.properties.SecureProperties;
import com.digitalchina.platform.security.utils.HttpSender;
import com.digitalchina.platform.security.utils.Result;
import com.digitalchina.platform.security.utils.SimpleHttpResponse;
import com.google.common.collect.Lists;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.FilterInvocationSecurityMetadataSource;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class CustomMetadataSource implements FilterInvocationSecurityMetadataSource {
    private static final Logger logger = LoggerFactory.getLogger(CustomMetadataSource.class);
    public static Map> resourceMap = new ConcurrentHashMap>();

    public SecureProperties secureProperties;

    public void setSecureProperties(SecureProperties secureProperties) {
        this.secureProperties = secureProperties;
    }

    public Collection getAttributes(Object object)throws IllegalArgumentException {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();

        if (requestUrl.indexOf("?") != -1) {
            requestUrl = requestUrl.substring(0, requestUrl.indexOf("?"));
        }

        Collection configAttrs = resourceMap.get(requestUrl);
        return configAttrs;
    }

    public Collection getAllConfigAttributes() {
        // TODO Auto-generated method stub
        return null;
    }

    public boolean supports(Class clazz) {
        return true;
    }

    public void loadMetadataSourceAuthority() throws InterruptedException {
        List urls = getMetaResource(getAllApplicationUrl(0));
        for (String url : urls) {
            resourceMap.put(url, getURLAuthority(url));
        }
    }

    private String getAllApplicationUrl(int failedCount) throws InterruptedException {
        if(failedCount >= secureProperties.getCustomMetadataMaxFailedCount()){
            String errorMsg = String.format("application attempt to get upms metadata failed after %d seconds",
                    secureProperties.getCustomMetadataMaxFailedCount() * secureProperties.getCustomMetadataFailedWaitSeconds());
            logger.error(errorMsg);
            throw new RuntimeException(errorMsg);
        }
        List params = Lists.newArrayList();
        params.add(new BasicNameValuePair("pCode", secureProperties.getpCode()));
        params.add(new BasicNameValuePair("apiKey", secureProperties.getApiKey()));
        SimpleHttpResponse httpResponse = HttpSender.postResponse(secureProperties.getAllApplicationUrl(), secureProperties.getHttpConnectionTimeout() * 1000,
                params, null, "utf-8");
        if(!checkResponse(httpResponse)){
            failedCount += 1;
            logger.warn("get upms metadata failed, total failed count " + failedCount);
            TimeUnit.SECONDS.sleep(secureProperties.getCustomMetadataFailedWaitSeconds());
            return getAllApplicationUrl(failedCount);
        }
        return httpResponse.getHttpResponseEntity();
    }

    private boolean checkResponse(SimpleHttpResponse httpResponse){
        if(null == httpResponse){
            return false;
        }
        if(HttpStatus.SC_OK != httpResponse.getHttpStatusCode()){
            return false;
        }
        String httpResponseEntity = httpResponse.getHttpResponseEntity();
        String applicationStatus = getApplicationStatus(httpResponseEntity);
        if(!Result.Status.OK.name().equals(applicationStatus)){
            return false;
        }
        return true;
    }

    private String getApplicationStatus(String httpResponseEntity){
        try{
            return Result.parseJsonResult(httpResponseEntity).getStatus();
        }catch (Exception e){
            logger.warn("parse upms response error", e);
            return null;
        }
    }

    private List getURLAuthority(String url) {
        List configAttributes = new ArrayList();
        configAttributes.add(new SecurityConfig(url));
        return configAttributes;
    }

    private List getMetaResource(String responseMgr) {
        List lists = Lists.newArrayList();
        if (responseMgr != null && responseMgr.trim().length() != 0) {
            try {
                JSONObject responseMsg = (JSONObject) JSONObject.parse(responseMgr);
                Integer code = responseMsg.getInteger("code");
                JSONArray result = responseMsg.getJSONArray("result");
                if (SecurityConstants.RESPONSE_CODE_OK == code) {//调用成功
                    Object[] array = result.toArray();
                    for (Object o : array) {
                        lists.add(String.valueOf(o));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return lists;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy