Browse Source

CAS 优化

MaxKey 4 years ago
parent
commit
7d7f800164
15 changed files with 270 additions and 251 deletions
  1. 28 1
      maxkey-common/src/test/java/org/maxkey/crypto/DigestUtilsTest.java
  2. 4 0
      maxkey-common/src/test/java/org/maxkey/crypto/ReciprocalUtilsTest.java
  3. 116 0
      maxkey-core/src/main/java/org/maxkey/web/HttpRequestAdapter.java
  4. 55 0
      maxkey-core/src/main/java/org/maxkey/web/HttpResponseAdapter.java
  5. 16 0
      maxkey-core/src/main/java/org/maxkey/web/ResponseConstants.java
  6. 3 86
      maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java
  7. 15 15
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java
  8. 17 24
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java
  9. 2 1
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java
  10. 6 104
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java
  11. 2 1
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java
  12. 2 3
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/CasServiceResponse.java
  13. 2 2
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ProxyServiceResponseBuilder.java
  14. 2 3
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ServiceResponseBuilder.java
  15. 0 11
      maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/ticket/CasConstants.java

+ 28 - 1
maxkey-common/src/test/java/org/maxkey/crypto/DigestUtilsTest.java

@@ -17,6 +17,7 @@
 
 package org.maxkey.crypto;
 
+import java.time.Instant;
 import java.util.Date;
 
 import org.junit.Test;
@@ -42,7 +43,7 @@ public class DigestUtilsTest {
 	*/
 	@Test
 	public void testHex() {
-		
+		/*
 		System.out.println(DigestUtils.shaHex("mytest"));
 		
 		System.out.println(DigestUtils.sha1Hex("mytest"));
@@ -55,5 +56,31 @@ public class DigestUtilsTest {
 		
 		System.out.println(DigestUtils.md5Hex("seamingxy99"));
 		System.out.println((new Date()).getTime());
+		*/
+		
+		//String zentaoLogin="http://127.0.0.1/biz/api.php?m=user&f=apilogin&account=%s&code=%s&time=%s&token=%s";
+		String zentaoLogin="http://127.0.0.1/zentao/api.php?m=user&f=apilogin&account=%s&code=%s&time=%s&token=%s";
+		String code = "maxkey";
+		//String key   = "430ba509ba95094e580b925fc4839459";
+		String key   = "f71792dfebf23d62bc4d65d1513087e3";
+		//String time  = ""+System.currentTimeMillis();
+		String time  = ""+Instant.now().getEpochSecond();
+		//String time = "1615370929";
+		//String code  = "myApp";
+		//String key   = "427c579384224abf9570779d82969d1e";
+		//String time  = "1557034496";
+		
+		String token =DigestUtils.md5Hex(code+key+time);
+		
+		System.out.println("currentTimeMillis " + System.currentTimeMillis());
+		System.out.println(DigestUtils.md5Hex(code+key+time));
+		String account="admin";
+		
+		String redirec_uri=String.format(zentaoLogin,account,code,time,token);
+		System.out.println("redirec_uri : \n"+redirec_uri);
+		
+		
+
+		
 	}
 }

+ 4 - 0
maxkey-common/src/test/java/org/maxkey/crypto/ReciprocalUtilsTest.java

@@ -48,6 +48,8 @@ public class ReciprocalUtilsTest {
 		 String urldecodeString="http://exchange.connsec.com/owa/?ae=Item&a=Open&t=IPM.Note&id=RgAAAABPKgpqnlfYQ7BVC%2fBfH2XIBwCS0xhUjzMYSLVky9bw7LddAAAAjov5AACS0xhUjzMYSLVky9bw7LddAAADzoy%2fAAAA&pspid=_1428036768398_867461813";
 		 String   urldcode   =   java.net.URLDecoder.decode(urldecodeString,   "utf-8");   
 		 
+		
+		 
 		 
 				 
 				
@@ -65,6 +67,8 @@ public class ReciprocalUtilsTest {
 	    encoderString="ead67db5c4f55eace090ab0044682451";
 		encoderString=ReciprocalUtils.decoder(encoderString);
 		System.out.println(encoderString );
+		
+		
 		 
 	 }
 }

