springcloud 마이크로 서 비 스 는 redis 클 러 스 터 의 단일 로그 인 을 바탕 으로 분석 합 니 다.

간단 한 소개
본 고 는 마이크로 서비스 구조 에서 단일 로그 인 기능 을 어떻게 실현 하 는 지 소개 한다.
세 개의 서비스 만 들 기:
  • redis 클 러 스 터 서 비 스 를 조작 하여 여러 서비스 간 에 데 이 터 를 공유 하 는 데 사용 합 니 다
  • 통일 인증 센터 서 비 스 는 전체 시스템 의 통일 로그 인 인증
  • 에 사용 된다.
  • 서비스 소비자,테스트 단일 지점 로그 인
  • 대체 적 인 사고방식:모든 서 비 스 는 쿠키 에 token 이 있 는 지 확인 하기 위해 차단 기 를 설정 합 니 다.token 이 있 으 면 놓 습 니 다.token 이 없 으 면 통일 인증 센터 서비스 로 다시 설정 하여 로그 인하 고 로그 인 에 성공 한 후에 차단 되 는 서비스 로 돌아 갑 니 다.
    redis 클 러 스 터 서비스 구축
    redis 군집 참조 문서 구축
    통일 인증 센터 를 세우다
    주 함수 주석 추가
    
    /**
     *                ,   redis        
     *       @EnableDiscoveryClient  @EnableEurekaClient     
     *
     */
    @EnableDiscoveryClient
    @EnableEurekaClient
    @EnableFeignClients
    @MapperScan(basePackages = "com.example.itokenservicesso.mapper")
    @SpringBootApplication
    public class ItokenServiceSsoApplication {
      public static void main(String[] args) {
        SpringApplication.run(ItokenServiceSsoApplication.class, args);
      }
    }
    redis 서비스 와 퓨즈 소비
    
    @FeignClient(value = "itoken-service-redis", fallback = RedisServiceFallBack.class)
    public interface RedisService {
    
      @PostMapping(value = "put")
      public String put(@RequestParam(value = "key") String key, @RequestParam(value = "value") String value, @RequestParam(value = "seconds") long seconds);
    
      @GetMapping(value = "get")
      public String get(@RequestParam(value = "key") String key);
    
    }
    
    @Component
    public class RedisServiceFallBack implements RedisService {
      @Override
      public String put(String key, String value, long seconds) {
        return FallBack.badGateWay();
      }
    
      @Override
      public String get(String key) {
        return FallBack.badGateWay();
      }
    }
    
    public class FallBack {
    
      public static String badGateWay(){
        try {
          return JsonUtil.objectToString(ResultUtil.error(502,"    "));
        } catch (JsonProcessingException e) {
          e.printStackTrace();
        }
        return null;
      }
    }
    로그 인 서비스
    
    @Service
    public class LoginServiceImpl implements LoginService {
      @Autowired
      private UserMapper userMapper;
      @Autowired
      private RedisService redisService;
      @Override
      public User login(String loginCode, String plantPassword) {
        //             
        String json = redisService.get(loginCode);
        User user = null;
        //         ,       
        if (json == null) {
          user = userMapper.selectAll(loginCode);
          String passwordMd5 = DigestUtils.md5DigestAsHex(plantPassword.getBytes());
          if (user != null && passwordMd5.equals(user.getPassword())) {
            //    ,    
            try {
              redisService.put(loginCode, JsonUtil.objectToString(user), 60 * 60 * 24);
            } catch (JsonProcessingException e) {
              e.printStackTrace();
            }
            return user;
          } else {
            return null;
          }
        }
        //        
        else {
          try {
            user = JsonUtil.stringToObject(json, User.class);
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
        return user;
      }
    }
    contoller 층,로그 인 업무 와 로그 인 전환 처리
    로그 인 업무
    
      /**
      *     
      *
      * @param loginCode
      * @param password
      * @return
      */
      @PostMapping("login")
      public String login(String loginCode,
                String password,
                @RequestParam(required = false) String url,
                HttpServletRequest request,
                HttpServletResponse response,
                RedirectAttributes redirectAttributes) {
        User user = loginService.login(loginCode, password);
        //    
        if (user != null) {
    
          String token = UUID.randomUUID().toString();
          // token    
          String result = redisService.put(token, loginCode, 60 * 60 * 24);
          //  redisService    ,     ok,    
          if (result != null && result.equals("ok")) {
            CookieUtil.setCookie(response, "token", token, 60 * 60 * 24);
            if (url != null && !url.trim().equals(""))
              return "redirect:" + url;
          }
          //         
          else {
            redirectAttributes.addFlashAttribute("message", "     ");
          }
    
        }
        //    
        else {
          redirectAttributes.addFlashAttribute("message", "        ");
        }
        return "redirect:/login";
      }
    로그 인 점프
    
      @Autowired
      private LoginService loginService;
    
      @Autowired
      private RedisService redisService;
    
      /**
      *      
      */
      @GetMapping("login")
      public String login(HttpServletRequest request,
                Model model,
                @RequestParam(required = false) String url
      ) {
        String token = CookieUtil.getCookie(request, "token");
        //token        , redis    
        if (token != null && token.trim().length() != 0) {
          String loginCode = redisService.get(token);
          //       , redis          
          if (loginCode != null && loginCode.trim().length() != 0) {
            String json = redisService.get(loginCode);
            if (json != null && json.trim().length() != 0) {
              try {
                User user = JsonUtil.stringToObject(json, User.class);
    
                //   
                if (user != null) {
                  if (url != null && url.trim().length() != 0) {
                    return "redirect:" + url;
                  }
                }
                //          
                model.addAttribute("user", user);
    
              } catch (IOException e) {
                e.printStackTrace();
              }
    
            }
          }
        }
        return "login";
      }
    구축 서비스 소비자:차단 기 를 추가 하여 token 이 비어 있 는 지 판단 합 니 다.
    차단기
    
    public class WebAdminInterceptor implements HandlerInterceptor {
      @Autowired
      private RedisService redisService;
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = CookieUtil.getCookie(request, "token");
        //token  ,      
        if (token == null || token.isEmpty()) {
          response.sendRedirect("http://localhost:8503/login?url=http://localhost:8601/login");
          return false;
        }
        return true;
      }
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        //     
        if (user != null) {
          if (modelAndView != null) {
            modelAndView.addObject("user", user);
          }
        }
        //     
        else {
          String token = CookieUtil.getCookie(request, "token");
          if (token != null && !token.isEmpty()) {
            String loginCode = redisService.get(token);
    
            if (loginCode != null && !loginCode.isEmpty()) {
              String json = redisService.get(loginCode);
              if (json != null && !json.isEmpty()) {
                //     ,      
                user = JsonUtil.stringToObject(json, User.class);
                if (modelAndView != null) {
                  modelAndView.addObject("user", user);
                }
                request.getSession().setAttribute("user", user);
              }
            }
          }
        }
    
        //           
        if (user == null) {
          response.sendRedirect("http://localhost:8503/login?url=http://localhost:8601/login");
    
        }
      }
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
      }
    }
    차단기 설정
    
    @Configuration
    public class WebAdminInterceptorConfig implements WebMvcConfigurer {
    
      //       Bean,         @AutoWired      
      @Bean
      WebAdminInterceptor webAdminInterceptor() {
        return new WebAdminInterceptor();
      }
    
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(webAdminInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/static");
      }
    }
    인 터 페 이 스 를 임의로 써 서 차단 기 를 터치 하여 테스트 합 니 다.
    
    @RequestMapping(value = {"/login"})
      public String index(){
        return "index";
      }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기