zoukankan      html  css  js  c++  java
  • 单点登录的原理与CAS技术的研究

    1.什么是单点登录?

    关于单点登录技术的说明参考文章:http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html

    一般来说,整个原理大家都比较认可。下一步需要关注的是使用什么技术来实现单点登陆。

    2.选择什么技术实现单点登录?

    经过比较最终选择使用CAS:http://www.oschina.net/p/ja-sig+cas

    3.CAS技术研究

    3.1CAS下载

         CAS分为Server端和client端:

         官网地址:https://www.apereo.org/cas

         Server端的下载地址:https://www.apereo.org/cas/download

         Client端的下载地址:http://downloads.jasig.org/cas-clients/

          至于版本选择:Server端选择4.0,Client选择最新版本3.3.3

    3.2 CAS服务器安装

          现在把Server端和Client端的包下载完成之后,开始进行Server端的服务器搭建。

         1.准备工作

             1.在你的安装环境中安装tomcat(jdk就不说了肯定要提前装好的)。

             2.在环境变量中设置Path=path;%JAVAHOME%/bin,保证能够运行keytool命令,后面要用到。

    image

           3.为了简单测试,在cmd命令窗口中进入tomcat目录。

        2.创建密钥库

    使用 JDK 的 keytool 命令生成密钥库(keystore),其实就是一份 keystore 文件,keystore 必须通过密码才能访问。

    keystore 里包含了多个密钥对(keypair),每个 keypair 都有一个别名(alias),alias 必须保证唯一性,而且都有一个密码,有此可知,keystore 与 keypair 都有自己的密码。

    JDK 也有自己的 keystore,位于 %JAVA_HOME%jrelibsecuritycacerts,其密码就是 changeit,当然也可以通过 keytool 命令来修改。

    我们首先生成 keypair 及其存放 keypair 的 keystore,然后从 keystore 里导出证书,最后将证书导入 JDK 的 keystore 里,Tomcat 在运行时就会自动读取 JDK 的 keystore,以确保所部署的应用可以享受 HTTPS 协议(SSL 通道)带来的安全性。

        2.1生成 keypair

    参考命令

        keytool -genkey –alias  -keyalg RSA -keystore tomcatstore

    image

    • -genkey 生成一个证书的密钥
    • -alias 证书别名
    • -keyalg 指定证书的密钥算法
    • -keystore 指定证书库的名称

    注意:

    1. 为了简化操作,建议 keystore 与 keypair 的密码相同,且均为 abc123。

    2. 提示“您的名字与姓氏是什么?”,这里需要输入一个域名,如果没有域名,测试可用localhost,但是注意一定不能使用ip地址。

    成功之后,会在tomcat目录中生成:

    image

    2.2从 keystore 中导出证书

    参考命令:

    keytool -export -file tomcat.cer -alias tomcat -keystore teststore -storepass abc123

    可双击该证书文件,将该证书安装到“受信任的根证书颁发机构”中,这样在浏览器中使用 HTTPS 协议访问时才不会出现一个红色的叉叉。

    完成命令之后会在tomcat目录中生成:

    image


    2.3 导入证书到 JVM 中

    参考命令:

    keytool -import -keystore "%JAVA_HOME%jrelibsecuritycacerts" -file tomcat.cer -alias tomat -storepass changeit

    默认情况下,Tomcat 将读取 JVM 中的密钥库,而不是用户目录下的 .keystore 密钥库,当然也可以配置 Tomcat 使其读取指定的密钥库。

    3使 Tomcat 支持 HTTPS

      1.这里把刚才生成的keystore文件(teststore)复制到%CATALINA_HOME%conf目录下

      2.修改server.conf文件

    <Connector SSLEnabled="true" clientAuth="false" keystoreFile="teststore" keystorePass="abc123" maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>

    注意事项:
          1.原有的8080端口的connector不变,需要被注释掉的8443端口变成可用,然后在其基础上修改。

    2.protocol不能是“HTTP/1.1”

    5 运行 CAS 服务器

    启动tomcat,在浏览器中输入:

    https://localhost:8443/cas-server-webapp-4.0.0

    image

    4.0版的默认用户名密码是:casuser/Mellon,输入之后:

    image

    退出:

    image

    3.3CAS服务器深入配置

    上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。 首先打开

    tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml
    注释掉:
    image
     
    在后面添加:
    image
     

    修改authenticationManager中的配置【dbAuthHandler】部分:

    image

    在apache-tomcat-7.0.54webappscas-server-webapp-4.0.0WEB-INFlib中添加jar包:

      1.cas-server-support-jdbc-4.0.0.jar

      2.c3p0-0.9.1.2.jar

      3.ojdbc6-11.2.0.3.jar

      此时可以连接oracle进行密码验证了。

    注意:

       1.使用了MD5验证,也就是数据库中存储MD5加密后的密码。

       2.dataSource使用c3p0的配置。

       3.主要要建好对应的表结构。

    3.3CAS客户端配置

    新建一个普通的web工程,其中:

      1.在Client工程WEB-INF/lib下添加cas-client-core-3.3.3.jar包,注意把其他的依赖包全部加上。

      2.修改web.xml

    <!-- ======================== 单点登录/登出 ======================== -->
    
        <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
        <filter>
            <filter-name>CAS Single Sign Out Filter</filter-name>
            <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        </filter>
    
        <!-- 该过滤器负责用户的认证工作,必须启用它 -->
        <filter>
            <filter-name>CAS Authentication Filter</filter-name>
            <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
            <init-param>
                <param-name>casServerLoginUrl</param-name>
                <param-value>https://localhost:8443/cas-server-webapp-4.0.0/login</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://localhost:8080</param-value>
            </init-param>
        </filter>
    
        <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
        <filter>
            <filter-name>CAS Validation Filter</filter-name>
            <filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
            <init-param>
                <param-name>casServerUrlPrefix</param-name>
                <param-value>https://localhost:8443/cas-server-webapp-4.0.0</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://localhost:8080</param-value>
            </init-param>
            <init-param>
                <param-name>redirectAfterValidation</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
    
        <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
        <filter>
            <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
            <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
        </filter>
    
        <!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>CAS Authentication Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>CAS Validation Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>CAS Assertion Thread Local Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <listener>
            <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
        </listener>
        <!-- ======================== 单点登录/登出结束 ======================== -->

    注意:

      1.4.0的配置跟老版本的不一致。

      2.server中的地址最好使用域名,如果没有域名,可以使用localhost。

    输入:localhost:8080/firstclient,转向到验证页面。

    image 

    输入用户名,密码之后,进入firstclient的页面。

    image

    按照相同的配置配置secondclient,在firstclient登录之后,直接输入:localhost:8080/secondclient,不需要登录可以直接进入:

    image

    参考文档:

    http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html

    http://my.oschina.net/huangyong/blog/198109

    http://my.oschina.net/aiguozhe/blog/160934

    http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/

    http://blog.csdn.net/kissliux/article/details/17674443

    http://alexwangjie.iteye.com/blog/2117552

    http://blog.csdn.net/xuke6677/article/details/38845671​

  • 相关阅读:
    WPF的布局--DockPanel
    WPF的布局--StackPanel
    C#中的不可空类型转为可空类型
    linux下安装nodejs及npm
    HTML DOM 事件对象 ondragend 事件
    pc端页面在移动端显示问题
    css设置文字上下居中,一行文字居中,两行或多行文字同样居中。
    超简单的gif图制作工具
    Git创建与合并分支
    props default 数组/对象的默认值应当由一个工厂函数返回
  • 原文地址:https://www.cnblogs.com/sdjnzqr/p/4065653.html
Copyright © 2011-2022 走看看