SSO单点登录原理及实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSO单点登录原理及实现相关的知识,希望对你有一定的参考价值。
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单点登录原理及实现的主要内容,如果未能解决你的问题,请参考以下文章