JEESZ分布式框架单点登录集成方案

第一节:单点登录简介

第一步:了解单点登录

SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口.

SSO的体系中有下面三种角色:

1) User(多个)

2) Web应用(多个)

3) SSO认证中心(一个)

SSO实现包含以下三个原则:

1) 所有的登录都在 SSO 认证中心进行。

2) SSO认证中心通过一些方法来告诉Web应用当前访问用户究竟是不是通过认证的用户.

3) SSO认证中心和所有的 Web 应用建立一种信任关系.

CAS的基本原理CAS(Central Authentication Service) 是 Yale 耶鲁大学发起的构建Web SSO的Java开源项目。

1.CAS术语解释:

SSO-Single Sign On单点登录

TGT-Ticket Granting Ticket 用户身份认证凭证

ST-Service Ticket服务许可凭证

TGC-Ticket Granting Cookie存放用户身份认证凭证的cookie.

第二步:了解单点登录体系结构

1) CAS Server负责完成对用户信息的认证,需要单独部署,CAS Server会处理用户名/密码等凭证(Credentials).

2) CAS Client部署在客户端,当有对本地Web应用受保护资源的访问请求,并且需要对请求方进行身份认证,重定向到CAS Server进行认证.

第三步:单点登录环境准备工作

1) cas-server-3.5.0-release.zip(CAS服务端)

2) cas-client-3.3.3-release.zip(CAS客户端)

3) apache-tomcat-7.0.40

4) cas-client-core-3.2.1.jar

5) cas-server-core-3.5.0.jar

6) cas-server-support-jdbc-3.5.0.jar

第二节:单点登录环境搭建与部署

第一步:环境部署

  1. 通过Java JDK生成证书三部曲

证书对于实现此单点登录非常之重要,证书是服务器端和客户端安全通信的凭证,本教程只是演示,所有用了JDK自带的证书生成工具keytool。

当然在实际项目中你可以到专门的证书认证中心购买证书。

中文官方网站:http://www.verisign.com/cn/

使用JDK自带的keytool生成证书

第一步生成证书:

keytool -genkey -alias mycacerts -keyalg RSA -keystore C:/common/keys/keycard

注意:输入相关信息用于生成证书.其中名字与姓氏这一最好写你的 域名,如果在单击测试你可以在C:WindowsSystem32driversetchosts文件中映射一个虚拟域名,

注意不要写IP。

第二步导出证书:

keytool -export -file C:/common/keys/keycard.crt -alias mycacerts -keystore C:/common/keys/keycard

第三步导入到JDK安装目录证书:

keytool -import -keystore C:/"Program Files"/Java/jdk1.6.0_32/jre/lib/security/cacerts -file C:/common/keys/keycard.crt -alias mycacerts

  1. 解压cas-server-3.5.0-release.zip文件,

在cas-server-3.5.0-releasecas-server-3.5.0modules目录下找到cas-server-webapp-3.5.0.war文件并命名为cas.war,并复制到在Tomcat 根目录的webapps目录下,

如下图:

  1. 修改host文件(C:WindowsSystem32driversetc)hosts文件中添加添加以下配置

127.0.0.1 jeesz.cn (配置自己的域名.)

注意:如果想在一台PC机上模拟这个单点登录,就必须域名重定向,如果是多台PC机,可以不配置此项,下文有用到jeesz.cn,可以用相应PC机的IP代替

  1. 修改Tomcat文件下的server.xml(apache-tomcat-7.0.40confserver.xml) 添加以下内容:

在server.xml文件中把

maxThreads="150" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS" />

修改成如下:

port="8443"

protocol="org.apache.coyote.http11.Http11Protocol"

maxThreads="150"

SSLEnabled="true"

scheme="https"

secure="true"

clientAuth="false"

sslProtocol="TLS"

keystoreFile="C:/common/keys/keycard"

keystorePass="xxxxxx "

ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"

/>

5.启动Tomcat服务,查看信息,(如果有报错,可以根据信息查找错误),打开浏览器,输入http://jeesz.cn:8080/cas如果出现以下界面,则代表CAS服务端配置成功。

