单点登录 --CAS 简单搭建

本贴最后更新于 2535 天前,其中的信息可能已经时移俗易

1. 单点登录简介

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

2. 环境搭建

  1. 准备 2 台 linux 机器,分别为 192.168.0.80,192.168.0.112,以下简称 80/112
  2. 80 存放 cas 服务器和 client1,112 存放 client2
  3. 准备 3 个 tomcat 分别取名 tomcat-cas/tomcat-app1/tomcat/app2
  4. tomcat-cas 使用 https,端口 8443,app1/app2 端口都为 9000
  5. 修改 2 个机器和本机的 hosts
192.168.0.80 cas.infozr.com
192.168.0.80 app1.infozr.com
192.168.0.112 app2.infozr.com

3. 证书生成

1. 配置证书

keytool -genkeypair -alias infozr  -keyalg RSA -keysize 1024 -keypass 123456 -validity 3650 -keystore /home/keys/infozr.keystore -storepass 123456

1e0ea7e95c844a82b7f4cf78709ecd84-QQ20170419174510.png

  1. 以上为 jdk1.8 的配置命令,低版本命令略有不同,自行 baidu
  2. 名字和姓氏必须和 cas 的域名一致,如上图所示和 hosts 的域名一致

2. 导出证书

keytool -export -alias infozr  -keystore  /home/keys/infozr.keystore  -file  /home/keys/infozr.crt  -storepass 123456

44dbdfcc12494910899355723b4daaaf-QQ20170419174522.png

3. 导入客户端证书

keytool -import -keystore /usr/java/jdk1.8.0_40/jre/lib/security/cacerts -file /home/keys/infozr.crt  -alias infozr

f13bd4925a1e4c0aa86ed7b1d6e9166e-QQ20170419174532.png

每台客户端的机器都必须将此证书导入到 jre 相关目录

可以直接使用 scp 命令复制即可

scp root@192.168.0.80:/usr/java/jdk1.8.0_40/jre/lib/security/cacerts /usr/java/jdk1.8.0_40/jre/lib/security/

4. cas server 版本选择

我们在 cas 的 github 项目中可以看到版本的发布情况,我们可以自己根据特性来选择版本。

https://github.com/apereo/cas/releases

点击 DOCS 然后查看 Getting Started 中的 Installation Requirements 可以看到需要哪些支持。

原则上越新的稳定版本越好,但是看到 5.0 版本以上基本都需要 jdk1.8 以上的支持,而且需要 gradle 构建工具来进行编译,4.1.11 则需要 maven3.3 版本进行编译。

官网中 4.0.0 版本是有发布直接可用的 war 包版本的,我们直接使用 4.0.0 作为例子。

所以我选择了 CAS v4.0.0 版本。

https://github.com/apereo/cas/releases

在下载页面找到 4.0.0 后选择 release.zip 下载(只有 4.0.0 有这个选项,其他版本都只有源码):

5. cas server 解压 war 包部署到 tomcat

1. war 包名修改

我们把下载好的 release.zip 解压出来得到 cas server 4.0.0 的文件夹,文件夹中有 module 文件夹里面有可用的 war 包。

注意只有 4.0.0 版本的有 module 文件夹和可用 war 包,其他版本的源码 zip 解压出来是没有的,需要自己编译打包。

ps:!!!!注意是 cas-server-webapp-4.0.0.war 包,别用错 cas-management-webapp-4.0.0.war 了,否则后面会出现页面重定向错误

然后我们把 war 包复制到 tomcat 的 webapp 文件夹,为了方便访问,我们先把 war 包名称修改成 cas.war。运行 tomcat 即可解压出 cas-server 项目。

这样我们就能访问 cas-server 项目了。

2. 端口修改

如果 tomcat 的端口不是用的 8080 的话 还需要在解压出来的 cas 工程中修改一下配置文件 cas.properties 中的 server.name,如图:

我这里把它修改成 https://cas.infozr.com:8443

然后重启 tomcat

然后访问的时候就能使用

https://cas.infozr.com:8443/cas

访问。
5dd107b4f748436a8cbcdb301263ddc6-QQ20170419175450.png

出现以上画面代表部署成功

3. 尝试登录

我们之前说过 cas server 对用户密码的认证是支持很多种方式的,我们可以进行配置。

4.0.0 版本的 cas 是在 deployerConfigContext.xml 文件中进行配置的。我们找到这个部分。

AcceptUsersAuthenticationHandler 是普通认证类型,也就是直接对照帐号密码。

可以看到测试版本的帐号是 casuser 密码是 Mellon,是写死的。我们就用这个帐号密码进行登录即可,或者修改成你喜欢的帐号密码再启动 tomcat。

登录后显示登录成功说明我们的 cas server 部署成功了。

接着我们就要开始部署 cas client 了,也就是把我们的 web 项目于 cas server 关联起来。

6. cas client 的部署和设置

新建一个简单的 web project,修改 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>cas-cilent1</display-name>
	<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
  
   <!--  单点登录开始-->
    <!-- 用于实现单点登出功能  可选 -->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>
    <!-- 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前 可选 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://cas.infozr.com:8443/cas/</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 该过滤器负责用户的认证工作,必须 -->
    <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <!--casServerLoginUrl:cas服务的登陆url -->
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://cas.infozr.com:8443/cas/login</param-value>
        </init-param>
        <init-param>
            <!--serverName:本项目的ip+port -->
            <param-name>serverName</param-name>
            <param-value>http://app1.infozr.com:9000</param-value>
        </init-param>
        <init-param>
            <param-name>useSession</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>redirectAfterValidation</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CASFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 该过滤器负责对Ticket的校验工作,必须-->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>
            org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
        </filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://cas.infozr.com:8443/cas/</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://app1.infozr.com:9000</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <!-- 对项目中的哪些路径做登录拦截-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名,可选 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>
            org.jasig.cas.client.util.HttpServletRequestWrapperFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器使得可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
         比如AssertionHolder.getAssertion().getPrincipal().getName()。 
         这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息 -->
    <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 Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 单点登录结束-->
</web-app>

client2 将 xml 中的 app1 修改为 app2

对于这些参数的含义和解释可以参考官方文档:

http://blog.csdn.net/zzq900503/article/details/54646828

7. 测试单点登录 cas 服务

  1. 修改 cas-client1 和 cas-client2 的 index.jsp 的显示内容为 cas-client1 和 cas-client2
    1951a8f4bfcb4a3ab2691ad7b695bb63-QQ20170419183913.png

  2. 访问 http://app1.infozr.com:9000/cas-cilent1/发现已跳转到 https://cas.infozr.com:8443/cas/login?service=http%3A%2F%2Fapp1.infozr.com%3A9000%2Fcas-cilent1%2F

  3. 登录之后显示 cas-client1

  4. 访问 http://app2.infozr.com:9000/cas-cilent2/没有跳转到 cas 而是直接显示 cas-client2,则代表配置成功




手机游戏源码素材网:http://www.codegather.com

  • CAS
    13 引用 • 21 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...