`
shuai1234
  • 浏览: 972586 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

SSO单点登录_03

    博客分类:
  • java
阅读更多

SSO:单点登录.一般是系统之间整合需要解决的一个问题.例如你之前做了个BBS或者一个CMS的系统.你在完成一个全新系统时候需要用到BBS这个系统的话..你就可能面临一个整合的问题.(除非你自己决定从新做个BBS上去) 对于我们已有的WEB应用中的用户,若该用户已经登陆,并通过 联结迁移到BBS页面时,BBS要能够识别该用户已经登陆(不需要二次登陆)才不会让用户感到别扭(对用户来说,就好像使用的是同一个系统似的)。

下面看下Jforum对于SSO的处理.
首先找到SSO处理所有类:net.jforum.sso下的SSO(需要实现的接口) SSOUtils(工具类)类;net.jforum.ControllerUtils;net.jforum.JForum
首先从xml中可以看到net.jforum.JForum这是整个系统一个核心的servlet.所以所有访问将通过该实体类
1.当一个用户访问JForum时.刷新session

Java代码 复制代码
  1. ControllerUtils utils = new ControllerUtils();   
  2. // 刷新session   
  3. utils.refreshSession();  
ControllerUtils utils = new ControllerUtils();
// 刷新session
utils.refreshSession();


2.进入ControllerUtils的refreshSession()

Java代码 复制代码
  1. public void refreshSession()   
  2.     {   
  3.         UserSession userSession = SessionFacade.getUserSession();//获取系统用户session   
  4.         RequestContext request = JForumExecutionContext.getRequest();//获取封装后的request值   
  5.   
  6.         if (userSession == null) {//如果userSession不存在话   
  7.             userSession = new UserSession();   
  8.             userSession.registerBasicInfo();//初始化基础信息   
  9.             userSession.setSessionId(request.getSessionContext().getId());   
  10.             userSession.setIp(request.getRemoteAddr());   
  11.             SessionFacade.makeUnlogged();//清除登录session的值   
  12.   
  13.             if (!JForumExecutionContext.getForumContext().isBot()) {//如果不是机器登录   
  14.                 // Non-SSO authentications can use auto login   
  15.                 /**  
  16.                  * 要启用sso功能话需要配置SystemGlobals.properties的中  
  17.                  * authentication.type的值=ConfigKeys.TYPE_SSO  
  18.                  */  
  19.                 if (!ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {   
  20.                     if (SystemGlobals.getBoolValue(ConfigKeys.AUTO_LOGIN_ENABLED)) {   
  21.                         this.checkAutoLogin(userSession);   
  22.                     }   
  23.                     else {   
  24.                         userSession.makeAnonymous();   
  25.                     }   
  26.                 }   
  27.                 else {   
  28.                     this.checkSSO(userSession);//检测sso   
  29.                 }   
  30.             }   
  31.   
  32.             SessionFacade.add(userSession);//将userSession设置到SessionFacade   
  33.         }   
  34.         else if (ConfigKeys.TYPE_SSO.equals(SystemGlobals.getValue(ConfigKeys.AUTHENTICATION_TYPE))) {//是否启用sso   
  35.             SSO sso;   
  36.                
  37.             try {   
  38.                 /**  
  39.                  * ConfigKeys.SSO_IMPLEMENTATION   
  40.                  * 取决你用什么方式实现SSO 可以是Cookies形式或者JDAP等形式而相应完成的实现类需要在SystemGlobals.properties配置 sso.implementation = 实现类完整路径  
  41.                  */  
  42.                 sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();   
  43.             }   
  44.             catch (Exception e) {   
  45.                 throw new ForumException(e);   
  46.             }   
  47.   
  48.             // If SSO, then check if the session is valid   
  49.             if (!sso.isSessionValid(userSession, request)) {//session值是否通过SSO验证.   
  50.                 SessionFacade.remove(userSession.getSessionId());   
  51.                 refreshSession();   
  52.             }   
  53.         }   
  54.         else {   
  55.             SessionFacade.getUserSession().updateSessionTime();   
  56.         }   
  57.     }  
从代码中可以看出.checkSSO这个方法将是重点:
Java代码 复制代码
  1. protected void checkSSO(UserSession userSession)   
  2.     {   
  3.         try {   
  4.             /**  
  5.              * ConfigKeys.SSO_IMPLEMENTATION   
  6.              * 中对应SystemGlobals.properties配置中SSO的实现类  
  7.              * 取决你用什么方式实现SSO   
  8.              * 可以是Cookies形式或者JDAP等形式 sso.implementation = 实现类完整路径  
  9.              */  
  10.             SSO sso = (SSO) Class.forName(SystemGlobals.getValue(ConfigKeys.SSO_IMPLEMENTATION)).newInstance();   
  11.             /**  
  12.              * sso检测用户.返回为用户的值  
  13.              */  
  14.             String username = sso.authenticateUser(JForumExecutionContext.getRequest());   
  15.             /**  
  16.              * 若返回了一个null,则设置为“Anonymous” (设置匿名用户)  
  17.              * checkAutoLogin()将调用makeAnonymous()里面设置的匿名cookies值  
  18.              * 若一个“Anonymous”用户试图访问权限以外的页面,  
  19.              * JForum将根据SSO的设置导航到登陆页面,  
  20.              * 同时传递给一个登陆成功后应该迁移到的地址参数给login页面。  
  21.              */  
  22.             if (username == null || username.trim().equals("")) {   
  23.                 userSession.makeAnonymous();   
  24.             }   
  25.             /**  
  26.              *  若返回了一个不为空的username时,  
  27.              * JForum将会检查是否匹配JForum数据库的userid。  
  28.              *  若没有匹配的userid,JForum将动态加以创建  
  29.              *   
  30.              */  
  31.             else {   
  32.                 SSOUtils utils = new SSOUtils();   
  33.   
  34.                 if (!utils.userExists(username)) {//如果用户不存在进行添加   
  35.                     SessionContext session = JForumExecutionContext.getRequest().getSessionContext();   
  36.   
  37.                     String email = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_EMAIL_ATTRIBUTE));   
  38.                     String password = (String) session.getAttribute(SystemGlobals.getValue(ConfigKeys.SSO_PASSWORD_ATTRIBUTE));   
  39.   
  40.                     if (email == null) {   
  41.                         email = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_EMAIL);   
  42.                     }   
  43.   
  44.                     if (password == null) {   
  45.                         password = SystemGlobals.getValue(ConfigKeys.SSO_DEFAULT_PASSWORD);   
  46.                     }   
  47.   
  48.                     utils.register(password, email);//JForum设置该user为登陆状态    
  49.                 }   
  50.   
  51.                 this.configureUserSession(userSession, utils.getUser());   
  52.             }   
  53.         }   
  54.         catch (Exception e) {   
  55.             e.printStackTrace();   
  56.             throw new ForumException("Error while executing SSO actions: " + e);   
  57.         }   
  58.     }  
分享到:
评论

相关推荐

    sso.rar_DotNetCasClient.dll_sso_sso 单点登录_单点登录_鍗曠偣鐧诲綍

    单点登录(Single Sign-On,简称SSO)是一种网络身份验证技术,允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在IT领域,它极大地提升了用户体验和安全性,尤其对于大型企业或组织,管理...

    sso单点登录ppt.ppt

    sso单点登录ppt.ppt

    SSO__单点登录__微软解决方案__设计文档.rar

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。在企业信息化系统集成(EIA)中,SSO是提升用户体验和安全性的重要技术。微软作为...

    PHP 使用TP5.0 实现SSO单点登录

    因为公司要实现SSO单点登录的效果,最近在网上找了一些资料,但是都没有好用的, 所以自己用PHP 使用TP5.0 实现了SSO单点登录,可以跨多个域名。 下载后在本地配置好 A,B,C 3个网站,就可以模拟效果了。

    SSO单点登录

    SSO单点登录

    SSO单点登录解决方案

    SSO(Single Sign-On)单点登录是一种网络访问控制机制...对于理解SSO单点登录解决方案,提升企业内部系统的用户体验和安全管理具有重要价值。通过深入学习这些资料,可以掌握如何设计和实施一个高效、安全的SSO系统。

    sso.rar_IIS ad java_iis_sso_sso IIS_单点登录

    标题 "sso.rar_IIS ad java_iis_sso_sso IIS_单点登录" 提供的信息表明,这个压缩包包含的是关于IIS(Internet Information Services)与Java环境下的Active Directory(AD)单点登录(Single Sign-On, SSO)的实现...

    关于SSO单点登录的简单实现

    SSO(Single Sign-On)单点登录...总之,SSO单点登录为用户提供了便捷的访问体验,同时降低了管理多系统登录的复杂性。通过理解其原理和实现方式,我们可以根据具体需求选择合适的技术方案,构建高效且安全的SSO系统。

    sso单点登录

    SSO单点登录技术是现代企业级应用架构中不可或缺的一部分,它通过统一的身份认证服务提升了用户体验,降低了运维复杂度。"Simple-SSO"项目为开发者提供了一个学习和实践SSO的平台,结合Maven的项目管理,使得分布式...

    cas.rar_CAS SSO_single_sso_sso java_单点登录 java

    单点登录的英文名称为Single Sign-On,简写为SSO,它是一个用户认证的过程,允许用户一次性进行认证之后,就访问系统中不同的应用;而不需要访问每个应用时,都重新输入密码。IBM对SSO有一个形象的解释“单点登录、...

    SSO单点登陆解决方案

    SSO单点登录解决方案 SSO(Single Sign-On)单点登录解决方案旨在提供一个统一的身份验证入口,满足集团多个成员网站的身份验证需求。该方案的主要目标是实现单点登录,提高用户体验,降低成员网站的登录负载,并...

    sso单点登录demo

    这个“sso单点登录demo”是一个Java实现的示例,包含了三种不同的场景:相同域名、相同父类域名以及不同域名的SSO解决方案。 1. **相同域名的SSO** (`sso_same_domain`): 在同一域名下实现SSO,通常比较直接,因为...

    基于JWT实现SSO单点登录流程图解

    基于JWT实现SSO单点登录流程图解 基于JWT实现SSO单点登录流程图解是指使用JSON Web Token(JWT)来实现单点登录(SSO)的机制。在这种机制中,用户只需要登录一次,就可以访问多个应用服务器上的资源,而不需要再次...

    sso单点登录源代码

    在“sso单点登录源代码”中,我们可以看到以下几个关键组成部分: 1. **SSOLab.sln**:这是一个Visual Studio解决方案文件,包含了整个SSO项目的所有组件。通过这个文件,开发者可以打开并管理整个项目,包括各个子...

    springCloud-master_单点登录_springCloud单点登录_SpringCloud系统_springclou

    在"springCloud-master_单点登录_springCloud单点登录_SpringCloud系统_springcloud eureka单点登录"这个项目中,我们将重点探讨如何在SpringCloud环境中实现单点登录(Single Sign-On,简称SSO)。 单点登录是一种...

Global site tag (gtag.js) - Google Analytics