为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

单点登录

2011-10-25 10页 doc 301KB 22阅读

用户头像

is_095955

暂无简介

举报
单点登录一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] [图片] 一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] [图片] ​ 复制地址 ​ 转发到微博 不止者 2011年03月01日 18:12 阅读(0) 评论(0) 分类:参考资料 权限: 仅自己可见 ​ 字体:中▼ ​ 更多▼ ​ 删除 ​ 编辑 一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] 一.开发准备: 环境: OS:windows xp IDE:myeclipse 6.0 web服务器:tomcat 6.0 J...
单点登录
一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] [图片] 一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] [图片] ​ 复制地址 ​ 转发到微博 不止者 2011年03月01日 18:12 阅读(0) 评论(0) 分类:参考资料 权限: 仅自己可见 ​ 字体:中▼ ​ 更多▼ ​ 删除 ​ 编辑 一、CAS在Tomcat中实现单点登录[jdbc验证用户信息] 一.开发准备: 环境: OS:windows xp IDE:myeclipse 6.0 web服务器:tomcat 6.0 JDK: jdk1.6.0_05 数据库:mysql 6.0 准备: cas-client-java-2.1.1.zip http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip  [建议使用迅雷] cas-server-3.3.1-release.zip http://www.ja-sig.org/downloads/cas/cas-server-3.3.1-release.zip [建议使用迅雷下载] 其他所需jar文件: /Files/arix04/need.part1.rar /Files/arix04/need.part2.rar 二.开发步骤: 1.修改本机域名: 大家都知道使用http://localhost:8080/ 就可以访问本机web服务,这里的localhost其实就是一个ip,域名映射,我们可以设置自己的本机域名, 在C:\WINDOWS\system32\drivers\etc下面找到hosts文件,用文本打开,加上一行: 127.0.0.1 http://www.test.com/ 这样修改后,我们启动tomcat服务后,就可以使用http://www.test.com:8080/来访问了。 这步是为了写cookie做准备,使用localhost是无法写入cookie的,不过这个demo中似乎不该也行,看个人吧,因为我写另外一个sso例子的时候这里需要修改域名,所以就把这步写一下。 2.证书生成及导入,使用jdk自带的keytool工具来生成证书 首先打开cmd,cd到自己的%JAVA_HOME%\jre\lib\security下 比如我的是默认目录: C:\Program Files\Java\jdk1.6.0_05\jre\lib\security 然后执行命令(蓝色是注释不用执行): 下面2行是删除已经存在的证书,如果没有也不影响 keytool -delete -alias tomcatsso -keystore cacerts -storepass changeit  keytool -delete -alias tomcatsso -storepass changeit keytool -list -keystore cacerts -storepass changeit  下面这行要注意,cn要改成你的本机域名,我的如下: keytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=www.test.com" -storepass changeit  这里要求输入密码,2次输入一致就OK了 keytool -export -alias tomcatsso -file tomcatsso.crt -storepass changeit keytool -import -alias tomcatsso -file tomcatsso.crt -keystore cacerts -storepass changeit  keytool -list -keystore cacerts -storepass changeit 把上面的命令都执行一遍就OK了,建议一行一行的执行,避免出错。如果成功的话, 你会在C:\Documents and Settings\当前用户[我的是C:\Documents and Settings\Administrator] 目录下发现.keystore文件, 在%JAVA_HOME%\jre\lib\security目录下发现tomcatsso.crt,如果这2个文件都存在的话,那么恭喜你,证书已经导入成功了。 3.在tomcat中加上对ssl的支持 首先在tomcat中加上对ssl的支持,在conf/server.xml中加入下面内容: Code 上面的文件路径填你自己的,密码就是刚才生成证书时你输入的密码。 然后启动你的tomcat服务器,测试这个地址, https://www.test.com:8443/ 如果出来tomcat主页那么你的ssl就配置成功了. 4.测试一个简单的CAS例子 到这里,我们就可以开始测试一个简单的cas单点登录的例子了, 从你的cas-server-3.3.1\modules中找出cas.war放到tomcat/webapps下面(cas-server-webapp-3.3.1.war重命名即可)。 现在cas默认的server端已经有了,下面自己写2个客户端测试一下吧 MyEclipse里面新建web project:SSO_Pro1 新建类HelloWorldExample Code package servlet; import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /**  * The simplest possible servlet.  *  * @author James Duncan Davidson  */ public class HelloWorldExample extends HttpServlet {     public void doGet(HttpServletRequest request,                       HttpServletResponse response)         throws IOException, ServletException     {         response.setContentType("text/html");         PrintWriter out = response.getWriter();         out.println("");         out.println("");         String title = "hello world!";         out.println("" + title + "");         out.println("");         out.println("");         out.println("");         out.println("");         out.println("");         out.println("");         out.println("

