SSO是在多個應用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統(tǒng)。它包括可以將這次主要的登錄映射到其他應用中用于同一個用戶的登錄的機制。它是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。
實現(xiàn)單點登錄系統(tǒng)慰于,提供服務(wù)接口。把session數(shù)據(jù)存放在redis唤衫。
1婆赠、單點登錄系統(tǒng)流程
2、實現(xiàn)流程
2.1佳励、用戶注冊
/**
*用戶注冊
*/
public TaotaoResult createUser(TbUser user) {
user.setUpdated(new Date());
user.setCreated(new Date());
//md5加密
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
userMapper.insert(user);
return TaotaoResult.ok();
}
2.2休里、用戶登錄
/**
* 用戶登錄
*/
@Override
public TaotaoResult userLogin(String username, String password) {
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
List<TbUser> list = userMapper.selectByExample(example);
//如果沒有此用戶名
if (null == list || list.size() == 0) {
return TaotaoResult.build(400, "用戶名或密碼錯誤");
}
TbUser user = list.get(0);
//比對密碼
if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
return TaotaoResult.build(400, "用戶名或密碼錯誤");
}
//生成token
String token = UUID.randomUUID().toString();
//保存用戶之前蛆挫,把用戶對象中的密碼清空。
user.setPassword(null);
//把用戶信息寫入redis
jedisClient.set(REDIS_USER_SESSION_KEY + ":" + token, JsonUtils.objectToJson(user));
//設(shè)置session的過期時間
jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, SSO_SESSION_EXPIRE);
//把REDIS_USER_SESSION_KEY + ":" + token存進瀏覽器的cookie中(wzf),這樣用戶登錄相關(guān)的系統(tǒng)時妙黍,取得cookie中的值悴侵,然后在redis數(shù)據(jù)庫中進行查詢,如果結(jié)果存在拭嫁,則表明用戶已經(jīng)登錄畜挨。
//返回token
return TaotaoResult.ok(token);
}
2.3、通過token查詢用戶信息
根據(jù)token判斷用戶是否登錄或者session是否過期噩凹。接收token,根據(jù)token到redis中取用戶信息毡咏。判斷token字符串是否對應用戶信息驮宴,如果不對應說明token非法或者session已過期。取到了說明用戶就是正常的登錄狀態(tài)呕缭。返回用戶信息堵泽,同時重置用戶的過期時間(用戶處于活動狀態(tài))。
/**
*通過token判斷session信息
*/
public TaotaoResult getUserByToken(String token) {
//根據(jù)token從redis中查詢用戶信息
String json = jedisClient.get(REDIS_USER_SESSION_KEY + ":" + token);
//判斷是否為空
if (StringUtils.isBlank(json)) {
return TaotaoResult.build(400, "此session已經(jīng)過期恢总,請重新登錄");
}
//更新過期時間
jedisClient.expire(REDIS_USER_SESSION_KEY + ":" + token, SSO_SESSION_EXPIRE);
//返回用戶信息
return TaotaoResult.ok(JsonUtils.jsonToPojo(json, TbUser.class));
}