`

java实现简单的单点登录(5)

阅读更多

    下面是登录模块DesktopSSOLoginModule的主体:login()方法。逻辑也是非常简单:先用Cookie来登陆,如果成功,则直接就进入系统,否则需要用户输入用户名和密码来登录系统。
        public boolean login() throws LoginException{
            try {
                if (Cookielogin()) return true;
            } catch (IOException ex) {
                ex.printStackTrace();
            }
          if (passwordlogin()) return true;
          throw new FailedLoginException();
     }
     
    下面是Cookielogin()方法的实体,它的逻辑是:先从Cookie文件中获得相应的Cookie值,通过身份效验服务效验Cookie的有效性。如果cookie有效就算登录成功;如果不成功或Cookie不存在,用cookie登录就算失败。
        public boolean Cookielogin() throws LoginException,IOException {
          String cookieValue="";
          int cookieIndex =foundCookie();
          if (cookieIndex<0)
                return false;
          else
                cookieValue = getCookieValue(cookieIndex);
         username = cookieAuth(cookieValue);
         if (! username.equals("failed")) {
             loginSuccess = true;
             return true;
         }
         return false;
     }
     
     
    用用户名和密码登录的方法要复杂一些,通过Callback的机制和屏幕输入输出进行信息交互,完成用户登录信息的获取;获取信息以后通过userAuth方法来调用远端SSOAuth的服务来判定当前登录的有效性。
       public boolean passwordlogin() throws LoginException {
        //
        // Since we need input from a user, we need a callback handler
        if (callbackHandler == null) {
           throw new LoginException("No CallbackHandler defined");
        }
        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("Username");
        callbacks[1] = new PasswordCallback("Password", false);
        //
        // Call the callback handler to get the username and password
        try {
          callbackHandler.handle(callbacks);
          username = ((NameCallback)callbacks[0]).getName();
          char[] temp = ((PasswordCallback)callbacks[1]).getPassword();
          password = new char[temp.length];
          System.arraycopy(temp, 0, password, 0, temp.length);
          ((PasswordCallback)callbacks[1]).clearPassword();
        } catch (IOException ioe) {
          throw new LoginException(ioe.toString());
        } catch (UnsupportedCallbackException uce) {
          throw new LoginException(uce.toString());
        }
       
        System.out.println();
        String authresult ="";
        try {
            authresult = userAuth(username, password);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (! authresult.equals("failed")) {
            loginSuccess= true;
            clearPassword();
            try {
                updateCookie(authresult);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return true;
        }
      
     
        loginSuccess = false;
        username = null;
        clearPassword();
        System.out.println( "Login: PasswordLoginModule FAIL" );
        throw new FailedLoginException();
     }
     
     
    CookieAuthuserAuth方法都是利用apahcehttpclient工具包和远程的SSOAuth进行http连接,获取服务。
            private String cookieAuth(String cookievalue) throws IOException{
            String result = "failed";
           
            HttpClient httpclient = new HttpClient();      
            GetMethod httpget = new GetMethod(SSOServiceURL+Action1+cookievalue);
       
            try {
                httpclient.executeMethod(httpget);
                result = httpget.getResponseBodyAsString();
            } finally {
                httpget.releaseConnection();
            }
            return result;
        }
     
    private String userAuth(String username, char[] password) throws IOException{
            String result = "failed";
            String passwd= new String(password);
            HttpClient httpclient = new HttpClient();      
            GetMethod httpget = new GetMethod(SSOServiceURL+Action2+username+"&password="+passwd);
            passwd = null;
       
            try {
                httpclient.executeMethod(httpget);
                result = httpget.getResponseBodyAsString();
            } finally {
                httpget.releaseConnection();
            }
            return result;
           
        }
     
    还有一个地方需要补充说明的是,在本样例中,用户名和密码的输入都会在屏幕上显示明文。如果希望用掩码形式来显示密码,以提高安全性,请参考:http://java.sun.com/developer/technicalArticles/Security/pwordmask/
    真正安全的全方位SSO解决方案:Kerberos
    我们的样例程序(桌面SSOWEB-SSO)都有一个共性:要想将一个应用集成到我们的SSO解决方案中,或多或少的需要修改应用程序。Web应用需要配置一个我们预制的filter;桌面应用需要加上我们桌面SSOJAAS模块(至少要修改JAAS的配置文件)。可是有很多程序是没有源代码和无法修改的,例如常用的远程通讯程序telnetftp等等一些操作系统自己带的常用的应用程序。这些程序是很难修改加入到我们的SSO的解决方案中。
    事实上有一种全方位的SSO解决方案能够解决这些问题,这就是Kerberos协议(RFC 1510)。Kerberos是网络安全应用标准(http://web.mit.edu/kerberos/),由MIT学校发明,被主流的操作系统所采用。在采用kerberos的平台中,登录和认证是由操作系统本身来维护,认证的凭证也由操作系统来保存,这样整个桌面都可以处于同一个SSO的系统保护中。操作系统中的各个应用(如ftp,telnet)只需要通过配置就能加入到SSO中。另外使用Kerberos最大的好处在于它的安全性。通过密钥算法的保证和密钥中心的建立,可以做到用户的密码根本不需要在网络中传输,而传输的信息也会十分的安全。
    目前支持Kerberos的操作系统包括Solaris, windows,Linux等等主流的平台。只不过要搭建一个Kerberos的环境比较复杂,KDC(密钥分发中心)的建立也需要相当的步骤。Kerberos拥有非常成熟的API,包括JavaAPI。使用Java Generic Security Services(GSS) API并且使用JAAS中对Kerberos的支持(详细信息请参见SunJava&Kerberos教程http://java.sun.com/ j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html),要将我们这个样例改造成对Kerberos的支持也是不难的。 值得一提的是在JDK6.0 http://www.java.net/download/jdk6)当中直接就包含了对GSS的支持,不需要单独下载GSS的包。
     
    总结
    本文的主要目的是阐述SSO的基本原理,并提供了一种实现的方式。通过对源代码的分析来掌握开发SSO服务的技术要点和充分理解SSO的应用范围。但是,本文仅仅说明了身份认证的服务,而另外一个和身份认证密不可分的服务----权限效验,却没有提到。要开发出真正的SSO的产品,在功能上、性能上和安全上都必须有更加完备的考虑。
     
    资源链接


分享到:
评论

相关推荐

    JAVA单点登录的实现

    1,通过session会话来判断 2,实现单点登录

    JAVA实现单点登录功能

    JAVA 实现单点登录功能 ! 包含 所有的详细文档 ! 试用手册值得学习

    最新java实现简单的单点登录

    在提供的压缩包"最新java实现简单的单点登录.doc"中,可能包含了关于如何使用Java Web和Spring Security实现SSO的具体步骤、配置代码示例和常见问题解答等内容。读者可以通过阅读这份文档,进一步了解和学习如何在...

    基于Java集成CAS单点登录【接部署即可启用】

    基于Java中CAS的单点登录,有服务端的所有源码,将tomcat目录下的所有资源直接拷到Tomcat服务中间件的webapp目录下,阅读tomcat-webapp中的read.txt文档,查看使用说明,适用于第一次开发CAS单点登录的同学们,简单...

    java实现简单的单点登录

    间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式...

    用Java实现单点登录

    单点登录(Single Sign-...以上就是Java实现单点登录的一些关键知识点,每个方面都需要深入了解和恰当配置,以构建一个安全、高效的SSO系统。实际开发过程中,还需要结合业务场景,考虑性能、扩展性和用户体验等因素。

    java跨域单点登录实现

    Java跨域单点登录(Single Sign-On,SSO)实现是一项关键的系统集成技术,它允许用户在多个应用系统中只需登录一次,就能访问所有相互信任的应用系统,无需再次进行身份验证。本项目代码着重展示了如何在Java环境中...

    java实现单点登录_图例及相关代码

    Java 实现单点登录技术详解 单点登录(SSO)是一种流行的企业业务整合解决方案,它允许用户在多个应用系统中只需要登录一次就可以访问所有相互信任的应用系统。SSO 技术的出现是为了解决企业内部多个业务系统之间的...

    跨服务器登录验证(单点登录SSO)的过程和Java实现

    跨服务器登录验证(单点登录SSO)的过程和Java实现 跨服务器登录验证(单点登录SSO)是指用户只需要登录一次便可以访问多个相关的应用系统的机制。这种机制可以提高用户体验和系统安全性。下面我们将介绍跨服务器...

    微博Oauth2.0 协议用java 实现单点登录获取用户信息

    在Java中实现微博的单点登录(Single Sign-On, SSO)功能,涉及到的主要步骤包括注册应用、获取授权码、交换访问令牌、获取用户信息等。下面我们将详细探讨这些过程。 1. **注册应用**: 在开始实现之前,你需要在...

    java单点登录流程及其他

    在 Java 中实现单点登录需要使用到 Jwt(JSON Web Tokens),Jwt 是一种基于 Token 的身份验证机制,可以与 SSO 一起使用,但并不是 SSO 的必要组成部分。 首先,我们需要配置 SecurityConfig 类,该类是 Spring ...

    java实现可跨浏览器单点登录

    单点登录(Single Sign On,简称SSO)是一种身份验证机制,允许用户在一次登录后,无需再次输入凭证即可访问多个相互信任的应用系统。在Java环境下实现SSO,可以为企业的信息化管理提供便利,减少用户的登录操作,...

    java应用系统单点登录

    它通过共享Session和Cookie来实现单点登录。在Shiro中,可以通过配置Realm(域)来对接不同的认证源,如数据库、LDAP、CAS等。 4. **JWT(JSON Web Token)**: JWT是一种开放标准,用于在网络应用之间安全地传输...

    shiro+spring+data+session+redis实现单点登录

    本案例聚焦于使用Apache Shiro、Spring、Spring Data以及Redis来实现单点登录功能,下面将详细解释这些组件以及它们如何协同工作。 **Apache Shiro** Apache Shiro是一款轻量级的安全框架,提供了认证、授权、会话...

    "java实现简单的单点登录"源码包

    http://www.blogjava.net/xcp/archive/2010/04/13/318125.html 页面的源码地址无法访问,我在其他地方找到了。可以运行的三个简单应用,配置完成后可以实现单点登录,供初学者研究其原理。

    spring+springMvc简单实现SSO单点登录

    利用springMvc 实现的简单的单点登录Demo,内含三个小Mavn项目分别是 1、认证中心SSOServer 2、子系统1SSOClient1 3、子系统2SSOClient2 文章请参考 http://blog.csdn.net/qq_31183297/article/details/79419222

    Java实现基于KeyCloak的单点登录权限管理POC验证源码.zip

    Java实现基于KeyCloak的单点登录权限管理POC验证源码.zipJava实现基于KeyCloak的单点登录权限管理POC验证源码.zipJava实现基于KeyCloak的单点登录权限管理POC验证源码.zipJava实现基于KeyCloak的单点登录权限管理POC...

    java-cas单点登录服务端

    CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,本文介绍了 CAS 的原理、协议、在 Tomcat 中的配置和使用,研究如何采用 CAS 实现轻量级单点登录解决方案。 CAS 是 Yale 大学发起的...

    rtx单点登录(JAVA实现)

    jsp实现RXT单点登录,单点登录要求在OA服务器安装Server SDK开发包,同时需要配置RTX服务器安装目录下的AppConnConfig.xml文件,把OA服务器的IP地址加进来,例如OA服务器地址为172.30.21.20,配置如下所示: ...

    CAS单点登录(java)

    CAS单点登录CAS单点登录CAS单点登录CAS单点登录

Global site tag (gtag.js) - Google Analytics