注:这个是最简单的CAS服务,只要输入的用户名跟密码一样,就可以正常登陆,在我们实际开发中,这个验证因为跟数据库作比较,接下来,我们就配置数据库校验。

第二步:配置数据库验证

1.在apache-tomcat-7.0.2webappscasWEB-INF目录下找到deployerConfigContext.xml文件,找到如下代码:

添加下面代码:

2.增加数据源dataSource,

在deployerConfigContext.xml,(跟上面同一个文件)找到

,在下面添加如下代码:

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/sso

root

3.数据库添加用户表及数据(这里用的mysql),比如在mysql数据库中有t_user表

4.增加jar包, cas-client-core-3.2.1.jar、cas-server-core-3.5.0.jar、cas-server-support-jdbc-3.5.0.jar包拷贝到apache-tomcat-7.0.2webappscasWEB-INFlib目录下。

5.重启Tomcat,打开浏览器,输入http://jeesz.cn:8080/,输入数据库里的用户名和密码,如果出现如下界面,则配置成功。

现在我们的CAS服务端已经配置好了,接下来,我们配置客户端

第三节:配置自己的Web工程(客户端)

1.在host文件下,添加如下代码:

127.0.0.1 www.sso1.com

127.0.0.1 www.sso2.com

注意:这个网址最好不要用互联网已经存在的域名,否则你将无法访问该地址。

如果想在一台PC机上模拟这个单点登录,就必须域名重定向,如果是多台PC机,可以不配置此项,下文有用到www.sso1.com,www.sso2.com,可以用相应PC机的IP代替

2.在Tomcat 根目录下创建一个sso1,sso2目录。如下如:

  1. 在自己的Web工程里加入cas-client-core.jar,commons-logging-1.1.jar,(解压cas-client-3.2.0-release.zip,在cas-client-3.2.0-release.zipcas-client-3.2.0modules,找到该JAR包)

分别加入到sso1,sso2工程的lib里。

4.修改sso1下的web.xml。添加如下代码:

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

SingleSignOutFilter

org.jasig.cas.client.session.SingleSignOutFilter

SingleSignOutFilter

