搭建单点登录环境

前言

不了解单点登录的可以看我的另一个文章 “单点登录整合方案”

都是自己的理解,欢迎各位指正。

 

大概结构如下:

JDK1.7 + CAS SERVER 3.5 + ORACLE + JAVA WEB 

 

1.安装JDK1.7

  由于我的cas-tomcat是基于JDK1.7,所以首先必须要有JDK1.7环境

 

2.生成证书

  1)生成密钥库

    keytool -genkey -alias tomcat -keyalg RSA -keypass 123456 -storepass 123456 -keystore /usr/java/key/server.keystore -validity 3600

    

    tomcat 为我本地的域名,这里不能输入IP,所以这里记得在host文件里配置下。

    server.keystore 为生成的密钥。

    这里对应的6个问题:

    1.单点登录服务器的域名

    2.公司名称

    3.单点登录服务名称

    4.剩下的就是所在地信息

 

  2)导出证书

    keytool -export -trustcacerts -alias tomcat -file /usr/java/key/server.cer -keystore /usr/java/key/server.keystore -storepass 123456

    

    server.cer 为导出的证书

  3)导出证书到jdk(tomcat运行的jvm)

    keytool -import -trustcacerts -alias tomcat -file /usr/java/key/server.cer -keystore /usr/java/jdk1.7.0_75/jre/lib/security/cacerts -storepass 123456

    在做这一步的时候,出现一个问题。当我输入密码123456到jre下的security时,会报错密码不正确,上图:

    

    但是当我将cacerts输出到别的路径时就没问题。上图:

    

    有知道的朋友麻烦告知下。

    最后我试了下changeit这个密码,成功添加到目标路径。上图:

    

    这里跟大家说一下,changeit为jre的默认密码。

 

3.配置tomcat(cas-tomcat)

  找到conf/server.xml,找到如下代码:

  <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"    
           port="8453" minSpareThreads="5" maxSpareThreads="75"    
           enableLookups="true" disableUploadTimeout="true"      
           acceptCount="100"  maxThreads="200"    
           scheme="https" secure="true" SSLEnabled="true"    
           clientAuth="false" sslProtocol="TLS"    
           keystoreFile="/home/key/server.keystore"                    <!--   这里是key的路径  -->
           keystorePass="123456"/>

  修改黄色部分。

 

4.下载CAS SERVER,我这里是cas-server-3.5.2

   解压到cas-tomcat/webapps下。

   将cas-server-3.5.2修改名称为cas

4.测试cas

  启动tomcat,进入tomcat/bin,执行startup.bat。

  输入 https://me.com:8443/cas/login,如果提示https连接失败,尝试将证书导入到浏览器中。

     CAS默认的登陆验证规则是用户名和密码一致即可。

  

 

到这里为止,我们已经搭建了一个最近简单的cas应用。

实际项目中,我们的登陆验证不能像上面这么简单,所以往下看。

 

首先打开cas-tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml

配置如下几个地方:

(1)注释掉 <property name="attributeRepository" ref="attributeRepository" />

 (2)注释掉<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

     然后加上

               <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">    
                       <property ref="dataSource" name="dataSource" />    
                       <property name="sql" value="select password from USER_ where login_name=?" />    
               </bean>

   这里的sql对应的是查询的用户,dataSource在后面配置。

  

 

 (3)在beans标签内再配置个bean

     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
            <property name="url" value="jdbc:oracle:thin:@192.168.215.177:1521:CPS1"></property>
            <property name="username" value="gsmdba"></property>
            <property name="password" value="gsmdba"></property>
     </bean>

     以上为配置数据源。

    

 

配置完,我们再登陆一次,我这边添加了一条用户数据zhangsan/123456,尝试登陆,成功。

下面我们来将单点登陆集成到我们的Java web中。

(1)首先新建一个web工程 Test_Servlet

(2)新建一个Servlet

 1 package com.org.servlet;
 2 
 3 import java.io.IOException;
 4 import java.security.Principal;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 /**
11  * 编写测试类 继承Servlet类,重写init()方法
12  * 
13  * @author Administrator
14  * 
15  */
16 public class HelloWorld extends HttpServlet {
17     /**
18      * 
19      */
20     private static final long serialVersionUID = 1L;
21     
22     public void init() {
23         System.out.println("init......");
24     }
25 
26     public void doGet(HttpServletRequest request, HttpServletResponse response)
27             throws ServletException, IOException {
28         //获取单点登录用户信息
29         Principal principal =  request.getUserPrincipal();
30         String userName = principal.getName();
31         System.out.println("userName : " + userName);
32     }
33 
34 }
View Code

