http://blog.csdn.net/yunye114105/article/details/7997041

参考:

http://blog.csdn.net/diyagea/article/details/50638737

(配置SSL协议)http://www.cnblogs.com/notDog/p/5264666.html

背景

有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在使用不同的系统的时候,需要登陆不同的系统。现在需要提供一个统一的登陆/登出界面, 而不修改各个系统原来的登陆验证机制。于是采用单点登录系统CAS。

使用步骤

要使用单点登录,需要部署CAS系统, CAS服务端可以直接部署在tomcat下运行, 对于CAS服务端来说,所有要集成单点登录的web应用都是它的一个客户端, CAS有客户端jar包, 客户端web应用需要引入CAS客户端的jar包,这样CAS系统的服务端和客户端web应用程序端才能通信。

客户端web应用程序的通过配置web.xml,添加CAS需要的各种过滤器,来实现和CAS服务器通信, 用户信息验证工作在CAS服务端统一完成, 验证通过后,客户端web应用程序只需要补全自己的Session信息即可。

各个客户端web应用程序需要使用一个公用的用户表。

第一步 部署CAS系统服务端

1.从官网http://developer.jasig.org/cas/下载CAS Server, 将cas-server-webapp-3.4.12.war解压, 可以看到是一个标准的java的web应用, 可以直接部署到tomcat的webapps目录下的,我这里假设部署的路径是{tomcat_home}/webapps/cas。

2. CAS默认需要tomcat配置SSL协议,使用https协议通信的。 由于项目是企事业单位内部的系统,不需要这么高的安全级别, 可以简化操作,不走SSL协议。修改下配置文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml, 如下, 将默认的true改成false即可。

p:cookieSecure="false"

p:cookieMaxAge="-1"

p:cookieName="CASTGC"

p:cookiePath="/cas" />

3.配置登录的验证逻辑, 修改配置文件cas\WEB-INF\deployerConfigContext.xml。在authenticationHandlers中配置验证方式,我这里配置数据库查询语句来实现用户名和密码的验证。

p:httpClient-ref="httpClient" />

-->

密码加密方法我这里使用MD5, 配置passwordEncoder的bean

在配置一个名称为dataSource的数据源

数据源的配置根据自己的实际情况来配置, 需要的jar如果lib下面没有,自己复制进去, 不然数据源连不上报错。

4. 现在服务端就配置好了, 如果需要定制登录/登出页面的话(实际项目基本上都需要修改), 修改cas\WEB-INF\view\jsp\default\ui\下面的casLoginView.jsp和casLogoutView.jsp就可以了

第二步 客户端web应用程序集成CAS

1. 从官网 http://developer.jasig.org/cas-clients/ 下载CAS Client, 将客户端的jar,如cas-client-core-3.2.1.jar引入到web应用程序的classpath中

2 .配置web.xml文件, 主要是添加过滤器拦截通信, 下面的实例代码, 假设web应用程序的端口是8080

CAS Single Sign Out Filter

org.jasig.cas.client.session.SingleSignOutFilter

CAS Single Sign Out Filter

/*

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

CASFilter

org.jasig.cas.client.authentication.AuthenticationFilter

casServerLoginUrl

http://CAS服务端所在服务器IP:8080/cas/login

serverName

http://具体web应用程序所在服务器IP:8080

CASFilter

/*

CAS Validation Filter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

casServerUrlPrefix

http://CAS服务端所在服务器IP:8080/cas

serverName

http://具体web应用程序所在服务器IP:8080

renew

false

gateway

false

CAS Validation Filter

/*

CAS HttpServletRequest Wrapper Filter

org.jasig.cas.client.util.HttpServletRequestWrapperFilter

CAS HttpServletRequest Wrapper Filter

/*

CAS Assertion Thread Local Filter

org.jasig.cas.client.util.AssertionThreadLocalFilter

CAS Assertion Thread Local Filter

/*

CasForInvokeContextFilter

com.cm.demo.filter.CasForInvokeContextFilter

appId

a5ea611bbff7474a81753697a1714fb0

CasForInvokeContextFilter

/*

4. 注意上步配置文件中,过滤器CasForInvokeContextFilter的实现是需要在具体的应用中实现的,他的目的是, CAS服务端登录验证成功后,会将登录用户的用户名携带回来, 这时客户端web应用程序需要根据用户名从数据库用户表中查询到用户的Id等信息, 并填充到Session中, 这样,客户端应用程序原来的验证逻辑就不会出问题了, 因为我们一般都是通过验证session中是否含有当前登录的用户的ID来进行登录验证的。

下面是CasForInvokeContextFilter的一个简单实现。

/**

* 该过滤器用户从CAS认证服务器中获取登录用户用户名,并填充必要的Session.

* @author jiarong_cheng

* @created 2012-7-12

*/

public class CasForInvokeContextFilter implements Filter {

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

HttpSession session = ((HttpServletRequest) request).getSession();

//如果session中没有用户信息,则填充用户信息

if (session.getAttribute("j_userId") == null) {

//从Cas服务器获取登录账户的用户名

Assertion assertion = AssertionHolder.getAssertion();

String userName = assertion.getPrincipal().getName();

try {

//根据单点登录的账户的用户名,从数据库用户表查找用户信息, 填充到session中

User user = UserDao.getUserByName(userName);

session.setAttribute("username", userName);

session.setAttribute("userId", user.getId());

} catch (Exception e) {

e.printStackTrace();

}

}

chain.doFilter(request, response);

}

