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)。

 

posted @ 2017-09-14 23:22  建宁小骄傲  阅读(347)  评论(0编辑  收藏  举报