作为分布式项目,单点登录是必不可少的,文本基于之前的的博客(猛戳:SpringCloud系列——Zuul动态路由,SpringBoot系列——复述)记录Zuul配合复述,实现一个简单的sso单点登录实例
sso单点登录思路:
1,访问分布式系统的任意请求,被Zuul的过滤器拦截过滤
2,在运行方法里实现过滤规则:饼干有令牌accessToken且作为关键存在于复述,或者访问的是登录页面,登录请求则放行
3,否则,将重定向到sso-server的登录页面且原先的请求路径作为一个参数;response.sendRedirect (" http://localhost: 10010/sso-server/sso/loginPage& # 63; url=" + url);
4,登录成功,sso-server生成accessToken,并作为关键(用户名+时间戳,这里只是演示,正常项目的令牌应该要更为复杂)存到复述,价值值存用户身份证作为价值(或者直接存储可暴露的部分用户信息也行)设置过期时间(我这里设置3分钟),设置饼干:新饼干(“accessToken”, accessToken);,设置maxAge(60 * 3);,路径(“/?;
5, sso-server单点登录服务负责校验用户信息,获取用户信息,操作复述,缓存,提供接口,在尤里卡上注册
<强> sso-server 强>
首先我们创建一个单点登录服务sso-server,并在尤里卡上注册(创建项目请参考之前的SpringCloud系列博客跟SpringBoot系列——复述)
login.html
我们这里需要用到页面,要先maven引入thymeleaf
& lt; dependency> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-starter-thymeleaf & lt;/dependency>
& lt; !DOCTYPE html> & lt; html xmlns: th=" http://www.thymeleaf.org "比; & lt; head> & lt;元charset=皍tf - 8”比; & lt; title>登录页面& lt;/title> & lt;/head> & lt; body> & lt;形式action="/sso-server/sso登录”方法=皃ost”比; & lt;输入name=" url "类型=耙亍眛h: value=" https://www.yisu.com/zixun/$ {url} "/比; 用户名:& lt;输入name="用户名" type=" text "/比; 密码:& lt;输入name="密码" type="密码"/比; & lt;输入值=" https://www.yisu.com/zixun/登录”类型=疤峤弧?比; & lt;/form> & lt;/body> & lt;/html>
提供如下接口
@RestController @EnableEurekaClient @SpringBootApplication 公开课SsoServerApplication { 公共静态void main (String [] args) { SpringApplication.run (SsoServerApplication.class, args); } @ autowired 私人StringRedisTemplate模板;/* * *判断键是否存在 */@RequestMapping(“/复述/hasKey/{关键}”) 公共布尔hasKey (@PathVariable(“关键”)字符串键){ 尝试{ 返回template.hasKey(关键); }捕捉(异常e) { e.printStackTrace (); 返回错误; } }/* * *校验用户名密码,成功则返回通行令牌(这里写死huanzi/123456) */@RequestMapping (“/sso/checkUsernameAndPassword”) 私人字符串checkUsernameAndPassword(用户名的字符串,字符串密码){//通行令牌 字符串国旗=零; 如果(huanzi .equals(用户名),,“123456”.equals(密码)){//用户名+时间戳(这里只是演示,正常项目的令牌应该要更为复杂) 国旗=用户名+ System.currentTimeMillis ();//令牌作为关键,存用户身份证作为价值(或者直接存储可暴露的部分用户信息也行)设置过期时间(我这里设置3分钟) template.opsForValue ()。集(国旗,“1”(长)(3 * 60),TimeUnit.SECONDS); } 返回国旗; }/* * *跳转登录页面 */@RequestMapping (“/sso/loginPage”) 私人ModelAndView loginPage(字符串url) { ModelAndView ModelAndView=new ModelAndView(“登录”); modelAndView。addObject (“url”, url); 返回modelAndView; }/* * *页面登录 */@RequestMapping (“/sso登录”) 私人字符串登录(HttpServletResponse响应,用户名的字符串,字符串密码字符串url) { 字符串检查=checkUsernameAndPassword(用户名、密码); 如果(! StringUtils.isEmpty(检查)){ 尝试{ 曲奇饼干=new饼干(“accessToken”,检查); 饼干。setMaxAge (60 * 3);//设置域//cookie.setDomain (“huanzi.cn”);//设置访问路径 cookie.setPath (“/?; response.addCookie(饼干);//重定向到原先访问的页面 response.sendRedirect (url); }捕捉(IOException e) { e.printStackTrace (); } 返回null; } 返回“登录失败”; } }SpringCloud实现SSO单点登录的示例代码