@Override

public void init(FilterConfig config) throws ServletException {

}

}

到此,就完成了, 当你访问具体应用的网址, 如http://具体应用IP: 8080/ ,就会跳转到CAS服务器的登陆页面: http://CAS服务器IP: 8080/  进行登录验证, 验证通过后, 又会跳转回应用的网址。

第三步 单点登出

这个比较简单, 只要在系统的登出事件中, 将URL访问地址指向CAS服务登出的servlet, 就可以了。

http://CAS服务器IP:8080/cas/logout

cas java单点登录_java单点登录系统CAS的简单使用相关推荐

  1. java 登陆系统设计_Java 程序设计——登录系统

    并发型服务器 博客展示的登录系统的服务器端,将实现重复型服务器. Client–server model 客户端-服务器模型(Client–server model)简称C/S结构,是一种网络架构.大 ...

  2. java 微博第三方登录_java第三方登录(微博,QQ)详细代码

    第三方登录,首先需要设计扩展性的表结构.参照如下:本文主要写第三方登录的代码. 浅谈数据库用户设计:http://www.cnblogs.com/jiqing9006/p/5937733.html 可 ...

  3. 教材订购模块java代码实现_java教材征订系统

    每天记录学习,每天会有好心情.*^_^* 今天将为大家分析一个基于web的java教材征订系统,因此本系统选择学校的教材征订为研究对象,以实现教材征订网络化管理.提高工作效率.减少教材征订中的错误为目 ...

  4. java对嵌入式_Java用于嵌入式系统的优点

    Java用于嵌入式系统的优点 与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务.yjbys小编下面为你整理了关于Java用于嵌入式系统的优点,希望对你有所帮助. ...

  5. java 字体名字_JAVA:获取系统中可用的字体的名字

    import java.awt.*; public class GetLocalFontFamily { public static void main(String[] agrs) { //获取系统 ...

  6. java控制系统音量_Java 控制 Windows 系统音量-Go语言中文社区

    目录 1.使用 Java 来控制 Windows 系统音量,使用 JNA 调用 windows 底层 API 因为有点麻烦,所以这里采用纯 Java API结合 VBS 脚本的方式进行控制. 2.可以 ...

  7. java取当前日期_java如何获取系统的当前时间

    java获取系统当前时间的方法:获取当前时间和当前时间的前30秒,代码为[simple date format df = new simple date format(" yyyy-MM-D ...

  8. java打印设置_java如何设置系统默认打印机

    4.完整代码 import javax.print.*; import javax.print.attribute.*; import java.io.*; public class Printing ...

  9. java path 注解_Java内置系统注解和元注解

    第一节:注解(Annotation)的作用 Annotation(注解)是JDK5.0及以后版本引入的.它的作用是修饰程序元素.什么是程序元素呢?例如:包.类.构造方法.方法.成员变量等. 注解,就是 ...

最新文章

  1. Linux开发 python引用自定义的模块
  2. linux查询关键词上下行_Linux:从文件中搜索关键字并显示行数(cat,grep函数)
  3. 共同好友推荐java_【开班典礼】初雪迎初见,白色浪漫中,他们选择从此与Java相伴!...
  4. javaweb实现文件上传,前端与后台的结合实现
  5. 特斯拉是l3还是l2_比特斯拉还“高一级”,长安的“L3级自动驾驶”到底什么来头?...
  6. HTTP_POST———使用mysql_udf与curl库完成http_post通信模块(mysql_udf,multi_curl,http,post)...
  7. 悔创阿里杰克马,毫无成就孙正义!孙正义对话马云:马云才是自己的贵人!
  8. Struts2教程7:上传任意多个文件
  9. 2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
  10. 身份证号每一位号码的意义
  11. Qt核心剖析: moc
  12. delphi 去掉字符串中所有的标点符号_[话俾你知]Python使用正则处理字符串技巧(分割、替换)...
  13. 第六章 线性回归 学习笔记下
  14. Oracle下载账户
  15. 主流的新闻APP 用的 推送SDK 记录
  16. 游戏策划入门教程(前言)
  17. app中常见的测试点
  18. STM32F103标准库开发---目录
  19. 如本科技上海分公司乔迁新址,加速长三角地区的业务覆盖
  20. 使用Hyper-V的安卓模拟器-兆懿

热门文章

  1. mysql 重启_mysql重启的问题
  2. dataguard mysql,[dataguard同步数据库]Dataguard环境下数据库的备份与恢复
  3. redis启动没反应_Promethues如何针对Redis进行监控
  4. php7.1安装mysqli扩展,centos php7 安装mysqli扩展心得
  5. QQ浏览器怎么把文件添加到私密空间 怎么使用私密空间
  6. 生成特征_使用gplearn自定义特征自动生成模块
  7. springboot接收get和post请求参数
  8. Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)
  9. 为什么python工程师掌握这些就够了_Python工程师薪资飙升,Python这些技能你掌握了吗...
  10. 使用 ref 对已渲染到页面的节点进行标记