(3)修改index.jsp页面,添加一个a标签指向Servlet

 1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'index.jsp' starting page</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18     <!--
19     <link rel="stylesheet" type="text/css" href="styles.css">
20     -->
21   </head>
22   
23   <body>
24     This is my JSP page. <br>
25     <a href="<%=basePath%>HelloWorld/helloServlet?userName=scott&userPwd=tiger">HelloWorld</a>
26   </body>
27 </html>
View Code

(4)修改web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7     
 8     <servlet>
 9         <servlet-name>HelloWorld</servlet-name>
10         <servlet-class>com.org.servlet.HelloWorld</servlet-class>
11         <load-on-startup>1</load-on-startup>
12     </servlet>
13     
14     <servlet-mapping>
15         <servlet-name>HelloWorld</servlet-name>
16         <url-pattern>/HelloWorld/helloServlet</url-pattern>
17     </servlet-mapping>
18     
19   <welcome-file-list>
20     <welcome-file>index.jsp</welcome-file>
21   </welcome-file-list>
22   
23   
24   <!-- 单点登出  -->
25     <listener>
26        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
27     </listener>
28 
29     <!-- 单点登出  -->
30     <filter>
31         <filter-name>CAS Single Sign Out Filter</filter-name>
32         <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
33     </filter>
34     <filter-mapping>
35         <filter-name>CAS Single Sign Out Filter</filter-name>
36         <url-pattern>/*</url-pattern>
37     </filter-mapping>
38 
39     <!-- 单点登录 -->
40     <filter>
41         <filter-name>CASFilter</filter-name>
42         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
43         <init-param>
44             <param-name>casServerLoginUrl</param-name>
45             <param-value>https://me.com:8443/cas/login</param-value>
46         </init-param>
47         <init-param>
48             <param-name>serverName</param-name>
49             <param-value>http://localhost:8180</param-value>
50         </init-param>
51     </filter>
52     <filter-mapping>
53         <filter-name>CASFilter</filter-name>
54         <url-pattern>/*</url-pattern>
55     </filter-mapping>
56 
57     <!-- Ticket校验 -->
58     <filter>
59         <filter-name>CAS Validation Filter</filter-name>
60         <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
61         </filter-class>
62         <init-param>
63             <param-name>casServerUrlPrefix</param-name>
64             <param-value>https://me.com:8443/cas</param-value>
65         </init-param>
66         <init-param>
67             <param-name>serverName</param-name>
68             <param-value>http://localhost:8180</param-value>
69         </init-param>
70     </filter>
71     <filter-mapping>
72         <filter-name>CAS Validation Filter</filter-name>
73         <url-pattern>/*</url-pattern>
74     </filter-mapping>
75 
76     <!-- 实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名 -->
77     <filter>
78         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
79         <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter
80         </filter-class>
81     </filter>
82     <filter-mapping>
83         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
84         <url-pattern>/*</url-pattern>
85     </filter-mapping>
86 
87     <!-- 可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName() -->
88     <filter>
89         <filter-name>CAS Assertion Thread Local Filter</filter-name>
90         <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
91     </filter>
92     <filter-mapping>
93         <filter-name>CAS Assertion Thread Local Filter</filter-name>
94         <url-pattern>/*</url-pattern>
95     </filter-mapping>
96 </web-app>
View Code

 

ok,到这里为止,我们的Java Web工程的配置已经完成。

接下来我们需要将证书导入到Java Web用到的JDK中。

这里我将server.cer放在了bin的上一级目录中,所以命令如下:

keytool -import -trustcacerts -alias tomcat -file ..\server.cer -keystore ..\jre\lib\security\cacerts -storepass changeit

如果这里已经存在名称为tomcat的验证,则需要先删除掉,命令如下:

keytool -delete -trustcacerts -alias tomcat -file ..\server.cer -keystore ..\jre\lib\security\cacerts -storepass changeit

证书导出成功后。我们就可以进行测试了。

输入   http://me.com:8180/Test_Servlet  会跳转到cas登陆界面,然后输入用户密码,登陆成功则会进入index.jsp界面,然后我们点击Hello World标签,跳转到Servlet中,后台会打印当前用户为 'zhangsan'

 

这里需要注意的是,web.xml配置的路径,一定要使用域名,否则会报错:java.security.cert.CertificateException: No subject alternative names present

 

 

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

posted @ 2015-03-02 17:24  很好亦平凡  阅读(691)  评论(0编辑  收藏  举报