/*

CASValidationFilter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

casServerUrlPrefix

https://jeesz.cn:8443/cas;

serverName

http://www.sso1.com;

useSession

true

exceptionOnValidationFailure

false

redirectAfterValidation

true

CASValidationFilter

/*

CASFilter

org.jasig.cas.client.authentication.AuthenticationFilter

casServerLoginUrl

https://jeesz.cn:8443/cas/login;

serverName

http://www.sso1.com;

CASFilter

/*

CASHttpServletRequestWrapperFilter

org.jasig.cas.client.util.HttpServletRequestWrapperFilter

CASHttpServletRequestWrapperFilter

/*

CASAssertionThreadLocalFilter

org.jasig.cas.client.util.AssertionThreadLocalFilter

CASAssertionThreadLocalFilter

/*

SSO4InvokeContextFilter

com.common.core.busi.other.filter.SSO4InvokeContextFilter

SSO4InvokeContextFilter

/*

5.修改sso2下的web.xml。添加如下代码:

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

SingleSignOutFilter

org.jasig.cas.client.session.SingleSignOutFilter

SingleSignOutFilter

/*

CASValidationFilter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

casServerUrlPrefix

https://jeesz.cn:8443/cas;

serverName

http://www.sso2.com;

useSession

true

exceptionOnValidationFailure

false

redirectAfterValidation

true

CASValidationFilter

/*

CASFilter

org.jasig.cas.client.authentication.AuthenticationFilter

casServerLoginUrl

https://jeesz.cn:8443/cas/login;

serverName

http://www.sso2.com;

CASFilter

/*

CASHttpServletRequestWrapperFilter

org.jasig.cas.client.util.HttpServletRequestWrapperFilter

CASHttpServletRequestWrapperFilter

/*

CASAssertionThreadLocalFilter

org.jasig.cas.client.util.AssertionThreadLocalFilter

CASAssertionThreadLocalFilter

/*

SSO4InvokeContextFilter

com.common.web.filter.SSO4InvokeContextFilter

SSO4InvokeContextFilter

/*

6.编辑sso1,sso2 index.jsp页面,复制如下代码:

sso1 index.jsp:

这个是www.sso1.com

你好我是sso1页面:

<%= request.getRemoteUser()== null ? "null" : request.getRemoteUser() %>

Sso2 index.jsp:

这个是www.sso2.com

你好我是sso2页面:

<%= request.getRemoteUser()== null ? "null" : request.getRemoteUser() %>

7.通过eclipse发布到Tomcat服务器上去。找到Tomcat,webapps下的sso1,sso2文件夹,分别复制sso1和sso2下面的所有文件,找到Tomcat根目录下的sso1,sso2(就是我们前面步骤新建的目录),在sso1,sso2下新建ROOT目录,把刚刚复制的文件粘贴。

配置Tomcat 下server.xml文件,加入如下代码:

8.重启Tomcat,打开浏览器输入网址:www.sso1.com:8080,输入用户名与密码,如果出现以下信息,则成功

在浏览器上输入www.sso1.com:8080,你会发现跳回到登录页面,不要担心。打开ticketGrantingTicketCookieGenerator.xml路径在apache-tomcat-7.0.40casROOTWEB-INFspring-configuration。找到p:cookieSecure="true",将其修改为p:cookieSecure="false",重启Tomcat,测试一下。

注:我们以上步骤返回的只有一个用户名,CAS服务器默认返回该信息。

第是节:修改单点登录默认界面

第一步:找到它自己的页面

打开cas工程,找到G:SoftWaretomcatapache-tomcat-7.0.2apache-tomcat-7.0.2webappscasWEB-INFviewjspdefault这个目录,将其复制一份重命名放在G:SoftWaretomcatapache-tomcat-7.0.2apache-tomcat-7.0.2webappscasWEB-INFviewjsp目录下,

第二步:修改默认登录页面

将其命名为mydefalut如下图:

然后将apache-tomcat-7.0.2webappscasWEB-INFclasses

目录下的default_views.properties复制一份,重命名为mydefault_views.properties。修改里面的内容,将所有里面的路径中的default改成mydefault。然后修改WEB-INF下的cas.properties将里面的cas.viewResolver.basename后面的值修改成mydefault_views即:

cas.viewResolver.basename=mydefault_views

如果要修改登录界面,只需要修改casLoginView.jsp即可。

第五节:单点登出配置

第一步:配置单点登录监听器和过滤器

1.Tomcat的sso1,sso2的工程里,在web.xml里分别添加一下代码:

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

CAS Single Sign Out Filter

org.jasig.cas.client.session.SingleSignOutFilter

CAS Single Sign Out Filter

/*

注意:这些代码应该放在web.xml文件其他过滤器的最前面。

2.在sso1,sso2的index.jsp页面添加以下代码:

http://jeesz.cn:8080/logout">单点退出

3.重启Tomcat,访问http://jeesz.cn:8080/点击单点退出,如果成功,就会出现如下界面:

一般注销是跳到原项目的登录页面,所以我们需要对CAS做如下配置:

  1. 修改服务端cas-servlet.xml配置(apache-tomcat-7.0.40casROOTWEB-INF),找到

增加属性 p:followServiceRedirects="true"

2.修改客户端,sso1,sso2 index.jsp文件将原来的单点登出的URL修改成:

Sso1:http://jeesz.cn:8080/logout?service=http://www.sso1.com:8080

Sso2:http://jeesz.cn:8080/logout?service=http://www.sso2.com:8080

重启Tomcat,测试正常。

第六节:多项目集成单点登录配置

第一步:单点登录系统与其他项目集成

在WEB 项目中的WEB-INF目录下的web.xml文件,添加以下配置.

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

SingleSignOutFilter

org.jasig.cas.client.session.SingleSignOutFilter

SingleSignOutFilter

/*

CASValidationFilter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

casServerUrlPrefix

https://jeesz.cn:8443/cas;

serverName

http://www.sso3.com:6060;

useSession

true

exceptionOnValidationFailure

false

redirectAfterValidation

true

CASValidationFilter

/*

CASFilter

org.jasig.cas.client.authentication.AuthenticationFilter

casServerLoginUrl

https://jeesz.cn:8443/cas/login;

serverName

http:// www.sso3.com:6060

CASFilter

/*

CASHttpServletRequestWrapperFilter

org.jasig.cas.client.util.HttpServletRequestWrapperFilter

CASHttpServletRequestWrapperFilter

/*

CASAssertionThreadLocalFilter

org.jasig.cas.client.util.AssertionThreadLocalFilter

CASAssertionThreadLocalFilter

/*

SSO4InvokeContextFilter

com.common.web.filter.SSO4InvokeContextFilter

SSO4InvokeContextFilter

/*

当sso验证完成之后,客户端系统需要接收sso系统返回的结果时,需要定义一个过滤器获取返回结果,然后针对返回结果做相关处理.

注意:如果不需要做处理时,此处Filter也可以不用定义.

package com.common.web.filter;

import java.io.IOException;

import java.util.Date;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.jasig.cas.client.util.AssertionHolder;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

import com.common.base.pbi.CommonConstants;

import com.common.base.util.DateUtil;

import com.common.base.util.IDUtil;

import com.common.base.util.IPUtil;

import com.common.base.util.UserUtil;

import com.common.core.busi.historylogin.manager.HistoryLoginManager;

import com.common.core.busi.login.manager.LoginManager;

import com.common.entity.common.AbstractEntity;

import com.common.entity.historylogin.HistoryLoginEntity;

import com.common.entity.user.UserEntity;

/**

*@authorjeesz

*@date2015-10-01

*

*/

