SpringBoot 통합 SSO(Single Sign on)단일 로그 인

1.단일 로그 인 세 가지 흔 한 방식
(1)세 션 방송 메커니즘(세 션 복사)
(2)쿠키+레 디 스 를 사용 하여 구현
(3)token 을 사용 하여 실현

2.단일 로그 인 안내




예:

(1)jwt 의존 도입

 <!-- JWT-->
<dependency>
 <groupId>io.jsonwebtoken</groupId>
 <artifactId>jjwt</artifactId>
</dependency>
(2)JWTUtils 도구 클래스 만 들 기

public class JwtUtils {

 //token    
 public static final long EXPIRE = 1000 * 60 * 60 * 24;
 //  
 public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";

 public static String getJwtToken(String id, String nickname){

  String JwtToken = Jwts.builder()
    //     
    .setHeaderParam("typ", "JWT")
    .setHeaderParam("alg", "HS256")
    .setSubject("user")
    .setIssuedAt(new Date())
    //      
    .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
    //  token    (    id nickname      )
    .claim("id", id)
    .claim("nickname", nickname)
    //    
    .signWith(SignatureAlgorithm.HS256, APP_SECRET)
    .compact();

  return JwtToken;
 }

 /**
  *   token       (    APP_SECRET  token)
  * @param jwtToken
  * @return
  */
 public static boolean checkToken(String jwtToken) {
  if(StringUtils.isEmpty(jwtToken)) return false;
  try {
   Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
  return true;
 }

 /**
  *   token       (           token   APP_SECRET  token)
  * @param request
  * @return
  */
 public static boolean checkToken(HttpServletRequest request) {
  try {
   String jwtToken = request.getHeader("token");
   if(StringUtils.isEmpty(jwtToken)) return false;
   Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
  return true;
 }

 /**
  *   token       id(            )
  * @param request
  * @return
  */
 public static String getMemberIdByJwtToken(HttpServletRequest request) {
  String jwtToken = request.getHeader("token");
  if(StringUtils.isEmpty(jwtToken)) return "";
  Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
  Claims claims = claimsJws.getBody();
  return (String)claims.get("id");
 }
}
3.단일 로그 인 실현
프로젝트 디 렉 터 리 구조

UcenterMemberController

@RestController
@RequestMapping("/user/")
@CrossOrigin
public class UcenterMemberController {

 @Autowired
 private UcenterMemberService ucenterMemberService;
	//  
 @PostMapping("login")
 public ResponseResult login(@RequestBody MobileLoginRequest request) {
  String token = ucenterMemberService.login(request);
  return ResponseResult.success().data("token", token);
 }
	//  
 @PostMapping("register")
 public ResponseResult register(@RequestBody RegisterRequest request) {
  ucenterMemberService.register(request);
  return ResponseResult.success().message("    ");
 }
	//  token      
 @GetMapping("getUserInfo")
 public ResponseResult getUserInfo(HttpServletRequest request) {
  //  jwt      ,  request       ,    id
  String id = JwtUtils.getMemberIdByJwtToken(request);
  //    id    
  UcenterMember member = ucenterMemberService.getById(id);
  return ResponseResult.success().data("userInfo", member);
 }

}
ServiceImpl

@Service
public class UcenterMemberServiceImpl extends ServiceImpl<UcenterMemberMapper, UcenterMember> implements UcenterMemberService {

 @Autowired
 private StringRedisTemplate redisTemplate;

	//  
 @Override
 public String login(MobileLoginRequest request) {

  String phone = request.getPhone();
  String password = request.getPassword();
  if (StrUtil.isBlank(phone) || StrUtil.isBlank(password)) {
   throw new GuliException(200001, "          ");
  }
  //                
  UcenterMember ucenterByPhone = this.baseMapper.selectOne(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone));
  if (ucenterByPhone == null) {
   throw new GuliException(200002, "       ");
  }
  //                     
  if (!MD5Util.encrypt(password).equals(ucenterByPhone.getPassword())) {
   throw new GuliException(200003, "      ");
  }
  String token = JwtUtils.getJwtToken(ucenterByPhone.getId(), ucenterByPhone.getNickname());
  return token;
 }

	//  
 @Override
 public void register(RegisterRequest request) {
  String phone = request.getPhone();
  String password = request.getPassword();
  String nickName = request.getNickName();
  String code = request.getCode();
  if (StrUtil.isBlank(phone) || StrUtil.isBlank(password) || StrUtil.isBlank(nickName) || StrUtil.isBlank(code)) {
   throw new GuliException(200001, "       ");
  }
  //         
  Integer count = baseMapper.selectCount(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone));
  if (count > 0) {
   throw new GuliException(200001, "           ");
  }
  //  code
  String redisCode = redisTemplate.opsForValue().get(phone);
  if (StrUtil.isBlank(redisCode)) {
   throw new GuliException(200001, "       ,     ");
  }
  if (!redisCode.equals(code)) {
   throw new GuliException(200001, "     ");
  }

  UcenterMember ucenterByPhone = new UcenterMember();
  ucenterByPhone.setMobile(phone);
  ucenterByPhone.setPassword(MD5Util.encrypt(password));
  ucenterByPhone.setNickname(nickName);
  ucenterByPhone.setIsDisabled(false);
  int insert = baseMapper.insert(ucenterByPhone);
  if(insert<=0){
   throw new GuliException(20001,"    ");
  }
 }
}
MD5 암호 화 알고리즘 도구 클래스

