基于CAS的SSO单点登录
2017-06-22 21:15
323 查看
1.场景还原
有木有总听到单点登录?自己却不知道其中的原理;单点登录(SSO)是一种目前比较流行的业务 整合方案;用户只需要登录一次就可以访问互相信任的应用系统;今天笔者就基于cas实现单点登录,希望能给以大家启发。2.注意事项
在该实例工程中,包含3个tomcat : tomcat-main,tomcat-1,tomcat-2;tomcat-main要实现https访问;tomcat-1以及tomcat-2代表两个子系统。3.tomcat-main设置
①在linux环境下的usr/local目录下创建java,tomcat-main,tomcat-1,tomcat-2四个目录②上传对应的tar包,并解压,记得jdk要在/etc/profile中配置环境(在profile末尾加)
③这里就不设置https了,因为域名审核严格,https设置的可以看笔者上篇https的设置以及http自动跳转https
④下载CAS-Server,链接:https://www.apereo.org/projects/cas/download-cas,我这里下载的是4.0.0,解压提取modules/cas-server-webapp.war,将改文件改名cas.war,上传至tomcat-main的webapps下
⑤修改deployerConfigContext.xml (cas/WEB-INF)增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。
⑥修改 ticketGrantingTicketCookieGenerator.xml(cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml) 中ticketGrantingTicketCookieGenerator p:cookieSecure 属性修改为 false
我这里采用了ngrok内网转发,域名配置信息截图:
主应用:
客户端1:
客户端2:
⑦将linux虚拟主机分配给三个不同的域名,
然后将三个域名id复制到ngrok客户端进行转发,访问http://dajiu.ngrok.cc/cas/login
⑧vim deployerConfigContext.xml (cas/WEB-INF),查看密码
然后登陆,效果图
4.客户端tomcat的设置
①编辑修改tomcat-1/conf/server.xml,将8005修改为18005
将8080改为18080,8443改为18443
将8009改为18009,8443改为18443
总共有5个端口号的修改;
②tomcat-2中的5个端口如上的方式改为2开头,28005,28080,28009,28443,这里就不赘述了
③下载cas-client,链接:http://developer.jasig.org/cas-clients/,这里笔者下载的是3.2.1版本;解压提取modules下的client-core-3.2.1.jar和commoms-logging.jar,然后将两者上传到tomcat1/webspps/examples/WEB_INF/lib下
然后访问http://client1.ngrok.cc/examples/servlets/,效果为
这表示tomcat-1的环境基本搭建好了;
④然后在tomcat-1\webapps\examples\WEB-INF\web.xml 文件中增加如下内容
<!--
======================== 单点登录开始 ======================== -->
<!--
用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--
该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS
Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS
Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://dajiu.ngrok.cc/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.ngrok.cc</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS
Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责对Ticket的校验工作,必须启用它 -->
<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://dajiu.ngrok.cc/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.ngrok.cc</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS
Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>CAS
HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<filter>
<filter-name>CAS
Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
======================== 单点登录结束 ======================== -->
那么tomcat-2也是这般设置,只是链接变了
<!--
======================== 单点登录开始 ======================== -->
<!--
用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--
该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS
Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS
Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://dajiu.ngrok.cc/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.ngrok.cc</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS
Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责对Ticket的校验工作,必须启用它 -->
<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://dajiu.ngrok.cc/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.ngrok.cc</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS
Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>CAS
HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<filter>
<filter-name>CAS
Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS
Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
======================== 单点登录结束 ======================== -->
好了,这里工程就全面竣工了,最后就是检视工程效果了。工程中的两个client端的应用就引用tomcat现成的examples来示范效果:
预期效果: 打开client1 url —-> 跳转cas server 验证 —-> 显示client1的应用 —-> 打开client2 url —-> 显示client2 应用 —-> 注销cas server —-> 打开client1/client2 url —-> 重新跳转到cas server 验证.
先访问http://client1.ngrok.cc/examples/servlets/servlet/HelloWorldExample,效果图:
输入用户名:casuser,密码:Mellon
接着访问client2的链接:http://client2.ngrok.cc/examples/servlets/servlet/HelloWorldExample
这次没有进入登录界面哦!
然后我们再来注销系统http://dajiu.ngrok.cc/cas/logout
再来访问client2, http://client2.ngrok.cc/examples/servlets/servlet/HelloWorldExample
又回到登录界面了,因为之前注销一次;是不是跟预期效果一致啊,嗯呢,一致就对了,那么基于cas的单点登录就完结了。
话谈原理:
该篇博文主要讲解基于cas中央认证中心,主系统一旦认证成功,再访问他下面受信任的子系统,就无需再次登录,这就是所谓的单点登录。我是张星,欢迎大家加入博主技术交流群,群号:313145288
相关文章推荐
- SSO基于cas的登录
- IT忍者神龟之基于CAS实现单点登录(SSO)之配置CAS服务端的数据库查询认证机制(一)
- 基于CAS实现单点登录(SSO):工作原理
- 基于CAS实现单点登录(SSO):自定义登录验证方法
- 基于CAS实现单点登录(SSO):工作原理
- 基于CAS的单点登录SSO[3]: 改造cas-overlays-template支持Redis存储Ticket
- SSO 基于CAS实现单点登录 实例解析(二)
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
- 基于CAS的单点登录SSO[5]: 基于Springboot实现CAS客户端的前后端分离
- 转)SSO单点登录在互联网电商应用中的解决方案(基于CAS的改造)
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
- SSO 基于CAS实现单点登录 实例解析(二)
- 基于CAS的单点登录SSO[4]: 加入两个CAS客户端测试单点登录
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
- SSO 基于CAS实现单点登录 实例解析(二)
- 基于CAS SHIRO LDAP 的SSO单点登录
- [原]基于CAS实现单点登录(SSO):cas client端的退出问题
- [原]基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息
- SSO单点登录在互联网电商应用中的解决方案(基于CAS的改造)
- 基于CAS的单点登录SSO[1]: 搭建CAS单点登录demo