当前位置: 首页 > news >正文

口碑好的秦皇岛网站建设哪里有/济南网络推广

口碑好的秦皇岛网站建设哪里有,济南网络推广,襄阳住房城乡建设厅官方网站,wordpress图片无法居中2019独角兽企业重金招聘Python工程师标准>>> CAS(Central Authentication Service)框架是一个开源的单点登陆框架。 最近公司要将几个产品实现单点登陆,同事在负责技术筛选时选择了CAS,并已实现了单点登陆功能&#xf…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    CAS(Central Authentication Service)框架是一个开源的单点登陆框架。 最近公司要将几个产品实现单点登陆,同事在负责技术筛选时选择了CAS,并已实现了单点登陆功能,但是在配置代理功能时,遇到了诸多问题,目前虽然代理勉强可用,但问题重重,比如系统A在后台需要访问系统B的功能,在此情景中,系统A就相当于代理应用,而系统B是被代理的应用。

问题如下:
1.系统A作为代理,不能向被代理应用系统B发送
POST方式的HTTP请求。
2.系统A向系统B发送GET请求时,不能以URL附加的方式传参数(形如    http://myhost.com:8080/myapp?name=abc),只能以RESTFUL风格传参数(形如:http://myhost.com:8080/myapp/abc)。
3.测试期间,应用服务器重启后,偶尔
出现系统A代理失效的情况,此时需要注销用户,重新登陆。 

如上种种,极大地限制了CAS单点登陆的灵活性及稳定性。据了解,同事在实现代理功能时,稍微走了偏门,其大概实现方式如下:

 1.在CAS验证服务器后台用户表中增加一个字段castgc,当用户验证通过时,可用于保存cookie数据tgc(Ticket Granting Cookie)。
 2.当用户浏览器访问系统A时,被重定向至CAS服务器进行验证,正确输入帐密后通过验证,服务器后台保存castgc字段值至用户表中,同时CAS客户端系统A将此castgc保存至session中,以备代理时使用。
 3.系统A以代理身份访问系统B时,会从session中取出castgc,放入请求头(request.setHeader("Cookie",castgc);)。然后系统B接收到此请求,会拿着此Cookie到CAS服务器验证,验证通过后,便重定向至系统B,让其响应代理即系统A,整个请求处理即告完成。


    OK,回到主题,我将借鉴网上的部分资料并以最接近官方的方式和最少的配置实现CAS代理功能。在开始之前,我们先给本地机器做些小小的改动,找到本地系统中的文件C:\WINDOWS\system32\drivers\etc\hosts,在末尾加上

########### 
127.0.0.1 cas-server.test.com 
127.0.0.1 cas-client1.test.com 
127.0.0.1 cas-client2.test.com 
###########

目的是为了让我们便于区别cas服务端与各个客户端的url,同时加深理解。

1.下载CAS服务端和客户端的最新版本:

CAS服务端:http://downloads.jasig.org/cas/cas-server-3.5.2-release.zip
CAS客户端:http://downloads.jasig.org/cas-clients/cas-client-3.2.1-release.zip

2.部署服务端: 首先将它们全部解压。先看服务端,解压后的目录中找到cas-server-3.5.2\modules\cas-server-webapp-3.5.2.war,这就是打包后的服务端程序,把它拷出来重命名为cas-server,直接丢进tomcat中就可以在运行时被自动解压并访问了。(注意访问的URL,就是前面配置过的) QQ截图20130321113506

    由于本文不使用https方式访问,为了使http方式的单点登陆功能生效,必须对工程中的文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml做一点修改,将其中的p:cookieSecure="true"改为p:cookieSecure="false",即可实现http单点登陆。但还要再配置\WEB-INF\deployerConfigContext.xml,在

<beanclass="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient" />

中增一个属性 p:requireSecure="false",否则后面的代理票据无法生成,也就无法实现代理功能。 

3.构建客户端工程cas-client1: 客户端的工程也很简单,用eclipse创建一个Dynamic Web Project,命名为cas-client1,然后做点改动。

a.将解压后目录中的\cas-client-3.2.1\modules\cas-client-core-3.2.1.jar拷到cas-client1工程的lib目录下。
b.将官方的4个filter拷到工程的web.xml文件中,参考官方文档:
https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml ,并自己加上对应的filter-mapping(完整配置会在文后贴出),并将其中的所有filter配置中init-param对应的url进行相应的修改,如:

<filter><filter-name>CAS Authentication Filter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>http://cas-server.test.com:8080/cas-server/login</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://cas-client1.test.com:8080</param-value></init-param>
</filter>
<filter><filter-name>CAS Validation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>http://cas-server.test.com:8080/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://cas-client1.test.com:8080</param-value></init-param>
</filter>


其中要注意的是,官方声明: Proxy Authentication  If you are using proxy validation , you should map the validation filter  before  the authentication filter.也就是说前面配置的4个filter,其中validation filter必须在authentication filter之前先被映射。如下:
<filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping><filter-name>CAS Authentication Filter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
c.如上是官方文档中的配置,除此之外,我们要实现代理,还要在validation filter中加入两个参数,如下:
<init-param><param-name>proxyCallbackUrl</param-name><param-value>http://cas-client1.test.com:8080/cas-client1/proxyCallback</param-value>
</init-param>
<init-param><param-name>proxyReceptorUrl</param-name><param-value>/proxyCallback</param-value>
</init-param>
加入filter-mapping供后面的被代理应用cas-client2回调时使用,如下:
<filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/proxyCallback</url-pattern>
</filter-mapping>
d.写一个自定义的servlet,并配置到web.xml中。核心代码如下:  
public class HelloWorldExample extends HttpServlet {private static final long serialVersionUID = 1L;@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {// ........HttpSession session = request.getSession();final Assertion assertion = (Assertion) (session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION) : session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION));// 被代理应用的URLString serviceUrl = "http://cas-client2.test.com:8080/cas-client2/HelloWorldExample";final String proxyTicket = assertion.getPrincipal().getProxyTicketFor(serviceUrl);URL url = new URL(serviceUrl + "?ticket=" + proxyTicket);// 不需要cookie,只需传入代理票据HttpURLConnection conn = null;conn = (HttpURLConnection) url.openConnection();// conn.setRequestMethod("POST");//使用POST方式conn.setDoOutput(true);OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");osw.write("name=阿J小虫abc");// 传参osw.close();// 业务处理// ........}
}
 web.xml加入如下:
<!-- my filter -->
<servlet><servlet-name>HelloWorldExample</servlet-name><servlet-class>HelloWorldExample</servlet-class>
</servlet>
<servlet-mapping><servlet-name>HelloWorldExample</servlet-name><url-pattern>/HelloWorldExample</url-pattern>
</servlet-mapping>

 到此为止,我们的第一个客户端工程cas-client1构建完毕,将它与cas-server一起部署到tomcat并运行,即可看到单点登陆的效果(用户名和密码相同即可通过验证)。

QQ截图20130321133913

 4.构建客户端工程cas-client2: 将cas-client1复制出来重命名为cas-client2。具体来讲,作为被代理应用,它主要是用来从cas-client1获取请求参数name=阿J小虫,然后响应代理(输出数据)。
代码块如下:
String name = request.getParameter("name");
if (name != null)System.out.println(new String(name.getBytes("iso-8859-1"), "utf-8"));
PrintWriter out = response.getWriter();
out.print("congratulation!you got it from cas-client2!");
另外,被代理应用也可以作为第三个客户端的代理应用,但在此不作考虑,所以可以注释掉validation filter中的参数proxyCallbackUrl和proxyReceptorUrl,并加入另外两个参数redirectAfterValidation和acceptAnyProxy,如下:
<filter><filter-name>CAS Validation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>http://cas-server.test.com:8080/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://cas-client2.test.com:8080</param-value></init-param> <!-- <init-param> <param-name>proxyCallbackUrl</param-name> <param-value>http://cas-client2.test.com:8080/cas-client2/proxyCallback</param-value> </init-param> <init-param> <param-name>proxyReceptorUrl</param-name> <param-value>/proxyCallback</param-value> </init-param> --><init-param> <!-- redirectAfterValidation must be false, otherwise the request params from proxying app could not be received --><param-name>redirectAfterValidation</param-name><param-value>false</param-value></init-param><init-param><param-name>acceptAnyProxy</param-name><param-value>true</param-value></init-param>
</filter>

最后记得将拷过来的web.xml文件中的相关url改成与cas-client2对应的。与cas-server和cas-client1一同部署,登陆cas-client1代理程序时,后台成功实现对cas-client2的访问并获取返回数据。 QQ截图20130321151300

注意事项: 
1.当用eclipse进行调试时,如把断点设置在获取响应之前,可能会出现异常,如下:

三月 21, 2013 3:00:30 下午
org.jasig.cas.client.validation.AbstractTicketValidationFilter doFilter
WARNING: org.jasig.cas.client.validation.TicketValidationException:
未能够识别出目标 'ST-2-cMeR2w5xzryNeSuh3jx9-cas01.example.org'票根

一开始我也以为票根有问题,此时,只要取消断点重新登陆一下就能顺利响应了,至于为什么设置断点就报错,可能是网络的响应被断点中断从而延时了导致的。 

2.被代理应用cas-client2中的validation filter参数redirectAfterValidation必须设置为false,否则接收不到代理传过来的请求参数,如name=阿J小虫。还有参数acceptAnyProxy与allowedProxyChains二选一,如果配置acceptAnyProxy,必须为true,本文示例使用此参数。 

示例工程下载: 
请到作者博客原文末尾处下载:
http://www.ichatter.cn/2013/03/21/385/

转载于:https://my.oschina.net/ichatter/blog/129642

http://www.lbrq.cn/news/1344529.html

相关文章:

  • 高唐做创建网站的公司/整合营销传播的定义
  • wordpress cos/厦门seo优化推广
  • 云南省建设工程网站/网站建站公司
  • 公司网站如何做百度收录/百度明星人气排行榜
  • 励志做的很好的网站/百度收录入口
  • 转播网站如何做/推广app赚佣金平台有哪些
  • 西安做网站优化公司报价/seo入门培训学校
  • 太钢建设公司官网/网络优化的基本方法
  • wordpress 音乐列表/搜索引擎优化的具体措施
  • 朱能源做网站/淘宝流量平台
  • 网站开发任务概述/链友之家
  • 二级网站怎么建/网站关键词优化wang
  • php做网站登陆验证/单词优化和整站优化
  • asp伪静态网站如何做筛选/百度推广客户端mac版
  • 银川做企业网站/百度入口网页版
  • 网页制作与网站建设宝典 pdf/杭州seo优化
  • 什么建设网站/厦门人才网官网招聘
  • 网站建设痛点/北京最新发布信息
  • 用java做网站后辍名是什么/百度资源共享
  • 服务器打不开网站/营销策划经典案例
  • 深圳专业网站制作费用/义乌最好的电商培训学校
  • dedecms 做影网站/网站收录情况
  • c asp.net 发布网站/app广告联盟平台
  • 商贸有限公司企业简介/安卓优化大师老版本
  • 网站建设app开发合同/外贸接单平台网站
  • 部门网站建设管理典型经验材料/杭州网站推广与优化
  • 昆山广告设计制作公司/河北百度seo
  • 珠海在线网站制作公司/品牌策划是做什么的
  • 天津和平做网站贵吗/海外营销方案
  • 做女装网站应怎么定位/网页制作流程
  • PWM波的频谱分析及matlab 验证[电路原理]
  • ubuntu22.04安装autoware.universe
  • 5Python异常处理与模块导入全指南
  • Day38--动态规划--322. 零钱兑换,279. 完全平方数,139. 单词拆分,56. 携带矿石资源(卡码网),背包问题总结
  • Python中的Lambda函数详解
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)