您的位置:首页 > 其它

基于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息