• -------------------------------------------------------------
  • ====================================

cas 4.X单点登录实战

技能 dewbay 5年前 (2019-04-12) 1672次浏览 已收录 0个评论 扫描二维码

使用工具

maven-3.3.9

cas-4.1.4

Tomcat-7.0.57-win-x64

cas-sample-java-webapp

一、Hello cas

1、下载 Tomcat,解压;修改其 server.xml,增加对 SSL 支持(具体百度):

1 <Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
2 disableUploadTimeout="true" enableLookups="false" maxThreads="25"
3 port="8443" keystoreFile="G:/work/xxx/tomcat.keystore" keystorePass="YOUR PASSWORD HERE"
4 protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
5 secure="true" sslProtocol="TLS" />

1、从 https://github.com/Jasig/cas/releases 下载cas-server 对应的版本;

2、解压,使用 maven 命令 mvn package 对cas进行编译打包,这里可能会出现 2 个问题:

  a.单元测试不通过==》尝试加上-Dmaven.test.skip=true 跳过;

  b.编译到一半编译不过==》进入cas-server-core,执行命令 mvn install -Dmaven.test.skip=true 先将 core 编译为 jar 包后,再进行。

3、将打包好的 cas-server-webapp 下的 war 包复制到 tomcat 下,运行 tomcat 先试试吧;

4、使用账号 casuser,密码 Mellon 登录,成功

5、从 https://github.com/Jasig/java-cas-client 下载 java-cas-client,如上步骤解压编译,编译后不再操作,待用。

6、从 https://github.com/UniconLabs/cas-sample-java-webapp 下载 cas-sample-java-webapp,如上步骤解压编译,编译后不再操作,待用。

二、server 配置数据库连接认证

   上面我们采用的是默认配置,登录账号实际上是在 cas/WEB-INF/deployerConfigContext.xml 配置写死的。当然不符合我们大多数的实际使用场景。现在我们将其改为连接 Mysql 数据库验证。

1、回到我们刚刚 maven 编译的 cas 目录下,将 cas-server-support-jdbc/target/cas-server-support-jdbc-4.1.4.jar 复制到 tomcat/webapp/cas/WEB-INF/lib 下,再复制 mysql-connector-java-5.0.8-bin.jar 到 tomcat/webapp/cas/WEB-INF/lib 下。当然这些你可以在 cas-server-webapp 下的 pom.xml 进行依赖添加再进行打包编译。

2、修改 cas/WEB-INF/deployerConfigContext.xml,这里需要注意修改以下地方:

cas 4.X单点登录实战
1 <bean id="primaryAuthenticationHandler"
2          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
3        <property name="users">
4            <map>
5                <entry key="casuser" value="Mellon"/>
6            </map>
7        </property>
8 </bean>
cas 4.X单点登录实战

注释以上代码,增加如下代码

cas 4.X单点登录实战
 1     <bean id="dataSource"
 2         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 3         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 4         <property name="url"
 5             value="jdbc:mysql://10.3.64.87:3306/cas?characterEncoding=utf-8&amp;autoReconnect=true" />
 6         <property name="username" value="root" />
 7         <property name="password" value="123456" />
 8     </bean>
 9     
10     <bean id="primaryAuthenticationHandler"
11           class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
12           p:dataSource-ref="dataSource"
13           p:passwordEncoder-ref="MD5PasswordEncoder"
14           p:sql="select password from user_info where user_name=?" />
15           
16     <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
17         <constructor-arg index="0">
18             <value>MD5</value>
19         </constructor-arg>
20     </bean>
cas 4.X单点登录实战

这里我们增加了 MySQL 的数据连接 dataSource,并编写了 SQL 查询用户认证信息。

修改完成,我们来测试一下能否通过 MySQL 进行认证。启动 tomcat。

cas 4.X单点登录实战

 登录成功,我们已经成功和 MYSQL 连接成功了。

三、添加客户端

  这里我们将用到第一步里面待用的 cas-sample-java-webapp。

1、将编译好的 cas-sample-java-webapp/target/cas-sample-java-webapp.war 部署到 tomcat 下;

2、找到 tomcat/webapp/cas-sample-java-webapp/WEB-INF/web.xml,删除以下代码

cas 4.X单点登录实战
 1      <init-param>
 2             <param-name>redirectAfterValidation</param-name>
 3             <param-value>true</param-value>
 4         </init-param>
 5         <init-param>
 6             <param-name>useSession</param-name>
 7             <param-value>true</param-value>
 8         </init-param>
 9         <init-param>
