一、教程前言

  1. 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤
  2. 单点登录SSO):请看百科解释猛击这里打开
  3. 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),
    官网:http://www.jasig.org/cas
  4. 本教程环境:
    • Tomcat6.0.29
    • JDK6
    • CAS Server版本:cas-server-3.4.3.1
    • CAS Client版本:cas-client-3.1.12
    • 教程撰写日期:2010-11-05
    • 教程作者:咖啡兔

二、创建证书

啰嗦几句:证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书;本教程由于是演示所以就自己用JDK自带的keytool工具生成证书;如果以后真正在产品环境中使用肯定要去证书提供商去购买,证书认证一般都是由VeriSign认证,
中文官方网站:http://www.verisign.com/cn/

  1. 用JDK自带的keytool工具生成证书:

    命令:keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey

无图不给力,有图有真相:

用keytool生成证书

具体的输入项图片中都有说明,有一点我要解释一下;在输入完密码后提示输入域名是我输入的是sso.wsria.com,其实这个域名是不存在的,但是我为了演示所以虚拟了这个域名,技巧在于修改C:\Windows\System32\drivers\etc\hosts,添加内容如下:

127.0.0.1 sso.wsria.com

这样在访问sso.wsria.com的时候其实是访问的127.0.0.1也就是本机

严重提醒:提示输入域名的时候不能输入IP地址

三、导出证书

命令:D:\keys>keytool -export -file d:/keys/wsria.crt -alias wsria -keystore d:/keys/wsriakey

来点颜色:

使用keytool导出证书

至此导出证书完成,可以分发给应用的JDK使用了,接下来讲解客户端的JVM怎么导入证书

四、为客户端的JVM导入证书

命令:keytool -import -keystore D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security\cacerts -file D:/keys/wsria.crt -alias wsria

来点颜色瞧瞧:

为客户端JVM导入证书

特别说明:D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security — 是jre的目录;密码还是刚刚输入的密码。
至此证书的创建、导出、导入到客户端JVM都已完成,下面开始使用证书到Web服务器中,本教程使用tomcat。

五、应用证书到Web服务器-Tomcat

说是应用起始做的事情就是启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议,为什么加密我就不用啰嗦了吧……
准备好一个干净的tomcat,本教程使用的apache-tomcat-6.0.29
打开tomcat目录的conf/server.xml文件,开启83和87行的注释代码,并设置keystoreFile、keystorePass修改结果如下:

  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
  2. maxThreads="150" scheme="https" secure="true"
  3. clientAuth="false" sslProtocol="TLS"
  4. keystoreFile="D:/keys/wsriakey"
  5. keystorePass="wsria.com"
  6. />

参数说明:

  • keystoreFile:在第一步创建的key存放位置
  • keystorePass:创建证书时的密码

好了,到此Tomcat的SSL启用完成,现在你可以启动tomcat试一下了,例如本教程输入地址:https://sso.wsria.com:8443/
打开的是:

浏览器提示证书错误

好的,那么我们点击“继续浏览此网站(不推荐)。 ”,现在进入Tomcat目录了吧,如果是那么你又向成功迈进了一步。
OK,接下来要配置CAS服务器了。

六、CAS服务器初体验

  1. CAS服务端下载:http://www.jasig.org/cas/download
  2. 下载完成后将cas-server-3.4.3.1.zip解压,解压cas-server-3.4.3/modules/cas-server-webapp-3.4.3.1.war,改名为cas,然后复制cas目录到你的tomcat/webapp目录下
  3. 现在可以访问CAS应用了,当然要使用HTTPS加密协议访问,
    例如本教程地址:https://sso.wsria.com:8443/cas/login ,现在打开了CAS服务器的页面输入admin/admin点击登录(CAS默认的验证规则只要用户名和密码相同就通过)所以如果你看到下面的这张图片你就成功了

CAS登录成功

你成功了吗?如果没有成功请再检查以上步骤!

七、CAS服务器深入配置

上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。
首先打开tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件,配置的地方如下:

  1. 找到第92行处,注释掉:SimpleTestUsernamePasswordAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!
  2. 注释掉92行后在下面添加下面的代码: 
    1. <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    2. <property name="dataSource" ref="dataSource" />
    3. <property name="sql" value="select password from t_admin_user where login_name=?" />
    4. <property name="passwordEncoder" ref="MD5PasswordEncoder"/>
    5. </bean>

    在文件的末尾之前加入如下代码:

    1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    2. <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
    3. <property name="url"><value>jdbc:mysql:///wsriademo</value></property>
    4. <property name="username"><value>root</value></property>
    5. <property name="password"><value>root</value></property>
    6. </bean>
    7. <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
    8. <constructor-arg index="0">
    9. <value>MD5</value>
    10. </constructor-arg>
    11. </bean>
  3. 复制cas-server-3.4.3.1\modules\cas-server-support-jdbc-3.4.3.1.jar和mysql驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
  4. 配置解释:
    • QueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配
    • dataSource我就不用解释了吧,就是使用JDBC查询时的数据源
    • sql语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构: 
      1. CREATE TABLE t_admin_user (
      2. id BIGINT NOT NULL AUTO_INCREMENT,
      3. email VARCHAR(255),
      4. login_name VARCHAR(255) NOT NULL UNIQUE,
      5. name VARCHAR(255),
      6. password VARCHAR(255),
      7. PRIMARY KEY (id)
      8. ) ENGINE=InnoDB;
    • passwordEncoder,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可