+ 116 - 0
maxkey-core/src/main/java/org/maxkey/web/HttpRequestAdapter.java

@@ -0,0 +1,116 @@
+package org.maxkey.web;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class HttpRequestAdapter {
+	private static final Logger _logger = LoggerFactory.getLogger(HttpRequestAdapter.class);
+	 
+	public void post(String url,Map<String, Object> parameterMap) {
+		HashMap<String,String> headers = new HashMap<String,String>();
+		headers.put("Content-Type", "application/x-www-form-urlencoded");
+		post(url , parameterMap , headers);
+	}
+	
+    public void post(String url,Map<String, Object> parameterMap,HashMap<String,String> headers) {
+        // 创建httpClient实例
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse httpResponse = null;
+        // 创建httpPost远程连接实例
+        HttpPost httpPost = new HttpPost(url);
+        // 配置请求参数实例
+        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
+                .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
+                .setSocketTimeout(60000)// 设置读取数据连接超时时间
+                .build();
+        // 为httpPost实例设置配置
+        httpPost.setConfig(requestConfig);
+        // 设置请求头
+        if (null != headers && headers.size() > 0) {
+        	  Set<Entry<String, String>> entrySet = headers.entrySet();
+              // 循环遍历,获取迭代器
+              Iterator<Entry<String, String>> iterator = entrySet.iterator();
+              while (iterator.hasNext()) {
+                  Entry<String, String> mapEntry = iterator.next();
+                  _logger.trace("Name " + mapEntry.getKey() + " , Value " +mapEntry.getValue());
+                  httpPost.addHeader(mapEntry.getKey(), mapEntry.getValue());
+              }
+        }
+        
+        // 封装post请求参数
+        if (null != parameterMap && parameterMap.size() > 0) {
+            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+            // 通过map集成entrySet方法获取entity
+            Set<Entry<String, Object>> entrySet = parameterMap.entrySet();
+            // 循环遍历,获取迭代器
+            Iterator<Entry<String, Object>> iterator = entrySet.iterator();
+            while (iterator.hasNext()) {
+                Entry<String, Object> mapEntry = iterator.next();
+                _logger.debug("Name " + mapEntry.getKey() + " , Value " +mapEntry.getValue());
+                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
+            }
+
+            // 为httpPost设置封装好的请求参数
+            try {
+                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            _logger.debug("Post Message \n" + 
+                    httpPost.getEntity().toString()
+                 );
+        }
+        
+        
+        try {
+            // httpClient对象执行post请求,并返回响应参数对象
+            httpResponse = httpClient.execute(httpPost);
+            // 从响应对象中获取响应内容
+            HttpEntity entity = httpResponse.getEntity();
+            _logger.debug("Http Response StatusCode " + 
+                    httpResponse.getStatusLine().getStatusCode()+
+                    " , Content " +EntityUtils.toString(entity)
+            );
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 关闭资源
+            if (null != httpResponse) {
+                try {
+                    httpResponse.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != httpClient) {
+                try {
+                    httpClient.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    
+}

+ 55 - 0
maxkey-core/src/main/java/org/maxkey/web/HttpResponseAdapter.java

@@ -0,0 +1,55 @@
+package org.maxkey.web;
+
+import java.io.IOException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import org.maxkey.constants.ContentType;
+import org.springframework.stereotype.Component;
+
+@Component
+public class HttpResponseAdapter {
+
+    
+    public void setContentType(
+                        HttpServletResponse response,
+                        String format) {
+        
+        if(format == null || format.equalsIgnoreCase("") || format.equalsIgnoreCase(ResponseConstants.FORMAT_TYPE.XML)) {
+            response.setContentType(ContentType.APPLICATION_XML_UTF8);
+        }else {
+            response.setContentType(ContentType.APPLICATION_JSON_UTF8);
+        }
+    }
+    
+	public void write(HttpServletResponse response,String content, String format) {
+
+		setContentType(response , format);
+		
+        // Set to expire far in the past.
+        response.setDateHeader("Expires", 0);
+        // Set standard HTTP/1.1 no-cache headers.
+        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
+        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
+        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
+        
+        ServletOutputStream out = null;
+            try {
+				out = response.getOutputStream();
+            	// write the data out
+                out.write(content.getBytes());
+                out.flush();
+            }catch (IOException e) {
+				e.printStackTrace();
+			} finally {
+                try {
+                	if(out != null) {
+                		out.close();
+                	}
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+            }
+	}
+    
+}

+ 16 - 0
maxkey-core/src/main/java/org/maxkey/web/ResponseConstants.java

@@ -0,0 +1,16 @@
+package org.maxkey.web;
+
+public class ResponseConstants {
+	
+	public  static final class  FORMAT_TYPE {
+	    /**
+	     * Default XML response.
+	     */
+		public static final String XML="xml";
+	    /**
+	     * Render response in JSON.
+	     */
+		public static final String JSON="json";
+	}
+	
+}

+ 3 - 86
maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java

@@ -17,26 +17,9 @@
 
 package org.maxkey.authz.singlelogout;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.EntityUtils;
 import org.maxkey.domain.apps.Apps;
+import org.maxkey.web.HttpRequestAdapter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.security.core.Authentication;
@@ -47,73 +30,7 @@ public abstract class SingleLogout {
     public abstract void sendRequest(Authentication authentication,Apps logoutApp) ;
     
     public void postMessage(String url,Map<String, Object> paramMap) {
-        // 创建httpClient实例
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        CloseableHttpResponse httpResponse = null;
-        // 创建httpPost远程连接实例
-        HttpPost httpPost = new HttpPost(url);
-        // 配置请求参数实例
-        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
-                .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
-                .setSocketTimeout(60000)// 设置读取数据连接超时时间
-                .build();
-        // 为httpPost实例设置配置
-        httpPost.setConfig(requestConfig);
-        // 设置请求头
-        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
-        // 封装post请求参数
-        if (null != paramMap && paramMap.size() > 0) {
-            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
-            // 通过map集成entrySet方法获取entity
-            Set<Entry<String, Object>> entrySet = paramMap.entrySet();
-            // 循环遍历,获取迭代器
-            Iterator<Entry<String, Object>> iterator = entrySet.iterator();
-            while (iterator.hasNext()) {
-                Entry<String, Object> mapEntry = iterator.next();
-                _logger.debug("Name " + mapEntry.getKey() + " , Value " +mapEntry.getValue());
-                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
-            }
-
-            // 为httpPost设置封装好的请求参数
-            try {
-                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
-            } catch (UnsupportedEncodingException e) {
-                e.printStackTrace();
-            }
-            _logger.debug("Post Message \n" + 
-                    httpPost.getEntity().toString()
-                 );
-        }
-        
-        
-        try {
-        	 _logger.debug("Post URL " + url  );
-            // httpClient对象执行post请求,并返回响应参数对象
-            httpResponse = httpClient.execute(httpPost);
-            // 从响应对象中获取响应内容
-            HttpEntity entity = httpResponse.getEntity();
-            _logger.debug("Http Response StatusCode " + 
-                    httpResponse.getStatusLine().getStatusCode()+
-                    " , Content " +EntityUtils.toString(entity)
-            );
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            // 关闭资源
-            if (null != httpResponse) {
-                try {
-                    httpResponse.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            if (null != httpClient) {
-                try {
-                    httpClient.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
+    	_logger.trace("post message to url " + url);
+    	(new HttpRequestAdapter()).post(url , paramMap);
     }
 }

+ 15 - 15
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java

@@ -34,8 +34,10 @@ import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter;
 import org.maxkey.constants.Boolean;
 import org.maxkey.domain.UserInfo;
 import org.maxkey.util.Instance;
+import org.maxkey.web.ResponseConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -169,7 +171,7 @@ INTERNAL_ERROR - an internal error occurred during ticket validation
 For all error codes, it is RECOMMENDED that CAS provide a more detailed message as the body of the \<cas:authenticationFailure\> block of the XML response.
 	 */
 	@ApiOperation(value = "CAS 2.0 ticket验证接口", notes = "通过ticket获取当前登录用户信息",httpMethod="POST")
-	@RequestMapping("/authz/cas/serviceValidate")
+	@RequestMapping(value="/authz/cas/serviceValidate",produces =MediaType.APPLICATION_XML_VALUE)
 	@ResponseBody
 	public String serviceValidate(
 			HttpServletRequest request,
@@ -178,7 +180,7 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message
 			@RequestParam(value = CasConstants.PARAMETER.SERVICE) String service,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl,
 			@RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("serviceValidate " 
                 + " ticket " + ticket 
                 +" , service " + service 
@@ -187,8 +189,6 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message
                 +" , format " + format
         );
 	    
-	    setContentType(request,response,format);
-	    
 		Ticket storedTicket=null;
 		if(ticket.startsWith(CasConstants.PREFIX.SERVICE_TICKET_PREFIX)) {
 			try {
@@ -215,7 +215,7 @@ For all error codes, it is RECOMMENDED that CAS provide a more detailed message
 				serviceResponseBuilder.success().setTicket(proxyGrantingTicketIOU);
 				serviceResponseBuilder.success().setProxy(pgtUrl);
 			
-				postMessage(pgtUrl+"?pgtId="+proxyGrantingTicket+"&pgtIou="+proxyGrantingTicketIOU,null);		
+				httpRequestAdapter.post(pgtUrl+"?pgtId="+proxyGrantingTicket+"&pgtIou="+proxyGrantingTicketIOU,null);		
 			}
 			
 			if(Boolean.isTrue(storedTicket.getCasDetails().getIsAdapter())){
@@ -294,7 +294,7 @@ Response on ticket validation failure:
 	 */
 	
 	@ApiOperation(value = "CAS 2.0 ticket代理验证接口", notes = "通过ticket获取当前登录用户信息",httpMethod="POST")
-	@RequestMapping("/authz/cas/proxyValidate")
+	@RequestMapping(value="/authz/cas/proxyValidate",produces =MediaType.APPLICATION_XML_VALUE)
 	@ResponseBody
 	public String proxy(
 			HttpServletRequest request,
@@ -303,7 +303,7 @@ Response on ticket validation failure:
 			@RequestParam(value = CasConstants.PARAMETER.SERVICE) String service,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl,
 			@RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("proxyValidate " 
                 + " ticket " + ticket 
                 +" , service " + service 
@@ -311,7 +311,6 @@ Response on ticket validation failure:
                 +" , renew " + renew
                 +" , format " + format
         );
-	    setContentType(request,response,format);
 		
 		Ticket storedTicket=null;
 		if(ticket.startsWith(CasConstants.PREFIX.PROXY_TICKET_PREFIX)) {
@@ -396,28 +395,29 @@ INTERNAL_ERROR - an internal error occurred during ticket validation
 
 For all error codes, it is RECOMMENDED that CAS provide a more detailed message as the body of the <cas:authenticationFailure> block of the XML response.
 	 */
-	@RequestMapping("/authz/cas/proxy")
+	@RequestMapping(value="/authz/cas/proxy" ,produces =MediaType.APPLICATION_XML_VALUE)
 	@ResponseBody
 	public String proxy(
 			HttpServletRequest request,
 			HttpServletResponse response,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_GRANTING_TICKET) String pgt,
 			@RequestParam(value = CasConstants.PARAMETER.TARGET_SERVICE) String targetService,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("proxy " 
                 + " pgt " + pgt 
                 +" , targetService " + targetService 
                 +" , format " + format
         );
-	    setContentType(request,response,format);
+	    ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
+	    
 	    ProxyGrantingTicketImpl proxyGrantingTicketImpl = (ProxyGrantingTicketImpl)casProxyGrantingTicketServices.get(pgt);
 	    if(proxyGrantingTicketImpl != null) {
 	    	ProxyTicketImpl ProxyTicketImpl = new ProxyTicketImpl(proxyGrantingTicketImpl.getAuthentication(),proxyGrantingTicketImpl.getCasDetails());
 	    	String proxyTicket =ticketServices.createTicket(ProxyTicketImpl);
-	    	ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
-	 		return proxyServiceResponseBuilder.success().setTicket(proxyTicket).setFormat(format).serviceResponseBuilder();
+	 		proxyServiceResponseBuilder.success().setTicket(proxyTicket).setFormat(format);
+	    }else {
+	    	proxyServiceResponseBuilder.success().setTicket("").setFormat(format);
 	    }
-	    ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
-		return proxyServiceResponseBuilder.success().setTicket("").setFormat(format).serviceResponseBuilder();
+		return proxyServiceResponseBuilder.serviceResponseBuilder();
 	}
 }

+ 17 - 24
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java

@@ -35,13 +35,12 @@ import org.maxkey.authz.endpoint.adapter.AbstractAuthorizeAdapter;
 import org.maxkey.constants.Boolean;
 import org.maxkey.domain.UserInfo;
 import org.maxkey.util.Instance;
+import org.maxkey.web.ResponseConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -56,16 +55,15 @@ public class Cas30AuthorizeEndpoint  extends CasBaseAuthorizeEndpoint{
 	final static Logger _logger = LoggerFactory.getLogger(Cas30AuthorizeEndpoint.class);
 
 	@ApiOperation(value = "CAS 3.0 ticket验证接口", notes = "通过ticket获取当前登录用户信息",httpMethod="POST")
-	@RequestMapping("/authz/cas/p3/serviceValidate")
-	@ResponseBody
-	public String serviceValidate(
+	@RequestMapping(value="/authz/cas/p3/serviceValidate")
+	public void serviceValidate(
 			HttpServletRequest request,
 			HttpServletResponse response,
 			@RequestParam(value = CasConstants.PARAMETER.TICKET) String ticket,
 			@RequestParam(value = CasConstants.PARAMETER.SERVICE) String service,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl,
 			@RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("serviceValidate " 
 	                    + " ticket " + ticket 
 	                    +" , service " + service 
@@ -74,8 +72,6 @@ public class Cas30AuthorizeEndpoint  extends CasBaseAuthorizeEndpoint{
 	                    +" , format " + format
 	            );
 	    
-setContentType(request,response,format);
-	    
 		Ticket storedTicket=null;
 		if(ticket.startsWith(CasConstants.PREFIX.SERVICE_TICKET_PREFIX)) {
 			try {
@@ -102,7 +98,7 @@ setContentType(request,response,format);
 				serviceResponseBuilder.success().setTicket(proxyGrantingTicketIOU);
 				serviceResponseBuilder.success().setProxy(pgtUrl);
 			
-				postMessage(pgtUrl+"?pgtId="+proxyGrantingTicket+"&pgtIou="+proxyGrantingTicketIOU,null);		
+				httpRequestAdapter.post(pgtUrl+"?pgtId="+proxyGrantingTicket+"&pgtIou="+proxyGrantingTicketIOU,null);		
 			}
 			
 			if(Boolean.isTrue(storedTicket.getCasDetails().getIsAdapter())){
@@ -116,46 +112,45 @@ setContentType(request,response,format);
 				.setDescription("Ticket "+ticket+" not recognized");
 		}
 	
-		return serviceResponseBuilder.serviceResponseBuilder();
+		httpResponseAdapter.write(response,serviceResponseBuilder.serviceResponseBuilder(),format);
 	}
 	
 	@ApiOperation(value = "CAS 3.0 ProxyTicket代理验证接口", notes = "通过ProxyGrantingTicket获取ProxyTicket",httpMethod="POST")
 	@RequestMapping("/authz/cas/p3/proxy")
-	@ResponseBody
-	public String proxy(
+	public void proxy(
 			HttpServletRequest request,
 			HttpServletResponse response,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_GRANTING_TICKET) String pgt,
 			@RequestParam(value = CasConstants.PARAMETER.TARGET_SERVICE) String targetService,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("proxy " 
                 + " pgt " + pgt 
                 +" , targetService " + targetService 
                 +" , format " + format
         );
-	    setContentType(request,response,format);
+	    ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
 	    ProxyGrantingTicketImpl proxyGrantingTicketImpl = (ProxyGrantingTicketImpl)casProxyGrantingTicketServices.get(pgt);
 	    if(proxyGrantingTicketImpl != null) {
 	    	ProxyTicketImpl ProxyTicketImpl = new ProxyTicketImpl(proxyGrantingTicketImpl.getAuthentication(),proxyGrantingTicketImpl.getCasDetails());
 	    	String proxyTicket =ticketServices.createTicket(ProxyTicketImpl);
-	    	ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
-	 		return proxyServiceResponseBuilder.success().setTicket(proxyTicket).setFormat(format).serviceResponseBuilder();
+	 		proxyServiceResponseBuilder.success().setTicket(proxyTicket).setFormat(format);
+	    }else {
+	    	proxyServiceResponseBuilder.success().setTicket("").setFormat(format);
 	    }
-	    ProxyServiceResponseBuilder proxyServiceResponseBuilder=new ProxyServiceResponseBuilder();
-		return proxyServiceResponseBuilder.success().setTicket("").setFormat(format).serviceResponseBuilder();
+	    
+	    httpResponseAdapter.write(response,proxyServiceResponseBuilder.serviceResponseBuilder(),format);
 	}
 	
 	@ApiOperation(value = "CAS 3.0 ticket代理验证接口", notes = "通过ProxyTicket获取当前登录用户信息",httpMethod="POST")
 	@RequestMapping("/authz/cas/p3/proxyValidate")
-	@ResponseBody
-	public String proxy(
+	public void proxy(
 			HttpServletRequest request,
 			HttpServletResponse response,
 			@RequestParam(value = CasConstants.PARAMETER.TICKET) String ticket,
 			@RequestParam(value = CasConstants.PARAMETER.SERVICE) String service,
 			@RequestParam(value = CasConstants.PARAMETER.PROXY_CALLBACK_URL,required=false) String pgtUrl,
 			@RequestParam(value = CasConstants.PARAMETER.RENEW,required=false) String renew,
-			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=CasConstants.FORMAT_TYPE.XML) String format){
+			@RequestParam(value = CasConstants.PARAMETER.FORMAT,required=false,defaultValue=ResponseConstants.FORMAT_TYPE.XML) String format){
 	    _logger.debug("proxyValidate " 
                 + " ticket " + ticket 
                 +" , service " + service 
@@ -163,7 +158,6 @@ setContentType(request,response,format);
                 +" , renew " + renew
                 +" , format " + format
         );
-	    setContentType(request,response,format);
 		
 		Ticket storedTicket=null;
 		if(ticket.startsWith(CasConstants.PREFIX.PROXY_TICKET_PREFIX)) {
@@ -191,7 +185,6 @@ setContentType(request,response,format);
 				.setCode(CasConstants.ERROR_CODE.INVALID_TICKET)
 				.setDescription("Ticket "+ticket+" not recognized");
 		}
-	
-		return serviceResponseBuilder.serviceResponseBuilder();
+		httpResponseAdapter.write(response,serviceResponseBuilder.serviceResponseBuilder(),format);
 	}
 }

+ 2 - 1
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java

@@ -112,10 +112,11 @@ public class CasAuthorizeEndpoint  extends CasBaseAuthorizeEndpoint{
 		    callbackUrl.append("?");
 		}
 		
-		if(callbackUrl.indexOf("&") != -1) {
+		if(callbackUrl.indexOf("&") != -1 ||callbackUrl.indexOf("=") != -1) {
 		    callbackUrl.append("&");
 		}
 		
+		
 		//append ticket
 		callbackUrl.append(CasConstants.PARAMETER.TICKET).append("=").append(ticket);
 		

+ 6 - 104
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java

@@ -17,37 +17,15 @@
 
 package org.maxkey.authz.cas.endpoint;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.util.EntityUtils;
 import org.maxkey.authn.online.OnlineTicketServices;
-import org.maxkey.authz.cas.endpoint.ticket.CasConstants;
 import org.maxkey.authz.cas.endpoint.ticket.TicketServices;
 import org.maxkey.authz.endpoint.AuthorizeBaseEndpoint;
-import org.maxkey.constants.ContentType;
 import org.maxkey.persistence.service.AppsCasDetailsService;
 import org.maxkey.persistence.service.UserInfoService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.maxkey.web.HttpResponseAdapter;
+import org.maxkey.web.HttpRequestAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 
@@ -78,86 +56,10 @@ public class CasBaseAuthorizeEndpoint  extends AuthorizeBaseEndpoint{
     @Qualifier("casProxyGrantingTicketServices")
     protected TicketServices casProxyGrantingTicketServices;
     
+    @Autowired
+    protected HttpResponseAdapter httpResponseAdapter;
     
-    public void setContentType(
-                        HttpServletRequest request,
-                        HttpServletResponse response,
-                        String format) {
-        
-        if(format == null || format.equalsIgnoreCase("") || format.equalsIgnoreCase(CasConstants.FORMAT_TYPE.XML)) {
-            //response.setContentType(ContentType.APPLICATION_XML_UTF8);
-        }else {
-            response.setContentType(ContentType.APPLICATION_JSON_UTF8);
-        }
-    }
+    @Autowired
+    protected HttpRequestAdapter httpRequestAdapter; 
     
-    public void postMessage(String url,Map<String, Object> paramMap) {
-        // 创建httpClient实例
-        CloseableHttpClient httpClient = HttpClients.createDefault();
-        CloseableHttpResponse httpResponse = null;
-        // 创建httpPost远程连接实例
-        HttpPost httpPost = new HttpPost(url);
-        // 配置请求参数实例
-        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
-                .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
-                .setSocketTimeout(60000)// 设置读取数据连接超时时间
-                .build();
-        // 为httpPost实例设置配置
-        httpPost.setConfig(requestConfig);
-        // 设置请求头
-        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
-        // 封装post请求参数
-        if (null != paramMap && paramMap.size() > 0) {
-            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
-            // 通过map集成entrySet方法获取entity
-            Set<Entry<String, Object>> entrySet = paramMap.entrySet();
-            // 循环遍历,获取迭代器
-            Iterator<Entry<String, Object>> iterator = entrySet.iterator();
-            while (iterator.hasNext()) {
-                Entry<String, Object> mapEntry = iterator.next();
-                _logger.debug("Name " + mapEntry.getKey() + " , Value " +mapEntry.getValue());
-                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
-            }
-
-            // 为httpPost设置封装好的请求参数
-            try {
-                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
-            } catch (UnsupportedEncodingException e) {
-                e.printStackTrace();
-            }
-            _logger.debug("Post Message \n" + 
-                    httpPost.getEntity().toString()
-                 );
-        }
-        
-        
-        try {
-            // httpClient对象执行post请求,并返回响应参数对象
-            httpResponse = httpClient.execute(httpPost);
-            // 从响应对象中获取响应内容
-            HttpEntity entity = httpResponse.getEntity();
-            _logger.debug("Http Response StatusCode " + 
-                    httpResponse.getStatusLine().getStatusCode()+
-                    " , Content " +EntityUtils.toString(entity)
-            );
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            // 关闭资源
-            if (null != httpResponse) {
-                try {
-                    httpResponse.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-            if (null != httpClient) {
-                try {
-                    httpClient.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
 }

+ 2 - 1
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java

@@ -31,6 +31,7 @@ import org.maxkey.authz.cas.endpoint.ticket.ServiceTicketImpl;
 import org.maxkey.authz.cas.endpoint.ticket.TicketGrantingTicketImpl;
 import org.maxkey.domain.UserInfo;
 import org.maxkey.domain.apps.AppsCasDetails;
+import org.maxkey.web.ResponseConstants;
 import org.maxkey.web.WebContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -195,7 +196,7 @@ public class CasRestV1Endpoint  extends CasBaseAuthorizeEndpoint{
             HttpHeaders headers = new HttpHeaders();
             headers.add("location", location);
             ServiceResponseBuilder serviceResponseBuilder=new ServiceResponseBuilder();
-            serviceResponseBuilder.setFormat(CasConstants.FORMAT_TYPE.JSON);
+            serviceResponseBuilder.setFormat(ResponseConstants.FORMAT_TYPE.JSON);
             //for user
             serviceResponseBuilder.setAttribute("uid", userInfo.getId());
             serviceResponseBuilder.setAttribute("displayName",userInfo.getDisplayName());

+ 2 - 3
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/CasServiceResponse.java

@@ -19,8 +19,7 @@ package org.maxkey.authz.cas.endpoint.response;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-
-import org.maxkey.authz.cas.endpoint.ticket.CasConstants;
+import org.maxkey.web.ResponseConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,7 +31,7 @@ public class CasServiceResponse {
 	protected boolean result=false;
 	protected String user;
 	protected String ticket;
-	protected String format=CasConstants.FORMAT_TYPE.XML;
+	protected String format=ResponseConstants.FORMAT_TYPE.XML;
 	protected ArrayList<String >proxies=new ArrayList<String>();
 	
 	protected HashMap<String,ArrayList<String>>casAttributes=new HashMap<String,ArrayList<String>>();

+ 2 - 2
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ProxyServiceResponseBuilder.java

@@ -17,7 +17,7 @@
 
 package org.maxkey.authz.cas.endpoint.response;
 
-import org.maxkey.authz.cas.endpoint.ticket.CasConstants;
+import org.maxkey.web.ResponseConstants;
 
 public class ProxyServiceResponseBuilder extends  ServiceResponseBuilder{
 
@@ -28,7 +28,7 @@ public class ProxyServiceResponseBuilder extends  ServiceResponseBuilder{
 	@Override
 	public String  serviceResponseBuilder() {
 		String responseString = "";
-		if(format.equalsIgnoreCase(CasConstants.FORMAT_TYPE.XML)){
+		if(format.equalsIgnoreCase(ResponseConstants.FORMAT_TYPE.XML)){
 			responseString = serviceResponseXmlBuilder();
 		}else{
 			responseString =serviceResponseJsonBuilder();

+ 2 - 3
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ServiceResponseBuilder.java

@@ -19,8 +19,7 @@ package org.maxkey.authz.cas.endpoint.response;
 
 import java.util.ArrayList;
 import java.util.Iterator;
-
-import org.maxkey.authz.cas.endpoint.ticket.CasConstants;
+import org.maxkey.web.ResponseConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,7 +29,7 @@ public class ServiceResponseBuilder extends CasServiceResponse {
 	@Override
 	public String  serviceResponseBuilder() {
 		String responseString = "";
-		if(format.equalsIgnoreCase(CasConstants.FORMAT_TYPE.XML)){
+		if(format.equalsIgnoreCase(ResponseConstants.FORMAT_TYPE.XML)){
 			responseString= serviceResponseXmlBuilder();
 		}else{
 			responseString= serviceResponseJsonBuilder();

+ 0 - 11
maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/ticket/CasConstants.java

@@ -63,17 +63,6 @@ public class CasConstants {
 		public static final String REST_PASSWORD = "password";
 	}
 	
-	public  static final class  FORMAT_TYPE {
-	    /**
-	     * Default CAS XML response.
-	     */
-		public static final String XML="xml";
-	    /**
-	     * Render response in JSON.
-	     */
-		public static final String JSON="json";
-	}
-	
 	/* CAS Protocol PREFIX */
 	public static final class PREFIX{
 		/** Proxy ticket prefix applied to unique ids. */