1. 程式人生 > >SSO單點登錄原理及實現

SSO單點登錄原理及實現

response dem nbsp boolean 配置文件 實現 有效 ucc ons

1.SSO分類

  根據實現的域不同,可以把SSO分為同域SSO、同父域SSO、跨域SSO三種類型。

2.SSO實現原理

a.打開統一的登錄界面

b.登錄,同時向服務器寫入Cookie

c.進入其他應用

d.判斷是否有對應的Cookie

  如果沒有則進入統一的登錄界面

  如果有則進入下一步驗證

e.服務器驗證Cookie的有效性

  如果有效則進入下一步

  如果無效則打開統一的登錄界面

f.成功進入應用頁面

3.同域SSO的實現

a.定義一個公共的登錄頁面

  登錄頁面是通過訪問不同路徑的action跳轉而來。

  在頁面中需要用戶名、密碼和跳轉的url。根據不同的訪問路徑,確定需要跳轉的不同地址,所以用myurl隱藏域來接收不同的跳轉地址。

<body>
    <center>
        <h1>請登錄</h1>
        <form action="/SSO/sso/doLogin.action" method="post">
            <span>用戶名:</span><input type="text" name="username">
            <span>密碼:</span><input type="password" name="password">
            <input type="hidden" name="myurl" value="${myurl }">
            <input type="submit" value="提交"/>
        </form>
    </center>
  </body>

b.定義公共登錄後臺

  進入方法後進行用戶名密碼的驗證,如果用戶名密碼正確,則根據規則生成一個Cookie保存,並跳轉到對應的myurl中。

public class SSOAction extends ActionSupport {
    
    private String username;
    private String password;
    private String myurl;
    public String doLogin(){
        boolean result= Check.checkLogon(username,password);
        
if(result){ Cookie cookie = new Cookie("ssocookie","sso"); cookie.setPath("/"); HttpServletResponse response = ServletActionContext.getResponse(); response.addCookie(cookie); return SUCCESS; } return null; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getMyurl() { return myurl; } public void setMyurl(String myurl) { this.myurl = myurl; }

配置文件如下:

    <package name="sso" namespace="/sso" extends="struts-default">
        <action name="doLogin" class="com.imooc.sso.SSOAction" method="doLogin">
            <result name="success" type="redirect">${myurl}</result>
        </action>
    </package>

c.定義兩個同域下的不同訪問路徑

  如demo1和demo2兩個訪問路徑,需要跳轉的myurl不同。進入訪問路徑後,先判斷Cookie的有效性,如果Cookie有效則直接進入訪問頁面,如果Cookie無效則跳轉到公共的登錄頁面。

Demo1Action:

public class Demo1Action extends ActionSupport {
    private String myurl;
    public String main(){
        HttpServletRequest request = ServletActionContext.getRequest();
        if(Check.checkCookie(request)){
            return SUCCESS;
        }
        myurl = "/demo1/main.action";
        return LOGIN;
    }
    public String getMyurl() {
        return myurl;
    }
    public void setMyurl(String myurl) {
        this.myurl = myurl;
    }

Demo2Action:

private String myurl;
    public String main(){
        HttpServletRequest request = ServletActionContext.getRequest();
        if(Check.checkCookie(request)){
            return SUCCESS;
        }
        myurl = "/demo2/main.action";
        return LOGIN;
    }
    public String getMyurl() {
        return myurl;
    }
    public void setMyurl(String myurl) {
        this.myurl = myurl;
    }

配置文件如下:

<package name="demo1" namespace="/demo1" extends="struts-default">
        <action name="main" class="com.imooc.demo1.Demo1Action" method="main">
            <result name="success" >/demo1.jsp</result>
            <result name="login" >/login.jsp</result>
        </action>
    </package>
    
    
    <package name="demo2" namespace="/demo2" extends="struts-default">
        <action name="main" class="com.imooc.demo2.Demo2Action" method="main">
            <result name="success" >/demo2.jsp</result>
            <result name="login" >/login.jsp</result>
        </action>
    </package>

demo1.jsp與demo2.jsp為兩個不同路徑最終登錄成功需要訪問的頁面。

到此,一個簡單的同域SSO單點登錄功能就已經實現。

根據demo1的訪問路徑第一次訪問時,沒有對應的Cookie,則跳轉到公共的登錄頁面進行登錄。公共登錄頁面驗證賬號有效性後,生成Cookie,並跳轉到demo1的訪問頁面(demo1.jsp);此時根據demo2的訪問路徑進行訪問時,判斷Cookie生效,則直接進入demo2的訪問頁面(demo2.jsp)。

SSO單點登錄原理及實現