
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