SpringBoot 통합 SSO(Single Sign on)단일 로그 인
12134 단어 SpringBootSSO단일 로그 인
(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"> </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 단일 로그 인 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.