cas单点登录详细讲解过程及demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/danruoshui315/article/details/47753523

最近公司让我研究cas单点登录,经过一周多的研究终于做出了demo,为了方便自己以后查看也为了给需要的人提供帮助,我决定写成博客。

    首先对于单点登录的原理需要有大致的了解,原理网上的帖子很多,我大致说下:

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。


在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

CAS Server主要负责用户名密码等的认证工作。

由于cas既可以使用https协议也可以使用http协议,由于没有特殊要求故本人选择了http请求做实例分析。

第一步:从官网下载最新版本的casServer和casClinet,地址:

https://www.apereo.org/projects/cas/download-cas

我使用的版本是cas-server-4.0.0和cas-client-3.3.3以eclipse工具为例。

第二步:复制三份tomcat,分别为tomcat-server和tomcat-client1、tomcat-client2

扫描二维码关注公众号,回复: 5983306 查看本文章

第二步;解压下载下来的服务端和客户端,将cas-server-4.0.0\modules下的cas-server-webapp-4.0.0.war复制到tomcat-server下的webapps,启动tomcat(tomcat/bin/startup.bat),输入:http://localhost:8080/cas-server-4.0.0默认会跳转到登陆页面,这里说明一下,使用cas-server3.3.3版本认证的方法是:

org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler

此方法默认用户名密码一致就可以登录,但是4.0以后版本默认认证方式变了,变为:

org.jasig.cas.authentication.AcceptUsersAuthenticationHandler

用户名和密码是写死的,用户名是:casuser,密码是:Mellon

配置认证方式的配置文件为:cas-server\Webapp\WEB-INF\deployerConfigContext.xml

第三步:在eclipse中新建一个web工程,名字为cas-server,将tomcat-server\webapps\cas-server-4.0.0\WEB-INF\classes下面的所有文件全部复制到工程的src下面,将WEB-INF下面的别的内容复制到webapp下,将之前tomcat目录下的webapps的war包和解压的内容删除。

第四步:配置客户端

修改tomcat-client1和tomcat-client2端口号,分别修改的地方为:

<Server port="8005" shutdown="SHUTDOWN">

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />

 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

端口号随意只要不和原来的默认的相同就行

第五步:eclipse中新建两个客户端demo和demo1(都是web工程),复制cas-client-3.3.3\modules下面所有jar包到

工程的lib目录下

第六步:修改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>CASFilter</filter-name>
 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
 <init-param>
  <param-name>casServerLoginUrl</param-name>
  <!-- 这里是服务端的项目登录页 -->
  <param-value>http://localhost:8080/cas-server/login</param-value>
 </init-param>
 <init-param>
  <param-name>serverName</param-name>
  <!-- 项目所在服务器IP+PORT -->
  <param-value>http://localhost:8081</param-value>
 </init-param>
</filter>
<filter-mapping>
 <filter-name>CASFilter</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://localhost:8080/cas-server</param-value>
 </init-param>
 <init-param>
  <param-name>serverName</param-name>
  <!-- 项目所在服务器IP+PORT -->
  <param-value>http://localhost:8081</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>

index.jsp页面添加如下内容:

<%AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
    String username = principal.getName();
 %>
  用户名:<%=username %>&nbsp;&nbsp;
 <a href="
http://localhost:8080/cas-server/logout?service=http://localhost:8081/demo/index.jsp">退出</a>
 <a href="
http://localhost:8082/demo1/index.jsp" style="float: right">进入客户端2</a>

客户端1和2配置完全相同,将之前新建的三个tomcat添加进来,将三个工程分别添加进tomcat中,启动tomcat,

浏览器输入:http://localhost:修改的客户端端口号/项目名称,因为配置了cas就会自动跳转至服务器的登录页面,输入用户名密码即可登录,登录完成后就又会返回到客户端1,点击进入客户端2会发现无需再次登录即可直接访问客户端2

第七步:使用数据库验证用户名密码:

deployerConfigContext.xml里注释掉默认的验证方式primaryAuthenticationHandler添加我们自己的通过数据库匹配的验证方式
 <bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource">
  <property name = "driverClassName" value = "com.mysql.jdbc.Driver" />
  <property name = "url" value = "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" />
  <property name = "username" value = "root" />
  <property name = "password" value = "root" />
 </bean>
 <!-- 以下两种方式都可,第一种使用表明和属性名来匹配,第二种通过sql语句查找 -->
  <bean id="dbmodeHandler" class = "org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
  <property name = "dataSource" ref = "dataSource" />
  <property name = "tableUsers" value = "users" />   
  <property name = "fieldUser" value = "uname" />
  <property name = "fieldPassword" value = "upwd" />
 </bean>
 <!--<bean id="dbmodeHandler" class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
  <property name = "sql" value = "select upwd from users where uname = ?" />
  <property name = "dataSource" ref = "dataSource" />
 </bean>-->
 加上以下方式,相当于dbmodeHandler数据库查出的用户名密码和primaryPrincipalResolver用户输入的对比,相等则登陆成功。
 <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->
    <entry key-ref="dbmodeHandler" value-ref="primaryPrincipalResolver" /> 

至此,单点登录完整的demo算是成功了,但是还有一点小小问题需要说明下,网上曾经有人说将cas-servlet.xml中的p:followServiceRedirects里的false改为true,即可使用logout输入service参数为自己设置的退出页面,千万不要这样设置,这样设置后无法退出我亲自试验过,加参数只需要像我的index.jsp页面那样直接后缀加上:

?service=http://localhost:8081/demo/index.jsp即可。



猜你喜欢

转载自blog.csdn.net/danruoshui315/article/details/47753523
今日推荐