SpringCloud实现SSO单点登录的示例代码

  

  

作为分布式项目,单点登录是必不可少的,文本基于之前的的博客(猛戳: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系列——复述)

  

 SpringCloud实现SSO单点登录的示例代码

  

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单点登录的示例代码