" + title + "

");         out.println("");         out.println("");     } } 在web.xml文件添加CASFilter与servlet映射。 Code                    CAS Filter          edu.yale.its.tp.cas.client.filter.CASFilter                        edu.yale.its.tp.cas.client.filter.loginUrl              https://www.test.com:8443/cas/login                                  edu.yale.its.tp.cas.client.filter.validateUrl              https://www.test.com:8443/cas/serviceValidate                                  edu.yale.its.tp.cas.client.filter.serverName              www.test.com:8080                                     CAS Filter          /servlet/*                     HelloWorldExample         servlet.HelloWorldExample                   HelloWorldExample         /servlet/helloWorldExample                        index.jsp      同样,再建一个web project : SSO_Pro2 HelloWorldExample与web.xml直接从SSO_Pro1中copy即可。 OK,现在已经准备就绪,启动tomcat,然后访问: http://www.test.com:8080/SSO_Pro1/servlet/helloWorldExample 可能会出现如下界面:   点击继续浏览此网站看看是否跳转到了CAS Server的登录界面。 如果浏览器框显示为红色,是因为该证书为非信任证书,你可以导入到信任证书即可,操作很简单,在浏览器地址栏上方按提示导入即可,则以后访问就不会出现1图。 cas服务端默认的验证机制是输入2串相同的字符串,随便输入arix04/arix04,点击登录即可。登录成功的页面如下图: 可以看到图 中地址栏里的地址多出了一个 ticket 参数,这就是 CAS 分配给当前应用的 ST(Service Ticket)。 此时,在浏览器中输入: http://www.test.com:8080/SSO_Pro2/servlet/helloWorldExample,则不用再次登录,到此,简单的单点登录已经实现。 5.定义自己的CAS验证机制 到这里,估计很多朋友肯定想问如何自定义自己的验证机制,比如使用咱们最常用的数据库:用户名/密码,验证的方式, 呵呵,别着急,下面就来和大家说一说如何来自定义CAS Server端的验证机制,咱们来一起实现一个基于mysql数据库 用户名/密码 验证的列子。 首先先和大家介绍一下CAS的扩展认证接口 CAS Server 负责完成对用户的认证工作,它会处理登录时的用户凭证 (Credentials) 信息,用户名/密码对是最常见的凭证信息。CAS Server 可能需要到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户名/密码,还可能通过 LDAP Server 获取等,在这种情况下,CAS 提供了一种灵活但统一的接口和实现分离的方式,实际使用中 CAS 采用哪种方式认证是与 CAS 的基本协议分离开的,用户可以根据认证的接口去定制和扩展 扩展 AuthenticationHandler CAS 提供扩展认证的核心是 AuthenticationHandler 接口,该接口定义如下: Code public interface AuthenticationHandler {     /**      * Method to determine if the credentials supplied are valid.      * @param credentials The credentials to validate.      * @return true if valid, return false otherwise.      * @throws AuthenticationException An AuthenticationException can contain      * details about why a particular authentication request failed.      */     boolean authenticate(Credentials credentials) throws AuthenticationException; /**      * Method to check if the handler knows how to handle the credentials      * provided. It may be a simple check of the Credentials class or something      * more complicated such as scanning the information contained in the      * Credentials object.       * @param credentials The credentials to check.      * @return true if the handler supports the Credentials, false othewrise.      */     boolean supports(Credentials credentials); } 该接口定义了 2 个需要实现的,supports ()方法用于检查所给的包含认证信息的Credentials 是否受当前 AuthenticationHandler 支持;而 authenticate() 方法则担当验证认证信息的任务,这也是需要扩展的主要方法,根据情况与存储合法认证信息的介质进行交互,返回 boolean 类型的值,true 表示验证通过,false 表示验证失败。 CAS3中还提供了对AuthenticationHandler 接口的一些抽象实现,比如,可能需要在执行authenticate() 方法前后执行某些其他操作,那么可以让自己的认证类扩展下面的抽象类: Code public abstract class AbstractPreAndPostProcessingAuthenticationHandler                                             implements AuthenticateHandler{     protected Log log = LogFactory.getLog(this.getClass());     protected boolean preAuthenticate(final Credentials credentials) {         return true;     }     protected boolean postAuthenticate(final Credentials credentials,         final boolean authenticated) {         return authenticated;     }     public final boolean authenticate(final Credentials credentials)         throws AuthenticationException {         if (!preAuthenticate(credentials)) {             return false;         }         final boolean authenticated = doAuthentication(credentials);         return postAuthenticate(credentials, authenticated);     }     protected abstract boolean doAuthentication(final Credentials credentials)  throws AuthenticationException; } AbstractPreAndPostProcessingAuthenticationHandler 类新定义了 preAuthenticate() 方法和 postAuthenticate() 方法,而实际的认证工作交由 doAuthentication() 方法来执行。因此,如果需要在认证前后执行一些额外的操作,可以分别扩展 preAuthenticate()和 ppstAuthenticate() 方法,而 doAuthentication() 取代 authenticate() 成为了子类必须要实现的方法。 由于实际运用中,最常用的是用户名和密码方式的认证,CAS3 提供了针对该方式的实现,如下所示: Code public abstract class AbstractUsernamePasswordAuthenticationHandler extends                         AbstractPreAndPostProcessingAuthenticationHandler{  protected final boolean doAuthentication(final Credentials credentials)  throws AuthenticationException {  return authenticateUsernamePasswordInternal((UsernamePasswordCredentials) credentials);  }  protected abstract boolean authenticateUsernamePasswordInternal(         final UsernamePasswordCredentials credentials) throws AuthenticationException;    protected final PasswordEncoder getPasswordEncoder() {  return this.passwordEncoder;  } public final void setPasswordEncoder(final PasswordEncoder passwordEncoder) {  this.passwordEncoder = passwordEncoder;     } } 基于用户名密码的认证方式可直接扩展自 AbstractUsernamePasswordAuthenticationHandler,验证用户名密码的具体操作通过实现 authenticateUsernamePasswordInternal() 方法达到,另外,通常情况下密码会是加密过的,setPasswordEncoder() 方法就是用于指定适当的加密器。 从以上清单中可以看到,doAuthentication() 方法的参数是 Credentials 类型,这是包含用户认证信息的一个接口,对于用户名密码类型的认证信息,可以直接使用 UsernamePasswordCredentials,如果需要扩展其他类型的认证信息,需要实现Credentials接口,并且实现相应的 CredentialsToPrincipalResolver 接口,其具体方法可以借鉴 UsernamePasswordCredentials 和 UsernamePasswordCredentialsToPrincipalResolver。 了解一下上面一段原理后,咱们来写这个实际的例子吧: cas-server-3.1.1-release.zip 包解开后,在 modules 目录下可以找到包 cas-server-support-jdbc-3.1.1.jar,其提供了通过 JDBC 连接数据库进行验证的缺省实现,基于该包的支持,我们只需要做一些配置工作即可实现 JDBC 认证。 [1].给出mysql建表语句,很简单,就一张user表,其他数据库也一样。 Code SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for user -- ---------------------------- CREATE TABLE `user` (   `id` int(11) NOT NULL auto_increment,   `username` varchar(20) NOT NULL,   `password` varchar(50) NOT NULL,   PRIMARY KEY  (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records  -- ---------------------------- INSERT INTO `user` VALUES ('1', 'arix04', 'e10adc3949ba59abbe56e057f20f883e'); 这里插了一条记录,用户名/密码:arix04/123456;使用的md5加密。 [2].配置DataSource 找到tomcat/webapps/cas/WEB-INF目录(这里建议在做一下操作时先删除cas.war,只留下已经解包的cas工程) 找到deployerConfigContext.xml文件插入下面这段: Code                 com.mysql.jdbc.Driver                       jdbc:mysql://localhost:3306/cas_test                       root                       root      
/
本文档为【单点登录】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索