From 7d7f80016427b4075af09f2727ef1652fc35dc5e Mon Sep 17 00:00:00 2001 From: MaxKey Date: Mon, 15 Mar 2021 10:15:17 +0800 Subject: [PATCH] =?UTF-8?q?CAS=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/maxkey/crypto/DigestUtilsTest.java | 29 ++++- .../maxkey/crypto/ReciprocalUtilsTest.java | 4 + .../org/maxkey/web/HttpRequestAdapter.java | 116 ++++++++++++++++++ .../org/maxkey/web/HttpResponseAdapter.java | 55 +++++++++ .../org/maxkey/web/ResponseConstants.java | 16 +++ .../authz/singlelogout/SingleLogout.java | 89 +------------- .../cas/endpoint/Cas20AuthorizeEndpoint.java | 30 ++--- .../cas/endpoint/Cas30AuthorizeEndpoint.java | 41 +++---- .../cas/endpoint/CasAuthorizeEndpoint.java | 3 +- .../endpoint/CasBaseAuthorizeEndpoint.java | 110 +---------------- .../authz/cas/endpoint/CasRestV1Endpoint.java | 3 +- .../endpoint/response/CasServiceResponse.java | 5 +- .../response/ProxyServiceResponseBuilder.java | 4 +- .../response/ServiceResponseBuilder.java | 5 +- .../cas/endpoint/ticket/CasConstants.java | 11 -- 15 files changed, 270 insertions(+), 251 deletions(-) create mode 100644 maxkey-core/src/main/java/org/maxkey/web/HttpRequestAdapter.java create mode 100644 maxkey-core/src/main/java/org/maxkey/web/HttpResponseAdapter.java create mode 100644 maxkey-core/src/main/java/org/maxkey/web/ResponseConstants.java diff --git a/maxkey-common/src/test/java/org/maxkey/crypto/DigestUtilsTest.java b/maxkey-common/src/test/java/org/maxkey/crypto/DigestUtilsTest.java index ffa59cfd..4b6d7187 100644 --- a/maxkey-common/src/test/java/org/maxkey/crypto/DigestUtilsTest.java +++ b/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); + + + + } } diff --git a/maxkey-common/src/test/java/org/maxkey/crypto/ReciprocalUtilsTest.java b/maxkey-common/src/test/java/org/maxkey/crypto/ReciprocalUtilsTest.java index b1077afa..087c663b 100644 --- a/maxkey-common/src/test/java/org/maxkey/crypto/ReciprocalUtilsTest.java +++ b/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 ); + + } } diff --git a/maxkey-core/src/main/java/org/maxkey/web/HttpRequestAdapter.java b/maxkey-core/src/main/java/org/maxkey/web/HttpRequestAdapter.java new file mode 100644 index 00000000..c787bb1b --- /dev/null +++ b/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 parameterMap) { + HashMap headers = new HashMap(); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + post(url , parameterMap , headers); + } + + public void post(String url,Map parameterMap,HashMap 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> entrySet = headers.entrySet(); + // 循环遍历,获取迭代器 + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry 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 nvps = new ArrayList(); + // 通过map集成entrySet方法获取entity + Set> entrySet = parameterMap.entrySet(); + // 循环遍历,获取迭代器 + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry 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(); + } + } + } + } + +} diff --git a/maxkey-core/src/main/java/org/maxkey/web/HttpResponseAdapter.java b/maxkey-core/src/main/java/org/maxkey/web/HttpResponseAdapter.java new file mode 100644 index 00000000..d10c6d99 --- /dev/null +++ b/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(); + } + } + } + +} diff --git a/maxkey-core/src/main/java/org/maxkey/web/ResponseConstants.java b/maxkey-core/src/main/java/org/maxkey/web/ResponseConstants.java new file mode 100644 index 00000000..7d91563a --- /dev/null +++ b/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"; + } + +} diff --git a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java b/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java index 7f02677c..a992818a 100644 --- a/maxkey-protocols/maxkey-protocol-authorize/src/main/java/org/maxkey/authz/singlelogout/SingleLogout.java +++ b/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 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 nvps = new ArrayList(); - // 通过map集成entrySet方法获取entity - Set> entrySet = paramMap.entrySet(); - // 循环遍历,获取迭代器 - Iterator> iterator = entrySet.iterator(); - while (iterator.hasNext()) { - Entry 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); } } diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java index b8901520..7461235f 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas20AuthorizeEndpoint.java +++ b/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 \ 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 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(); } } diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java index 8e7fec65..6adaf493 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/Cas30AuthorizeEndpoint.java +++ b/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); } } diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java index fbddb0e9..c6d73d08 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasAuthorizeEndpoint.java +++ b/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); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java index 0d0e9639..180148e4 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasBaseAuthorizeEndpoint.java +++ b/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 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 nvps = new ArrayList(); - // 通过map集成entrySet方法获取entity - Set> entrySet = paramMap.entrySet(); - // 循环遍历,获取迭代器 - Iterator> iterator = entrySet.iterator(); - while (iterator.hasNext()) { - Entry 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(); - } - } - } - } } diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java index 5cad0e03..9c0a64ab 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/CasRestV1Endpoint.java +++ b/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()); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/CasServiceResponse.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/CasServiceResponse.java index 01855bd7..b37d6393 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/CasServiceResponse.java +++ b/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 ArrayListproxies=new ArrayList(); protected HashMap>casAttributes=new HashMap>(); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ProxyServiceResponseBuilder.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ProxyServiceResponseBuilder.java index 9d5ed705..7607f4a1 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ProxyServiceResponseBuilder.java +++ b/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(); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ServiceResponseBuilder.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ServiceResponseBuilder.java index 395f0b6a..faac53e1 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/response/ServiceResponseBuilder.java +++ b/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(); diff --git a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/ticket/CasConstants.java b/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/ticket/CasConstants.java index cd4175e5..63fb6531 100644 --- a/maxkey-protocols/maxkey-protocol-cas/src/main/java/org/maxkey/authz/cas/endpoint/ticket/CasConstants.java +++ b/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. */ -- GitLab