一、什么是单点登录
SSO 英文名称 Single Sign On,单点登录。SSO 是在多个应用中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
二、登录流程
三、实现步骤简介
1、创建 maliujia-sso
这里说一些如何解决静态资源加载的问题。
nginx 作为web服务器对于处理静态资源在速度和并发量上,相比应用服务器有着天然的优势,下面介如何使用 nginx 加载静态资源。
(1)、使用新域名访问静态资源:static.maliujia.com。这样做的好处是避免携带一些无用的cookie。
(2)、新建一个目录用于存放 js 和 css 等文件。
(3)、修改 Nginx 配置,新增配置如下,然后重启 nginx。
server{
listen : 80 l
server_name : static.maliujia.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forward-for ;
proxy_set_header Host $host;
location /{
root:E:\\0114\\maliujia-static
}
}
(4)、修改web应用引用静态文件的路径。
2、Controller 登录代码
public Map<String , Object> login(String username , String password){
Map<String , Object> result = new HashMap<String , Object>();
//登录成功应该返回 token
String token = userService.doLongin(username , password);
if(null==token){
result.put("status",400);
}else{
//登录成功,需要将token写入到cookie中
result.put("status",200);
CookieUtils.setCookie(request, response,COOKIE_NAME, token);//二级域名可以将 cookie 写入到主域名下。
//二级域名之间不能互相写入
}
}
3、Service doLogin 代码
public String doLongin(String username , String password ) throws Exception{
User user = userMapper.selectByUserName(username);
if(user==null){
return null ;
}
if(!StringUtils.equals(DigestUtils.md5Hex(passward),user.getPassward())){
return null;
}
//登录成功
String token = DigestUtils.md5Hex (System.currentTimeMills()+username);// DigestUtils. md5Hex 是Apache 提供的加密工具
//commons-codec 可以使用 mysql 的 MD5函数查看加密后是否一致
//将用户数据保存的redis中
this.redisService.set("TOKEN_"+token,MAPPER.writeValueAsString(user),60*30);
return token;
}
4、前端刷新token,重新设置 token 的有效时间
用户每一次操作网站,都需要刷新 token 的有效时间,前端首先获取cookie,然后调用单点登录系统的刷新 token 的有效时间即可。此时会涉及到跨域。
jsonp 的本质是通过script标签的src可以跨域请求资源。只能是get请求。
5、每个应用系统用拦截器实现验证用户是否登录
通过实现 HandlerInterceptor 来验证用户是否已经登录或者登录是否失效。