八、配置CAS客户端

  1. 添加cas-client的jar包,有两种方式:

    • 传统型:下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
    • Maven: 
      1. <!-- cas -->
      2. <dependency>
      3. <groupId>org.jasig.cas.client</groupId>
      4. <artifactId>cas-client-core</artifactId>
      5. <version>3.1.12</version>
      6. </dependency>
  2. 设置filter
    先上配置信息:
    1. <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
    2. <listener>
    3. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    4. </listener>
    5. <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    6. <filter>
    7. <filter-name>CAS Single Sign Out Filter</filter-name>
    8. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    9. </filter>
    10. <filter-mapping>
    11. <filter-name>CAS Single Sign Out Filter</filter-name>
    12. <url-pattern>/*</url-pattern>
    13. </filter-mapping>
    14. <!-- 该过滤器负责用户的认证工作,必须启用它 -->
    15. <filter>
    16. <filter-name>CASFilter</filter-name>
    17. <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    18. <init-param>
    19. <param-name>casServerLoginUrl</param-name>
    20. <param-value>https://sso.wsria.com:8443/cas/login</param-value>
    21. <!--这里的server是服务端的IP-->
    22. </init-param>
    23. <init-param>
    24. <param-name>serverName</param-name>
    25. <param-value>http://localhost:10000</param-value>
    26. </init-param>
    27. </filter>
    28. <filter-mapping>
    29. <filter-name>CASFilter</filter-name>
    30. <url-pattern>/*</url-pattern>
    31. </filter-mapping>
    32. <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
    33. <filter>
    34. <filter-name>CAS Validation Filter</filter-name>
    35. <filter-class>
    36. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    37. <init-param>
    38. <param-name>casServerUrlPrefix</param-name>
    39. <param-value>https://sso.wsria.com:8443/cas</param-value>
    40. </init-param>
    41. <init-param>
    42. <param-name>serverName</param-name>
    43. <param-value>http://localhost:10000</param-value>
    44. </init-param>
    45. </filter>
    46. <filter-mapping>
    47. <filter-name>CAS Validation Filter</filter-name>
    48. <url-pattern>/*</url-pattern>
    49. </filter-mapping>
    50. <!--
    51. 该过滤器负责实现HttpServletRequest请求的包裹,
    52. 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
    53. -->
    54. <filter>
    55. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    56. <filter-class>
    57. org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    58. </filter>
    59. <filter-mapping>
    60. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    61. <url-pattern>/*</url-pattern>
    62. </filter-mapping>
    63. <!--
    64. 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
    65. 比如AssertionHolder.getAssertion().getPrincipal().getName()。
    66. -->
    67. <filter>
    68. <filter-name>CAS Assertion Thread Local Filter</filter-name>
    69. <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    70. </filter>
    71. <filter-mapping>
    72. <filter-name>CAS Assertion Thread Local Filter</filter-name>
    73. <url-pattern>/*</url-pattern>
    74. </filter-mapping>
    75. <!-- 自动根据单点登录的结果设置本系统的用户信息 -->
    76. <filter>
    77. <display-name>AutoSetUserAdapterFilter</display-name>
    78. <filter-name>AutoSetUserAdapterFilter</filter-name>
    79. <filter-class>com.wsria.demo.filter.AutoSetUserAdapterFilter</filter-class>
    80. </filter>
    81. <filter-mapping>
    82. <filter-name>AutoSetUserAdapterFilter</filter-name>
    83. <url-pattern>/*</url-pattern>
    84. </filter-mapping>
    85. <!-- ======================== 单点登录结束 ======================== -->

    每个Filter的功能我就不多说了,都有注释的,关键要解释一下AutoSetUserAdapterFilter的作用和原理.
    查看完整的web.xml请猛击这里(Google code)

  3. 利用AutoSetUserAdapterFilter自动根据CAS信息设置Session的用户信息
    先看一下这个Filter的源码
    好的,如果你是老程序员应该很快就清楚Filter的目的,如果不太懂我再讲解一下;
    主要是通过CAS的_const_cas_assertion_获取从CAS服务器登陆的用户名,然后再根据系统内部的用户工具(UserUtil.java)来判断是否已经登录过,如果没有登录根据登录名从数据库查询用户信息,最后使用设置把用户信息设置到当前session中。
    这样就把用户信息保存到了Sessino中,我们就可以通过UserUtil工具来获取当前登录的用户了,我在实例项目中也加入了此功能演示,请看代码:main.jsp的第44行处
  4. 补充一下:如果是为一个老项目添加单点登录功能,那么基本不需要其他的修改,设置好上面的filter即可;当然最好获取用户信息的地方都调用一个工具类,统一管理不容易出错。

九、美化CAS服务器界面

CAS服务端(cas-server)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就想网易CSDN的统一认证平台一样,所有子系统的认证都通过此平台来转接,大家可以根据他们的页面自己定制出适合所属应用或者公司的界面;简单介绍一下吧,复制cas\WEB-INF\view\jsp\default\ui的一些JSP文件,每一个文件的用途文件名已经区分了,自己修改了替换一下就可以了。
例如:
登录界面:casLoginView.jsp
登录成功:casGenericSuccess.jsp
登出界面:casLogoutView.jsp

十、结束语

花了一下午时间终于写完了,总共十项也算完美了。
现在看来起始利用CAS实现单点登录其实不难,不要畏惧,更不要排斥!
本教程后面的代码部分均来自本博客wsria-demo项目分支wsria-demo-sso
和本教程相关资料下载

  1. 本教程使用的演示程序,点击这里下载
  2. 使用keytool生成的key和证书,点击这里下载

到此本教程全部结束,希望看完后对你有帮助,如果有帮助还望继续推荐给其他人,有说明意见或者问题请回复或者IM联系我。

转载自what is the RIA? just it…||咖啡兔

JAVA CAS单点登录(SSO) 教程的更多相关文章

  1. JAVA CAS单点登录(SSO)

    一.教程前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Auth ...

  2. CAS单点登录(SSO)完整教程

    转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的 ...

  3. cas 单点登录(SSO)实验之二: cas-client

    cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...

  4. cas 单点登录(SSO)之一: jasig cas-server 安装

    cas 单点登录(SSO)实验之一: jasig cas-server 安装 参考文章: http://my.oschina.net/indestiny/blog/200768#comments ht ...

  5. cas 单点登录(SSO)之中的一个: jasig cas-server 安装

    cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 參考文章: http://my.oschina.net/indestiny/blog/200768#comments ...

  6. cas单点登录 SSO 的实现原理

    原文出处: cutesource   欢迎分享原创到伯乐头条 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户 ...

  7. 开例外!微信小程序登录绕过CAS单点登录(SSO)认证检查

    1 为了让微信API能够绕过CAS认证检查,将微信api入口部分设计为独立的模块.放入controller目录下,命名为wechat.java文件为WechatController.java 文件大体 ...

  8. 聊聊单点登录(SSO)中的CAS认证

    SSO介绍 背景 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录. web 系 ...

  9. SSO之CAS单点登录详细搭建教程

    本教程是我个人编写,花费几个小时的时间,给需要学习的人员学习使用,希望能帮助到你们. [环境说明]:本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下: windows7 ...

随机推荐

  1. beeline连接hive server遭遇MapRedTask (state=08S01,code=1)错误

    采用beeline连接hive server是遭遇到如下错误: 5: jdbc:hive2://bluejoe0/default> select * from hive_triples wher ...

  2. C#操作Excel数据增删改查示例

    Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...

  3. 如何检查mysql中建立的索引是否生效的检测方法及相关参数说明

    所使用的mysql函数explain语法:explain < table_name >例如: explain select * from t3 where id=3952602;expla ...

  4. WebService中控制字符的处理

    情景     最近项目中很多WebService都发不出去,报的错误如下:    Invalid white space character in text to output (in xml 1.1 ...

  5. info sed 中文不完全文档

    快速指南: sed 的一般使用方法:sed -option 'adress|command' -f scpritfiles(1)'|' 只是用来说明性的分隔 adress 和 command,实际使用 ...

  6. Windows VC++常见问题汇总

    1.warning C4996: 'setmode': The POSIX name for this item is deprecated. Instead, use the ISO C++ con ...

  7. What are Upgrade, Product and Package Codes used for? By pusu

    Following content is reprinted from here, please go to the original website for more information. Au ...

  8. Visual Studio通过Web Deploy发布网站报错:An error occurred when the request was processed on the remote computer.

    这个问题很奇怪,不管我怎么重启服务器和自己的开发机,都没有用. 在网上找了很多资料,有说可以尝试去读Windows的错误日志,然后通过日志找原因…(详见Stackoverflow:http://sta ...

  9. 终于解决了我的DISCUZ 无法连接到您的服务器,可能您的服务器处于防火墙后端 论坛云平台的问题~

    事由:由于前几天折腾备份,将论坛源文件误删了大部分,于是我重新下载了源码,传到了空间. 然后问题来了,我关闭纵横搜索提示“无法连接到您的服务器,可能您的服务器处于防火墙后端”,设置纵横搜索页一直显示“ ...

  10. apache 设置禁止访问某些文件或目录

    [apache配置禁止访问]1. 禁止访问某些文件/目录增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:<Files ~ "\.inc$" ...