public class SSO4InvokeContextFilter implements Filter{

private final static Log log = LogFactory.getLog(SSO4InvokeContextFilter.class);

private WebApplicationContext applicationContext;

public SSO4InvokeContextFilter() {

super();

}

/**

*/

public void destroy() {

//暂时不做任何处理;

}

/**

*@Title: doFilter

*/

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest)req;

HttpServletResponse response = (HttpServletResponse)res;

HttpSession session = request.getSession();

//从session中获取登陆用户;

Object userObject = session.getAttribute(CommonConstants.USER_INFO_SESSION);

if(userObject == null){

//获取用户名;

String userName = AssertionHolder.getAssertion().getPrincipal().getName();

LoginManager loginManager = applicationContext.getBean(LoginManager.class);

UserEntity userEntity = loginManager.loginByUserName(userName);

session.setAttribute(CommonConstants.USER_INFO_SESSION,userEntity);

session.setAttribute(CommonConstants.IS_SYSTEM_ADMIN,userEntity.getUserType()==1?true:false);

UserUtil.setLoginUserInfo(userEntity);

//根据用户名查询出用户信息,并放入session中;

log.info("UserName:["+userName +"]登陆成功,客户端IP地址为["+IPUtil.getIpAddr(request)+"],登陆时间为["+DateUtil.dateToString(new Date())+"]");

//添加登录记录;

HistoryLoginEntity historyLoginEntity = new HistoryLoginEntity();

historyLoginEntity.setUserId(userName);

historyLoginEntity.setHid(IDUtil.generateId());

historyLoginEntity.setLoginCount("1");

setCommonValue(request,historyLoginEntity);

boolean hlBol = applicationContext.getBean(HistoryLoginManager.class).addLoginRecord(historyLoginEntity);

log.debug("登录历史记录["+(hlBol?"成功":"失败")+"].");

}

chain.doFilter(request, response);

}

/**

*/

private void setCommonValue(HttpServletRequest request,AbstractEntity entity){

if(request != null){

//获取当前对象;

UserEntity userEntity = (UserEntity) request.getSession().getAttribute(CommonConstants.USER_INFO_SESSION);

if(entity !=null){

String currUser = userEntity.getUserId();

//设置创建人、创建日期、修改人、修改时间

entity.setCreatedBy(currUser);

entity.setModifiedBy(currUser);

entity.setCreationDate(DateUtil.getNowDate());

entity.setModifiedDate(DateUtil.getNowDate());

}

}

}

/**

*/

@Override

public void init(FilterConfig filterConfig) throws ServletException {

WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());

this.applicationContext = applicationContext;

}

}

