单点登陆(Single Sign-On)

什么是单点登陆?

单点登录(Single Sign-On,简称 SSO)是一种身份验证和授权机制,在多个应用程序或系统间实现用户一次登录,即可访问多个相关系统,而无需再次输入认证信息。也就是我们所说的一处登陆处处登陆。

web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担,而不是用户。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了。

单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie。

同域下的单点登录

一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。

实现方式:
在sso.a.com中登录了,其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.a.com下写入了Cookie。那么我们怎么才能让app1.a.com和app2.a.com登录呢?这里有两个问题:

Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

代码实现

全局异常

    @ExceptionHandler
    public String pException(Exception e){
        log.error("异常信息:{}",e);
        return "exception";

    }

2.在其他未登录的页面实现登陆跳转的操作,一旦登陆,立即返回到原来页面

在web端实现跳转

 methods:{
            getSkuAll: function(){
                $.post("/getSkuAll", {}, function (req){
                    if("exception"==req){
                        location.href="http://localhost:8038/login?returnUrl=http://localhost:8040"
                    }
                    app.skuList=req;
                });
            },
 methods:{
            payPlanAll: function(){
                $.post("/payPlanAll", {}, function (req){
                    if("exception"==req){
                        location.href="http://localhost:8038/login?returnUrl=http://login:8041"
                    }
                    app.planList=req;
                });
            },
        },

进入统一登陆页面

 @Autowired
    private LoginService loginService;
    /**
     * 登录页面跳转
     * @return
     */
    @RequestMapping("/login")
    //将cookie储存到response。从login里面取用
    public String login(String returnUrl,HttpServletResponse response){

        Cookie cookie=new Cookie("returnUrl",returnUrl);
        cookie.setDomain("localhost");
        cookie.setPath("/");
        response.addCookie(cookie);
        return "login";
    }
 /**
*创建一个名为"returnUrl"的Cookie对象,值为传入的返回URL。
*使用setDomain()方法设置Cookie的域为"localhost",这样客户端在访问该域下的其他页面时都会发送该Cookie。
*使用setPath()方法设置Cookie的路径为"/",表示该Cookie在整个网站中都可访问。
*使用response.addCookie()方法将该Cookie添加到HTTP响应中,以便在客户端进行保存。
*返回字符串"login",进入登录页面。
*/

 

在web端未登录时,会跳转到登陆页面,就是login页面,也是我们所说的统一登录页面,在这里我设置的登陆端口为8038

<head>
    <meta charset="UTF-8">
    <title>统一登陆平台</title>
</head>
<body>
<div>
  <form action="/uums/login" method="post">
     <div>
       账号:<input name="username" type="text">
     </div>
     <div>
       密码:<input name="password" type="password">
     </div>
     <div>
       <button type="submit">登陆</button>
     </div>
  </form>

service

根据输入的账号密码进行验证,如果用户名账号密码正确,就会生成一个jwt,然后将jwt放到cookie里面,进入到登陆平台,也就意味登录成功但是如果账号或密码有误,就会重新返回到登录页面,

    @Override
    public String login(String username, String password) {
        String jwt= loginFeign.login(username, password);
        if(StringUtils.isEmpty(jwt)
//                || !JWTUtil.verify(jwt,"woniu".getBytes())
        ){
            return "login";
        }
        //把jwt放到cookie
        Cookie cookie=new Cookie("token",jwt);
        cookie.setDomain("localhost");
        cookie.setPath("/");

        response.addCookie(cookie);



        //验证通过,进入统一登录平台首页
        return "index";
    }
}

 登陆成功之后,首先会进行登陆校验

 /**
     * 登录验证
     * @return
     */
    @RequestMapping("/uums/login")
    public String uumslogin(String username,String password){
        return loginService.login(username,password);
    }

验证账号密码是否存在

验证通过之后可以在浏览器查看token

同时其他任何页面,都可以访问,实现单点登陆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSO 也称为单点登录,就是就是通过用户的一次性鉴别登录,即可获得需访问系统和应用软件的授权,在此条件下,管理员无需修改或干涉用户登录就能方便的实施希望得到的安全控制。 随着信息技术和网络技术的发展,各种应用服务的不断普及,用户每天需要登录到许多不同的信息系统,如网络、邮件、数据库、各种应用服务器等。每个系统都要求用户遵循一定的安全策略,比如要求输入用户ID和口令。随着用户需要登录系统的增多,出错的可能性就会增加,受到非法截获和破坏的可能性也会增大,安全性就会相应降低。而如果用户忘记了口令,不能执行任务,就需要请求管理员的帮助,并只能在重新获得口令之前等待,造成了系统和安全管理资源的开销,降低了生产效率。为避免这种尴尬,牢记登录信息,用户一般会简化密码,或者在多个系统中使用相同的口令,或者创建一个口令"列表"--这些都是会危及公司信息保密性的几种习惯性做法。 当这些安全风险逐步反映出来,管理员增加一些新的安全措施的时候,这些措施却在减少系统的可用性,并且会增大系统管理的复杂度。 因此,在市场上提出了这样的需求:网络用户可以基于最初访问网络时的一次身份验证,对所有被授权的网络资源进行无缝的访问。从而提高网络用户的工作效率,降低网络操作的费用,并提高网络的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值