文档章节

搭建单点登录环境

很好亦平凡ms
 很好亦平凡ms
发布于 2016/07/17 14:36
字数 1473
阅读 72
收藏 1
点赞 0
评论 0

前言

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

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

大概结构如下:

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

© 著作权归作者所有

共有 人打赏支持
很好亦平凡ms
粉丝 3
博文 58
码字总数 10037
作品 0
程序员
一年走向【Java架构师】之葵花宝典

大多数时候,不是我们不努力,而是不知从何下手,我深知一份好的学习资料是多么的重要,我们通常会把大量的时间都浪费在找资源上,本人搜集学习java架构师的经典学习路线如下可供参考!!! 一...

我一路狂奔 ⋅ 2017/05/20 ⋅ 1

SSO单点登陆环境搭建

SSO单点登陆的概念网上已经很多了,文章并不对这些概念性的东西进行过多的讨论,直接通过代码进行说明,具体的环境搭建代码已经上传git : http://git.oschina.net/alexgaoyh/SSOTest 本例是将...

alexgaoyh ⋅ 2015/06/06 ⋅ 0

京东、阿里大型互联网公司电商架构项目实战

电商项目实战 大型电商分布式系统应用实践,利用云服务器搭建真实的开发和部署环境,千人在线参与开发。 由浅入深的,带你从零到项目发布上线与运维,让你体验真实的企业级项目开发过程,掌握...

Java高级架构 ⋅ 2017/12/24 ⋅ 0

搭建CAS单点登录服务器

  最近公司的一个项目需要用到单点登录的功能,之前对单点登录了解得不多。于是网上找了下单点登录的解决方案,发现CAS是个不错的解决方案。于是搭个环境测试了一下。这里记录下测试的详细...

无声胜有声 ⋅ 2015/11/10 ⋅ 0

【开发笔记】单点登录CAS测试登录Invalid credentials无效凭据

今天公司要搭建单点登录DEMO,完成第一步简单的搭建成功后测试成功进到登陆界面。 在网上的资料和搭建的流程文档上都写用户名和密码输入相同的就可以登录成功,然而测试后发现会报出如下错误...

笑雁鸿儒 ⋅ 2017/07/12 ⋅ 0

统一协同工作平台用户管理、单点登录以及任务集成接口说明

目录 1 概述 西北油田分公司信息化经过长期建设,在各个业务点上,逐步搭建了适应业务管理的信息化系统,为分公司经营管理提供了强大的信息化辅助管理支撑。 但是,分公司前期建设的信息化系...

lwl_BPM ⋅ 2017/06/19 ⋅ 0

企业环境中的账户与身份管理 之:2-非SSO也

上一篇的《企业环境中的账户与身份管理 之:1-认识》中讲到了什么是身份,什么是身份信息,身份信息有哪些,进行身份信息的统一管理,是要解决什么样的根本问题 。。 如我所猜想的那样,在回...

bisheng.hu ⋅ 2011/03/01 ⋅ 0

(一)构建dubbo分布式平台-平台导语简介

导语: 怎么搭建一套满足企业未来发展的通用架构平台?现在分布式、微服务、云平台的口号是如此的响亮,技术更新是如此的迅速,很多架构师选择使用dubbo、spring cloud的方案去帮助企业搭建分...

park ⋅ 2017/11/27 ⋅ 0

Spring Security 3和CAS 3.5.2集成的完整实例

回顾 在上一篇文章,利用Spring Security 3.2的remember-me搭建SSO,我做了一个简单的单点登录。但其毕竟不够健壮,比如无法点单登出,也无法与非Spring Security的应用集成。今天,我将使用...

xpbug ⋅ 2014/03/04 ⋅ 21

2、VMware vCenter Server5.1功能介绍与安装

一、VMware vCenter Server简介 VMware vCenter Server是vSphere平台中最重要部分之一,是整个vSphere平台的管理中心。它可以以单一控制的点管理所有vSphere平台下的ESXi主机和ESXi主机里面的...

tiantangshizhe ⋅ 2013/11/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部