搭建单点登录环境
前言
不了解单点登录的可以看我的另一个文章 “单点登录整合方案”
都是自己的理解,欢迎各位指正。
大概结构如下:
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
(3)修改index.jsp页面,添加一个a标签指向Servlet
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
(4)修改web.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
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