关于java:单点登录原理介绍

8次阅读

共计 2068 个字符,预计需要花费 6 分钟才能阅读完成。

传统形式登录问题

阐明:如果采纳 SESSION 的形式实现登录操作,因为 nginx 负载平衡的策略,用户能够拜访不同的服务器,然而 SESSION 不能共享,所以导致用户频繁登录,体验不好。

SSO

单点登录(Sing 了 SignOn,SSO)就是通过用户的一次性甄别登录,当用户在身份认证服务器上登录一次后,即可取得拜访单点登录零碎中其余管理系统和应用软件的权限。同时这种实现是不须要管理员对用户的登录状态或其余信息进行批改的,这意味着在多个利用零碎中,用户只须要登录一次就能够拜访所有相互信任的利用零碎。这种形式缩小了由登录产生的工夫耗费,辅助了用户治理,是目前比拟风行的。

我的项目单点登录设计


实现步骤:
1. 当用户输出用户名和明码点击登录时,将申请发给 WEB 消费者服务器。
2.WEB 服务器将用户信息传递给 SSO 单点登录零碎实现数据校验。
3. 如果登录胜利,则动静生成密匙信息,将 user 数据转化为 json,保留在 redis 中,留神超时工夫的设定。
4.SSO 将登录的凭证传给 WEB 服务器。
5.WEB 服务器将用户密匙 TICKET 信息保留到用户的 cookie 中,留神超时工夫设定。
6. 如果登录不胜利,则间接返回错误信息即可。

用户单点登录实现

页面 url 剖析

页面参数剖析

页面 JS 剖析

编辑 UserController

/**
 * 实现登录操作:*      1.url 地址:http://www.jt.com/user/doLogin?r=0.2054949537866282
 *      2. 参数:用户名和明码 username,password。*      3. 返回值后果:Sysresult
 *Cookie 应用:*      1. 创立 Cookie
 *          Cookie cookie=new Cookie("名字",ticket);
 *      2.setpath("/"):path 示意如果须要获取 cookie 中的数据,则 url 地址所在门路设定
 *      3.setDomian("xxxxx"):设定 cookie 共享的域名地址, 是实现单点登录必备的因素!* 通过 response 对象发送 cookie 到客户端中
 */
@RequestMapping("/doLogin")
@ResponseBody
public SysResult doLogin(User user, HttpServletResponse response){String ticket=userService.doLogin(user);
    if(StringUtils.isEmpty(ticket)){
        // 阐明用户名和明码谬误
 return SysResult.fail();}else{
        /*// 创立 Cookie 这种写法比拟繁琐,所以利用 cookie 工具 API
 Cookie cookie=new Cookie("JT_TICKET", ticket); cookie.setMaxAge(7*24*60*60);// 设定 cookie 存活有效期
 cookie.setPath("/");// 设定 cookie 无效范畴
 cookie.setDomain("jt.com");// 设定 cookie 共享的域名
 response.addCookie(cookie);*/ // 利用 cookie 工具 API
 CookieUtil.addCookie(response, "JT_TICKET", ticket, 7*24*60*60,"jt.com");
        return SysResult.success();// 示意用户登录胜利}
}

编辑 UserService

/**
     * 1. 获取用户信息校验数据库中是否有记录
     * 2. 有  开始执行单点登录流程
     * 3. 没有 间接返回 null 即可
     * @param user
     * @return
     */
    @Override
    public String doLogin(User user) {  //username/password
        //1. 将明文加密
        String md5Pass =
                DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setPassword(md5Pass);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        // 依据对象中不为 null 的属性当做 where 条件.
        User userDB = userMapper.selectOne(queryWrapper);
        if(userDB == null){
            // 用户名或明码谬误
            return null;
        }else{ // 用户名和明码正确  实现单点登录操作
            String ticket = UUID.randomUUID().toString();
            // 如果将数据保留到第三方 个别须要脱敏解决
            userDB.setPassword("123456 你信不??");
            String userJSON = ObjectMapperUtil.toJSON(userDB);
            jedisCluster.setex(ticket, 7*24*60*60, userJSON);
            return ticket;
        }
    }

页面成果展现

正文完
 0