JEESZ分布式框架--单点登录集成方案相关推荐

  1. 互联网单点登录集成方案

    为了迎合公司互联网化经营,业务部门均纷纷上马了互联网的项目,部门应用之间各自为政,无法形成公司整体品牌效应,以及影响用户体验,故,有了以下的单点登录集成方案. 概述 整合集成公司各个业务部门的应用,支 ...

  2. FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在"单点登录"上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度 ...

  3. 帆软单点登录_FineReport和泛微OA(Ecology)的单点登录集成方案

    最近出现了很多关于帆软报表和泛微OA的集成问题,均出现在"单点登录"上.直接也有相关的文章介绍一些FineReport和泛微集成的背景.价值等,以及FineReport和OA的深度 ...

  4. 单点登录终极方案之 CAS 应用及原理

    转载自  单点登录终极方案之 CAS 应用及原理 Cookie的单点登录的实现方式很简单,但是也问题颇多.例如:用户名密码不停传送,增加了被盗号的可能.另外,不能跨域! 1.基于Cookie的单点登录 ...

  5. Jeesite单点登录集成Cas另加自定义登录验证

    Jeesite单点登录集成Cas另加自定义登录验证 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. Cas主要是用来解决多应用之 ...

  6. IDM与BPM单点登录集成

    IDM与BPM单点登录集成 软件版本说明 IDM 11.1.2.2.0 BPM 11.1.1.7.0 技术原理 在Oracle SOA体系中,BPM提供BPMN与BPMN服务.用户参使用流程需要经过认 ...

  7. SSO 单点登录实现方案

    SSO 单点登录实现方案 基本概念 三种实现方案 Session 共享 Oauth 2.0 实现 JWT 实现单点登录 Spring Boot 实现 JWT 1.引入依赖 2.编写工具类 3.获取 t ...

  8. JEESZ分布式框架之技术介绍文档

    摘要: Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件.代码生成等.采 ...

  9. 谷粒P193线程池异步分布式session单点登录

    p193 异步 异步复习 多线程几种方式 1.继承Thread 2.实现runable接口3.实现callable接口 4.线程池 public class ThreadTest {public st ...

  10. 使用Redis实现CAS单点登录技术方案

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

最新文章

  1. 阿里安全新研究:给图片打“马赛克”就能骗过 AI 视觉系统
  2. python爬虫程序说明_Python即时网络爬虫:API说明
  3. 浅析企业网站进行seo都会带来哪些优势呢?
  4. VTK:图片之DrawOnAnImage
  5. 磁盘的块大小(Block Size)和扇区大小(Sector Size)
  6. 产品经理应该干些啥?
  7. 机器学习 建立模型_建立生产的机器学习系统
  8. 进程的控制——获取系统进程信息
  9. R语言高级算法之人工神经网络(Artificial Neural Network)
  10. javascript判断非空
  11. 优秀的基于VUE移动端UI框架合集
  12. 用acdsee制作html,应用文论文写作 - - 计算机 - 计算机网络 - ACDSee的HTML相册生成...
  13. 21cn邮箱服务器端,21CN 免费邮箱常见问题
  14. 学习制作横版游戏——2
  15. 轻量级日志分析PLG平台Loki安装部署及使用(promtail+loki+Grafana)
  16. win10资源管理器打开一直正在处理文件加载不出来,桌面图标不加载
  17. Springboot RestTemplate post/get请求所有情况
  18. 微信头像失效_微信头像地址失效踩坑记附带解决方案
  19. 阿里云服务器上安装rabbitmq流程
  20. 1000个微信小程序源码分享

热门文章

  1. 148. Sort List (java 给单链表排序)
  2. secureCRT简单上传、下载文件记录
  3. 转 Android设置全屏的方法
  4. CCNA学习要点,希望能对初学者有帮助
  5. DirectDraw 学习:
  6. 对“最大子序列和问题”的一点思考
  7. 内存管理-基础知识框架和关键结构体(一)
  8. linux sudo apt-get,linux sudo apt-get用法详解
  9. (转)DPDK内存管理 04 ---- rte_malloc内存管理
  10. 编程基础(四)——cache之一