• cas 4.X单点登录实战


    使用工具

    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,这里需要注意修改以下地方:

    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>

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

     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>

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

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

     

     登录成功,我们已经成功和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,删除以下代码

     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>

    其中的多个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}" />

    替换为

    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>

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

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

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

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

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

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

     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>

    替换为:

     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>

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

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

     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>

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

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

  • 相关阅读:
    block: cfq 学习01
    SAS,SATA普及文档
    如何查看盘的类型
    [转载] Linux Futex的设计与实现
    C++ std::map的安全遍历并删除元素的方法
    我的vimrc配置
    .vimrc
    RC: blkio throttle 测试
    LTTng
    基于ADL5317的雪崩光电二极管(APD)偏压控制/光功率监测电路的设计
  • 原文地址:https://www.cnblogs.com/secsea/p/5177284.html
Copyright © 2020-2023  润新知