前言
不了解单点登录的可以看我的另一个文章 “单点登录整合方案”
都是自己的理解,欢迎各位指正。
大概结构如下:
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
package com.org.servlet;
import java.io.IOException;
import java.security.Principal;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 编写测试类 继承Servlet类,重写init()方法
*
* @author Administrator
*
*/
public class HelloWorld extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void init() {
System.out.println("init......");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取单点登录用户信息
Principal principal = request.getUserPrincipal();
String userName = principal.getName();
System.out.println("userName : " + userName);
}
}
(3)修改index.jsp页面,添加一个a标签指向Servlet
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
<a href="<%=basePath%>HelloWorld/helloServlet?userName=scott&userPwd=tiger">HelloWorld</a>
</body>
</html>
(4)修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.org.servlet.HelloWorld</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld/helloServlet</url-pattern>
</servlet-mapping>
<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-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</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>
<param-name>casServerLoginUrl</param-name>
<param-value>https://me.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8180</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://me.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8180</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名 -->
<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() -->
<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>
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
来源:oschina
链接:https://my.oschina.net/u/2499253/blog/713308