public final class MD5Util {

 public static String encrypt(String strSrc) {
  try {
   char hexChars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
     '9', 'a', 'b', 'c', 'd', 'e', 'f'};
   byte[] bytes = strSrc.getBytes();
   MessageDigest md = MessageDigest.getInstance("MD5");
   md.update(bytes);
   bytes = md.digest();
   int j = bytes.length;
   char[] chars = new char[j * 2];
   int k = 0;
   for (int i = 0; i < bytes.length; i++) {
    byte b = bytes[i];
    chars[k++] = hexChars[b >>> 4 & 0xf];
    chars[k++] = hexChars[b & 0xf];
   }
   return new String(chars);
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
   throw new RuntimeException("MD5    !!+" + e);
  }
 }

 public static void main(String[] args) {
  System.out.println(MD5Util.encrypt("111111"));
 }

}
4.로그 인 완료 후 전단 인터페이스 에서 사용자 정보 보 여주 기

(1)1,2,4 단계:로그 인 하 는 방법(npm install js-cookie 기억)

 //     
  submitLogin() {
  //            ,  token   
  loginApi.submitLoginUser(this.user) 
   .then(response => {
    //      token     cookie  
    //     cookie  ,      ,         
    cookie.set('user_token',response.data.data.token,{domain: 'localhost'})
    
    //           token      ,       
    loginApi.getLoginUserInfo()
    .then(response => {
     this.loginInfo = response.data.data.userInfo
     //        ,  cookie  (   cookie           )
     cookie.set('user_info',this.loginInfo,{domain: 'localhost'})

     //    
     window.location.href = "/";
    })
   })
  },
(2)세 번 째 단계:request.js 에서 전단 요청 차단 기 를 작성 합 니 다.

//   axios  
const service = axios.create({
 baseURL: process.env.BASE_API, // api   base_url
 timeout: 5000 //       
})

// request   
service.interceptors.request.use(
 config => {
 if (cookie.get('user_token')) {
  config.headers['token'] = cookie.get('user_token') //           token            
 }
 return config
 },
 error => {
 // Do something with request error
 console.log(error) // for debug
 Promise.reject(error)
 }
)
(3)다섯 번 째 단계:홈 페이지 에 사용자 정보 표시(쿠키 에서 사용자 정보 획득)

//    , cookie      
showInfo() {
 // cookie      
 var userStr = cookie.get('guli_ucenter')
 //       json  (js  ),         "{'name','lucy','age':18}"   
 if(userStr) {
 this.loginInfo = JSON.parse(userStr)
 }
}
사용자 정보 표시(userInfo 에서 id 로 판단)

<ul class="h-r-login">
 //cookie       ,       
 <li v-if="!loginInfo.id" id="no-login">
  <a href="/login" rel="external nofollow" title="  ">
   <em class="icon18 login-icon">&nbsp;</em>
   <span class="vam ml5">  </span>
  </a>
  |
  <a href="/register" rel="external nofollow" title="  ">
   <span class="vam ml5">  </span>
  </a>
 </li>
 //cookie      ,      、     
 <li v-if="loginInfo.id" id="is-login-two" class="h-r-user">
  <a href="/ucenter" rel="external nofollow" title>
   <img
     :src="loginInfo.avatar"
     width="30"
     height="30"
     class="vam picImg"
     alt
     >
   <span id="userName" class="vam disIb">{{ loginInfo.nickname }}</span>
  </a>
  <a href="javascript:void(0);" rel="external nofollow" title="  " @click="logout()" class="ml5">  </a>
 </li>
</ul>
로그 인 을 종료 하고 쿠키 의 token 과 사용자 정 보 를 삭제 합 니 다.

 //  
 logout() {
  //  cookie 
  cookie.set('user_token','',{domain: 'localhost'})
  cookie.set('user_info','',{domain: 'localhost'})
  //     
  window.location.href = "/";
 }
 }
SpringBoot 통합 SSO(single sign on)단일 로그 인 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SpringBoot 통합 SSO 단일 로그 인 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기