web-sso程式碼分析

來源:互聯網
上載者:User

標籤:產生   原始碼   name   關係   成功   nts   pack   result   hash   

3.2 WEB-SSO代碼講解3.2.1身份認證服務代碼解析Web-SSO的原始碼可以從網站地址http://gceclub.sun.com.cn/wangyu/web-sso/websso_src.zip下載。身份認證服務是一個標準的web應用,包括一個名為SSOAuth的Servlet,一個login.jsp檔案和一個failed.html。身份認證的所有服務幾乎都由SSOAuth的Servlet來實現了;login.jsp用來顯示登入的頁面(如果發現使用者還沒有登入過);failed.html是用來顯示登入失敗的資訊(如果使用者的使用者名稱和密碼與資訊資料庫中的不一樣)。SSOAuth的代碼如下面的列表顯示,結構非常簡單,先看看這個Servlet的主體部分:package DesktopSSO; import java.io.*;import java.net.*;import java.text.*;import java.util.*;import java.util.concurrent.*; import javax.servlet.*;import javax.servlet.http.*;  public class SSOAuth extends HttpServlet {       static private ConcurrentMap accounts;    static private ConcurrentMap SSOIDs;    String cookiename="WangYuDesktopSSOID";    String domainname;       public void init(ServletConfig config) throws ServletException {        super.init(config);        domainname= config.getInitParameter("domainname");        cookiename = config.getInitParameter("cookiename");        SSOIDs = new ConcurrentHashMap();        accounts=new ConcurrentHashMap();        accounts.put("wangyu", "wangyu");        accounts.put("paul", "paul");        accounts.put("carol", "carol");    }     protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        PrintWriter out = response.getWriter();        String action = request.getParameter("action");        String result="failed";        if (action==null) {            handlerFromLogin(request,response);        } else if (action.equals("authcookie")){            String myCookie = request.getParameter("cookiename");            if (myCookie != null) result = authCookie(myCookie);            out.print(result);            out.close();        } else if (action.equals("authuser")) {           result=authNameAndPasswd(request,response);            out.print(result);            out.close();        } else if (action.equals("logout")) {            String myCookie = request.getParameter("cookiename");            logout(myCookie);            out.close();        }    } ..... } 從代碼很容易看出,SSOAuth就是一個簡單的Servlet。其中有兩個靜態成員變數:accounts和SSOIDs,這兩個成員變數都使用了JDK1.5中安全執行緒的MAP類: ConcurrentMap,所以這個範例一定要JDK1.5才能運行。Accounts用來存放使用者的使用者名稱和密碼,在init()的方法中可以看到我給系統添加了三個合法的使用者。在實際應用中,accounts應該是去資料庫中或LDAP中獲得,為了簡單起見,在本範例中我使用了ConcurrentMap在記憶體中用程式建立了三個使用者。而SSOIDs儲存了在使用者成功的登入後所產生的cookie和使用者名稱的對應關係。它的功能顯而易見:當使用者成功登入以後,再次訪問別的系統,為了鑒別這個使用者請求所帶的cookie的有效性,需要到SSOIDs中檢查這樣的映射關係是否存在。 在主要的請求處理方法processRequest()中,可以很清楚的看到SSOAuth的所有功能
  1. 如果使用者還沒有登入過,是第一次登入本系統,會被跳轉到login.jsp頁面(在後面會解釋如何跳轉)。使用者在提供了使用者名稱和密碼以後,就會用handlerFromLogin()這個方法來驗證。
  2. 如果使用者已經登入過本系統,再訪問別的應用的時候,是不需要再次登入的。因為瀏覽器會將第一次登入時產生的cookie和請求一起發送。效驗cookie的有效性是SSOAuth的主要功能之一。
  3. SSOAuth還能直接效驗非login.jsp頁面過來的使用者名稱和密碼的效驗請求。這個功能是用於非web應用的SSO,這在後面的案頭SSO中會用到。
  4. SSOAuth還提供logout服務。
 下面看看幾個主要的功能函數: private void handlerFromLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        String username = request.getParameter("username");        String password = request.getParameter("password");        String pass = (String)accounts.get(username);        if ((pass==null)||(!pass.equals(password)))            getServletContext().getRequestDispatcher("/failed.html").forward(request, response);        else {            String gotoURL = request.getParameter("goto");            String newID = createUID();            SSOIDs.put(newID, username);            Cookie wangyu = new Cookie(cookiename, newID);            wangyu.setDomain(domainname);            wangyu.setMaxAge(60000);            wangyu.setValue(newID);            wangyu.setPath("/");            response.addCookie(wangyu);            System.out.println("login success, goto back url:" + gotoURL);            if (gotoURL != null) {                PrintWriter out = response.getWriter();                response.sendRedirect(gotoURL);                out.close();            }        }      }handlerFromLogin()這個方法是用來處理來自login.jsp的登入請求。它的邏輯很簡單:將使用者輸入的使用者名稱和密碼與預先設定好的使用者集合(存放在accounts中)相比較,如果使用者名稱或密碼不匹配的話,則返回登入失敗的頁面(failed.html),如果登入成功的話,需要為使用者當前的session建立一個新的ID,並將這個ID和使用者名稱的映射關係存放到SSOIDs中,最後還要將這個ID設定為瀏覽器能夠儲存的cookie值。登入成功後,瀏覽器會到哪個頁面呢?那我們回顧一下我們是如何使用身份認證服務的。一般來說我們不會直接存取身份服務的任何URL,包括login.jsp。身份服務是用來保護其他應用服務的,使用者一般在訪問一個受SSOAuth保護的Web應用的某個URL時,當前這個應用會發現當前的使用者還沒有登入,便強制將也頁面轉向SSOAuth的login.jsp,讓使用者登入。如果登入成功後,應該自動的將使用者的瀏覽器指向使用者最初想訪問的那個URL。在handlerFromLogin()這個方法中,我們通過接收“goto”這個參數來儲存使用者最初訪問的URL,成功後便重新定向到這個頁面中。另外一個要說明的是,在設定cookie的時候,我使用了一個setMaxAge(6000)的方法。這個方法是用來設定cookie的有效期間,單位是秒。如果不使用這個方法或者參數為負數的話,當瀏覽器關閉的時候,這個cookie就失效了。在這裡我給了很大的值(1000分鐘),導致的行為是:當你關閉瀏覽器(或者關機),下次再開啟瀏覽器訪問剛才的應用,只要在1000分鐘之內,就不需要再登入了。我這樣做是下面要介紹的案頭SSO中所需要的功能。其他的方法更加簡單,這裡就不多解釋了。 

web-sso程式碼分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.