国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
J2EE SSO解決方案札記 - 網(wǎng)絡編程技術 - JavaEye技術網(wǎng)站

J2EE SSO解決方案札記

文章分類:Java編程
一般來說,Web應用需要SSO的功能,應該通過以下的交互過程來調用身份認證服務的提供的認證服務:
  Web應用中每一個需要安全保護的URL在訪問以前,都需要進行安全檢查,如果發(fā)現(xiàn)沒有登錄(沒有發(fā)現(xiàn)認證之后所帶的cookie),就重新定向到SSOAuth中的login.jsp進行登錄。
  登錄成功后,系統(tǒng)會自動給你的瀏覽器設置cookie,證明你已經(jīng)登錄過了。
  當你再訪問這個應用的需要保護的URL的時候,系統(tǒng)還是要進行安全檢查的,但是這次系統(tǒng)能夠發(fā)現(xiàn)相應的cookie。
  有了這個cookie,還不能證明你就一定有權限訪問。因為有可能你已經(jīng)logout,或者cookie已經(jīng)過期了,或者身份認證服務重起過,這些情況下,你的cookie都可能無效。應用系統(tǒng)拿到這個cookie,還需要調用身份認證的服務,來判斷cookie時候真的有效,以及當前的cookie對應的用戶是誰。
  如果cookie效驗成功,就允許用戶訪問當前請求的資源。
  以上這些功能,可以用很多方法來實現(xiàn):
  在每個被訪問的資源中(JSP或Servlet)中都加入身份認證的服務,來獲得cookie,并且判斷當前用戶是否登錄過。不過這個笨方法沒有人會用:-)。
  可以通過一個controller,將所有的功能都寫到一個servlet中,然后在URL映射的時候,映射到所有需要保護的URL集合中(例如*.jsp,/security/*等)。這個方法可以使用,不過,它的缺點是不能重用。在每個應用中都要部署一個相同的servlet。
  Filter是比較好的方法。符合Servlet2.3以上的J2EE容器就具有部署filter的功能。(Filter的使用可以參考JavaWolrd的文章http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html)Filter是一個具有很好的模塊化,可重用的編程API,用在SSO正合適不過。本樣例就是使用一個filter來完成以上的功能。
  package SSO;
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.*;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
public class SSOFilter implements Filter {
    private FilterConfig filterConfig = null;
    private String cookieName="WangYuDesktopSSOID";
    private String SSOServiceURL=  "http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth";
    private String SSOLoginPage= "http://wangyu.prc.sun.com:8080/SSOAuth/login.jsp";
   
    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
        if (filterConfig != null) {
            if (debug) {
                log("SSOFilter:Initializing filter");
            }
        }       
        cookieName = filterConfig.getInitParameter("cookieName");
        SSOServiceURL = filterConfig.getInitParameter("SSOServiceURL");
        SSOLoginPage = filterConfig.getInitParameter("SSOLoginPage");
    } 
.....
.....
}

  以上的初始化的源代碼有兩點需要說明:一是有兩個需要配置的參數(shù) SSOServiceURL和 SSOLoginPage。因為當前的Web應用很可能和身份認證服務(SSOAuth)不在同一臺機器上,所以需要讓這個filter知道身份認證服務部署的URL,這樣才能去調用它的服務。另外一點就是由于身份認證的服務調用是要通過http協(xié)議來調用的(在本樣例中是這樣設計的,讀者完全可以設計自己的身份服務,使用別的調用協(xié)議,如RMI或SOAP等等),所有筆者引用了apache的commons工具包(詳細信息情訪問apache 的網(wǎng)站http://jakarta.apache.org/commons/index.html),其中的“httpclient”可以大大簡化http調用的編程。
  下面看看filter的主體方法doFilter():
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        if (debug) log("SSOFilter:doFilter()");
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String result="failed";
        String url = request.getRequestURL().toString();
        String qstring = request.getQueryString();
        if (qstring == null) qstring ="";
        //檢查http請求的head是否有需要的cookie
        String cookieValue ="";
        javax.servlet.http.Cookie[] diskCookies = request.getCookies();
        if (diskCookies != null) {
            for (int i = 0; i < diskCookies.length; i++) {
                if(diskCookies.getName().equals(cookieName)){
                    cookieValue = diskCookies.getValue();
                    //如果找到了相應的cookie則效驗其有效性
                    result = SSOService(cookieValue);
                    if (debug) log("found cookies!");
                }
            }
        }
        if (result.equals("failed")) { //效驗失敗或沒有找到cookie,則需要登錄
            response.sendRedirect(SSOLoginPage+"?goto="+url);
        } else if (qstring.indexOf("logout") > 1) {//logout服務
            if (debug) log("logout action!");
            logoutService(cookieValue);
            response.sendRedirect(SSOLoginPage+"?goto="+url);
        }  else {//效驗成功
            request.setAttribute("SSOUser",result);
            Throwable problem = null;
            try {
                chain.doFilter(req, res);
            } catch(Throwable t) {
                problem = t;
                t.printStackTrace();
            }      
            if (problem != null) {
                if (problem instanceof ServletException) throw (ServletException)problem;
                if (problem instanceof IOException) throw (IOException)problem;
                sendProcessingError(problem, res);
            }
        }  
    }

  doFilter()方法的邏輯也是非常簡單的,在接收到請求的時候,先去查找是否存在期望的cookie值,如果找到了,就會調用SSOService(cookieValue)去效驗這個cookie的有效性。如果cookie效驗不成功或者cookie根本不存在,就會直接轉到登錄界面讓用戶登錄;如果cookie效驗成功,就不會做任何阻攔,讓此請求進行下去。在配置文件中,有下面的一個節(jié)點表示了此filter的URL映射關系:只攔截所有的jsp請求。
  <filter-mapping>
<filter-name>SSOFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

  下面還有幾個主要的函數(shù)需要說明:

  private String SSOService(String cookievalue) throws IOException {
        String authAction = "?action=authcookie&cookiename=";
        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod(SSOServiceURL+authAction+cookievalue);
        try { 
            httpclient.executeMethod(httpget);
            String result = httpget.getResponseBodyAsString();
            return result;
        } finally {
            httpget.releaseConnection();
        }
    }
   
    private void logoutService(String cookievalue) throws IOException {
        String authAction = "?action=logout&cookiename=";
        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod(SSOServiceURL+authAction+cookievalue);
        try {
            httpclient.executeMethod(httpget);
            httpget.getResponseBodyAsString();
        } finally {
            httpget.releaseConnection();
        }
    }

  這兩個函數(shù)主要是利用apache中的httpclient訪問SSOAuth提供的認證服務來完成效驗cookie和logout的功能。
  其他的函數(shù)都很簡單,有很多都是我的IDE(NetBeans)替我自動生成的。
  4 當前方案的安全局限性
  當前這個WEB-SSO的方案是一個比較簡單的雛形,主要是用來演示SSO的概念和說明SSO技術的實現(xiàn)方式。有很多方面還需要完善,其中安全性是非常重要的一個方面。
  我們說過,采用SSO技術的主要目的之一就是加強安全性,降低安全風險。因為采用了SSO,在網(wǎng)絡上傳遞密碼的次數(shù)減少,風險降低是顯然的,但是當前的方案卻有其他的安全風險。由于cookie是一個用戶登錄的唯一憑據(jù),對cookie的保護措施是系統(tǒng)安全的重要環(huán)節(jié):
  cookie的長度和復雜度
  在本方案中,cookie是有一個固定的字符串(我的姓名)加上當前的時間戳。這樣的cookie很容易被偽造和猜測。懷有惡意的用戶如果猜測到合法的cookie就可以被當作已經(jīng)登錄的用戶,任意訪問權限范圍內的資源
  cookie的效驗和保護
  在本方案中,雖然密碼只要傳輸一次就夠了,可cookie在網(wǎng)絡中是經(jīng)常傳來傳去。一些網(wǎng)絡探測工具(如sniff, snoop,tcpdump等)可以很容易捕獲到cookie的數(shù)值。在本方案中,并沒有考慮cookie在傳輸時候的保護。另外對cookie的效驗也過于簡單,并不去檢查發(fā)送cookie的來源究竟是不是cookie最初的擁有者,也就是說無法區(qū)分正常的用戶和仿造cookie的用戶。
  當其中一個應用的安全性不好,其他所有的應用都會受到安全威脅
因為有SSO,所以當某個處于 SSO的應用被黒客攻破,那么很容易攻破其他處于同一個SSO保護的應用。
  這些安全漏洞在商業(yè)的SSO解決方案中都會有所考慮,提供相關的安全措施和保護手段,例如Sun公司的Access Manager,cookie的復雜讀和對cookie的保護都做得非常好。另外在OpneSSO (https://opensso.dev.java.net)的架構指南中也給出了部分安全措施的解決方案。
  5 當前方案的功能和性能局限性
  除了安全性,當前方案在功能和性能上都需要很多的改進:
  當前所提供的登錄認證模式只有一種:用戶名和密碼,而且為了簡單,將用戶名和密碼放在內存當中。事實上,用戶身份信息的來源應該是多種多樣的,可以是來自數(shù)據(jù)庫中,LDAP中,甚至于來自操作系統(tǒng)自身的用戶列表。還有很多其他的認證模式都是商務應用不可缺少的,因此SSO的解決方案應該包括各種認證的模式,包括數(shù)字證書,Radius, SafeWord ,MemberShip,SecurID等多種方式。最為靈活的方式應該允許可插入的JAAS框架來擴展身份認證的接口
  我們編寫的Filter只能用于J2EE的應用,而對于大量非Java的Web應用,卻無法提供SSO服務。
  在將Filter應用到Web應用的時候,需要對容器上的每一個應用都要做相應的修改,重新部署。而更加流行的做法是Agent機制:為每一個應用服務器安裝一個agent,就可以將SSO功能應用到這個應用服務器中的所有應用。
  當前的方案不能支持分別位于不同domain的Web應用進行SSO。這是因為瀏覽器在訪問Web服務器的時候,僅僅會帶上和當前web服務器具有相同domain名稱的那些cookie。要提供跨域的SSO的解決方案有很多其他的方法,在這里就不多說了。Sun的Access Manager就具有跨域的SSO的功能。
  另外,F(xiàn)ilter的性能問題也是需要重視的方面。因為Filter會截獲每一個符合URL映射規(guī)則的請求,獲得cookie,驗證其有效性。這一系列任務是比較消耗資源的,特別是驗證cookie有效性是一個遠程的http的調用,來訪問SSOAuth的認證服務,有一定的延時。因此在性能上需要做進一步的提高。例如在本樣例中,如果將URL映射從“.jsp”改成“/*”,也就是說filter對所有的請求都起作用,整個應用會變得非常慢。這是因為,頁面當中包含了各種靜態(tài)元素如gif圖片,css樣式文件,和其他html靜態(tài)頁面,這些頁面的訪問都要通過filter去驗證。而事實上,這些靜態(tài)元素沒有什么安全上的需求,應該在filter中進行判斷,不去效驗這些請求,性能會好很多。另外,如果在filter中加上一定的cache,而不需要每一個cookie效驗請求都去遠端的身份認證服務中執(zhí)行,性能也能大幅度提高。
  另外系統(tǒng)還需要很多其他的服務,如在內存中定時刪除無用的cookie映射等等,都是一個嚴肅的解決方案需要考慮的問題。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
編寫你自己的單點登錄(SSO)服務 2
Android下對Cookie的讀寫操作(附Demo) | 望月聽濤
使用HttpClient模擬網(wǎng)站登陸sina郵箱(保持遠程服務器session和cookie) (轉載) - 海浪 - 博客園
Servlet 3.0筆記之會話Cookie設置相關
Apache Shiro實現(xiàn)單點登錄SSO | 沐風
JForum論壇單點登錄的幾種實現(xiàn)方式 (CAS和Cookie)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服