Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 918|回复: 0

用CAS实现SSO单点登陆

[复制链接]

该用户从未签到

发表于 2011-10-13 17:07:52 | 显示全部楼层 |阅读模式
1          什么是SSO
单点登录(SSO,Single Sign-on)是一种方便用户访问多个系统的技术,用户只需在登录时进行一次注册,就可以在多个系统间自由穿梭,不必重复输入用户名和密码来确定身份。 单点登录的实质就是安全上下文(Security Context)或凭证(Credential)在多个应用系统之间的传递或共享。当用户登录系统时,客户端软件根据用户的凭证(例如用户名和密码)为用 户建立一个安全上下文,安全上下文包含用于验证用户的安全信息,系统用这个安全上下文和安全策略来判断用户是否具有访问系统资源的权限。

2          什么是CAS
Yale CAS (Central Authentication Service,中央认证服务)是耶鲁大学的一个开源项目。它为耶鲁大学的网络应用提供了一种标准的用户认证服务,从而实现了SSO的功能。Yale CAS被设计成为一个独立的网络应用程序,它使用javaServlet技术实现,可以作为用户身份认证模块加入到网络应用中。官方网站http://www.ja-sig.org/products/cas

3          所需环境
l        WindowsXP SP2

l        JDK5.0

l        Tomcat5.0.28

l        ANT 1.6.5

l        CAS Server 3.0.4

http://www.ja-sig.org/downloads/cas/cas-server-3.0.4.zip

l        Yale Java Client 2.1.1

http://www.ja-sig.org/downloads/ ... ient-java-2.1.1.zip



4          服务端的配置
4.1        生成安全证书
首先在命令行中切换到 %java_home%\jre\lib\security目录,然后运行
%java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA
密码是:changeit,姓名是:localhost,其他随便写的。

然后运行
%java_home%\bin\keytool -export -alias tomcat -file server.crt
%java_home%\bin\keytool -import -file server.crt -keystore %java_home%/jre/lib/security/cacerts

将C:\Documents and Settings\username\.keystore复制到c:\

4.2        打开tomcat5.0的SSL
修改Tomcat配置文件%tomcat_home%\conf\server.xml,去掉对于SSL的注释,即开放8443端口,并添加以下内容:keystoreFile="c:\\.keystore" keystorePass="changeit"。修改以后内容如下:

<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="false" keystoreFile="c:\\.keystore" keystorePass="changeit" sslProtocol="TLS" />

重新启动Tomcat。

4.3        发布CAS应用
CAS server3.0.4中target目录中的CAS.war复制到%tomcat_home%\webapps目录下。在浏览器中打开https://localhost:8443/cas,会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名必须相同,你可以看到登陆成功的页面。

5          认证代码的实现
5.1        代码
认证的类需要实现AuthenticationHandler接口,如果你想简单一点也可以从类AbstractUsernamePasswordAuthenticationHandler继承。实现代码如下:SimpleTestUsernamePasswordAuthenticationHandler.java package test; import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;import org.jasig.cas.authentication.handler.support.*;import org.springframework.util.StringUtils; public final class SimpleTestUsernamePasswordAuthenticationHandler extends    AbstractUsernamePasswordAuthenticationHandler {//此处为用户验证的具体实现,密码为用户名的长度    public boolean authenticateUsernamePasswordInternal(        final UsernamePasswordCredentials credentials) {        final String username = credentials.getUsername();        final String password = credentials.getPassword();                       if (StringUtils.hasText(username) && StringUtils.hasText(password)            && getPasswordEncoder().encode(password).equals(Integer.toString(username.length())))  {            getLog().debug(                "User [" + username + "] was successfully authenticated.");            return true;        }         getLog().debug("User [" + username + "] failed authentication");         return false;    }     protected void afterPropertiesSetInternal() throws Exception {        super.afterPropertiesSetInternal();        getLog()            .warn(                this.getClass().getName()                    + " is only to be used in a testing environment.  NEVER enable this in a production environment.");    }}将SimpleTestUsernamePasswordAuthenticationHandler.java复制到cas-server-3.0.4\localPlugins\src\test下面。5.2        打包并发布
修改cas-server-3.0.4\webapp\WEB-INF\ deployerConfigContext.xml文件将<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />修改为<bean class="test.SimpleTestUsernamePasswordAuthenticationHandler" />此处修改CAS Server认证时调用我们编写的类。进入cas-server-3.0.4\localPlugins\,运行ant war打包,将cas-server-3.0.4\localPlugins\target\cas.war重新发布到tomcat。在浏览器中打开https://localhost:8443/cas,会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名长度相同,你可以看到登陆成功的页面。说明我们编写的类已经正常工作了。

6          客户端的配置
简单起见,我们修改tomcat自带的例子servlets-examples,使用户打开servlets-examples时要求用户进行单点登陆。具体操作如下:

修改tomcat\webapps\servlets-examples \WEB-INF\web.xml文件,添加以下内容:

<filter-name>CAS Filter</filter-name>

<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

    <init-param>

       <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

       <param-value>https://localhost:8443/cas/login</param-value>

    </init-param>

    <init-param>

       <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

       <param-value>https://localhost:8443/cas/serviceValidate</param-value>

    </init-param>

    <init-param>

       <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

       <param-value>localhost:8080</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>CAS Filter</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>   

将cas-client-java-2.1.1\dist\casclient.jar复制到

tomcat\webapps\servlets-examples \WEB-INF\lib下面,重新启动tomcat。

在浏览器中打开http://localhost:8080/servlets-examples/,此时会提示你是否接受证书,接受后出现登陆页面,输入任意的用户名,密码和用户名长度相同,你可以看到登陆成功后自动调转到servlets-examples应用。到此就大功告成了。7          使用CAS的taglib在web.xml中加入以下内容:    <context-param>        <param-name>edu.yale.its.tp.cas.serverName</param-name>        <param-value>localhost:8084</param-value>    </context-param>退出页面logout.jsp内容如下:<%@page contentType="text/HTML"%><%@page pageEncoding="UTF-8"%><%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas"%><%session.invalidate();%><cas:logout logoutUrl="https://localhost:8443/cas/logout" var="a"/>要求鉴权的代码如下:<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas"%><cas:auth var="netID" scope="session">    <cas:loginUrl>https://localhost:8443/cas/login</cas:loginUrl>    <cas:validateUrl>https://localhost:8443/cas/serviceValidate</cas:validateUrl>    <cas:authorizedProxy>https://localhost:8443/cas/proxyValidate</cas:authorizedProxy>    <cas:service>http://localhost:8084/sso3/hello.jsp</cas:service></cas:auth>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-16 08:15 , Processed in 0.330067 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表