10             <param-name>acceptAnyProxy</param-name>
11             <param-value>true</param-value>
12         </init-param>
13         <init-param>
14             <param-name>proxyReceptorUrl</param-name>
15             <param-value>/client/proxyUrl</param-value>
16         </init-param>
17         <init-param>
18             <param-name>proxyCallbackUrl</param-name>
19             <param-value>https://zhuajindian.com:8443/client/proxyUrl</param-value>
20         </init-param>
cas 4.X单点登录实战

将其中的多个 casServerUrlPrefix、serverName、casServerLoginUrl 替换成你自己的 URL。

3、修改 deployerConfigContext.xml,找到下面的代码

1     <bean id="serviceRegistryDao" class="org.jasig.cas.services.JsonServiceRegistryDao"
2           c:configDirectory="${service.registry.config.location:classpath:services}" />

替换为

cas 4.X单点登录实战
1     <!-- 注册服务 -->
2     <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"
3             p:registeredServices-ref="registeredServicesList" />
4 
5     <util:list id="registeredServicesList">
6         <bean class="org.jasig.cas.services.RegexRegisteredService"
7               p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
8               p:serviceId="^(https?|http?|imaps?)://.*" p:evaluationOrder="10000001" />
9     </util:list>
cas 4.X单点登录实战

这里的 serviceId 就是你告诉 cas 服务器端,通过这个正则来判断,符合这个正则表达式的,就是我们自己的客户端。当然这里泛匹配了,你可以根据实际情况来。

4、重启 tomcat,访问刚刚填写在 serverName 处的 URL 试试

cas 4.X单点登录实战

可以看到,我们已经能够成功获取到 Authenticated UserId,也就是登录的用户名。这样,我们的简单 demo 就完成了。

四、自定义登录后的可传递字段,方便客户端读取

  在我们的应用场景中,客户端需要的参数不仅仅是用户名。还需要诸如 userid 等各类信息,那么,接下来我们就来配置获取自定义字段。

1、找到 cas/WEB-INF/deployerConfigContext.xml,注释以下代码:

cas 4.X单点登录实战
 1     <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao"
 2           p:backingMap-ref="attrRepoBackingMap" />
 3 
 4     <util:map id="attrRepoBackingMap">
 5         <entry key="uid" value="uid" />
 6         <entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
 7         <entry key="groupMembership" value="groupMembership" />
 8         <entry>
 9             <key><value>memberOf</value></key>
10             <list>
11                 <value>faculty</value>
12                 <value>staff</value>
13                 <value>org</value>
14             </list>
15         </entry>
16     </util:map>
cas 4.X单点登录实战

替换为:

cas 4.X单点登录实战
 1     <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">
 2         <constructor-arg index="0" ref="dataSource" />
 3         <constructor-arg index="1" value="SELECT id,user_name,mobile,cid FROM user_info WHERE {0}" />
 4             <property name="queryAttributeMapping">
 5                 <map>
 6                     <entry key="username" value="user_name" />
 7                 </map>
 8             </property>
 9             <property name="resultAttributeMapping">
10                 <map>
11                     <entry key="id" value="userId" />
12                     <entry key="user_name" value="username" />
13                     <entry key="mobile" value="mobile" />
14                     <entry key="cid" value="cid" />
15                 </map>
16             </property>
17     </bean>
cas 4.X单点登录实战

其中的 sql 只需要写前半部分,如示例,entry 的 key 代表上面 sql 查询的字段,value 代表服务端传给客户端的参数名,客户端可以通过 value 取出对应的值。

2、修改 cas/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,增加下面这段

cas 4.X单点登录实战
 1 <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
 2     <cas:authenticationSuccess>
 3         <cas:user>${fn:escapeXml(principal.id)}</cas:user>
 4         <!-- 这段 -->
 5         <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
 6             <cas:attributes>
 7                 <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">
 8                     <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
 9                 </c:forEach>
10             </cas:attributes>
11         </c:if>
12         <!-- 这段 end-->
13         <c:if test="${not empty pgtIou}">
14             <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
15         </c:if>
16         <c:if test="${fn:length(chainedAuthentications) > 0}">
17             <cas:proxies>
18                 <c:forEach var="proxy" items="${chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(chainedAuthentications)}" step="1">
19                     <cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
20                 </c:forEach>
21             </cas:proxies>
22         </c:if>
23     </cas:authenticationSuccess>
24 </cas:serviceResponse>
cas 4.X单点登录实战

3、重启 tomcat,登录看效果:

cas 4.X单点登录实战

上面配置的 4 个参数这里显示了 3 个,原来 mobile 字段是因为没有值,所以他默认就不传递了。


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:cas 4.X单点登录实战
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址