SSO單點登錄原理及實現
阿新 • • 發佈:2017-09-15
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單點登錄原理及實現