实现 OAuth2.0 模块

This commit is contained in:
shengzhang
2021-02-17 18:07:45 +08:00
parent 1df97edaf8
commit 7e0f592a0f
48 changed files with 4692 additions and 128 deletions

View File

@@ -9,4 +9,5 @@ unpackage/
.factorypath
.idea/
.idea/
.iml

View File

@@ -24,7 +24,7 @@ public interface SaTokenDao {
* @param key 键名称
* @return value
*/
public String getValue(String key);
public String get(String key);
/**
* 写入指定key-value键值对并设定过期时间 (单位: 秒)
@@ -32,20 +32,20 @@ public interface SaTokenDao {
* @param value 值
* @param timeout 过期时间 (单位: 秒)
*/
public void setValue(String key, String value, long timeout);
public void set(String key, String value, long timeout);
/**
* 修改指定key-value键值对 (过期时间取原来的值)
* 修改指定key-value键值对 (过期时间不变)
* @param key 键名称
* @param value 值
*/
public void updateValue(String key, String value);
public void update(String key, String value);
/**
* 删除一个指定的key
* @param key 键名称
*/
public void deleteKey(String key);
public void delete(String key);
/**
* 获取指定key的剩余存活时间 (单位: 秒)
@@ -62,6 +62,51 @@ public interface SaTokenDao {
public void updateTimeout(String key, long timeout);
// --------------------- Object相关 ---------------------
/**
* 根据key获取Object如果没有则返回空
* @param key 键名称
* @return object
*/
public Object getObject(String key);
/**
* 写入指定键值对,并设定过期时间 (单位: 秒)
* @param key 键名称
* @param object 值
* @param timeout 过期时间 (单位: 秒)
*/
public void setObject(String key, Object object, long timeout);
/**
* 修改指定键值对 (过期时间不变)
* @param key 键名称
* @param object 值
*/
public void updateObject(String key, Object object);
/**
* 删除一个指定的Object
* @param key 键名称
*/
public void deleteObject(String key);
/**
* 获取指定key的剩余存活时间 (单位: 秒)
* @param key 指定key
* @return 这个key的剩余存活时间
*/
public long getObjectTimeout(String key);
/**
* 修改指定key的剩余存活时间 (单位: 秒)
* @param key 指定key
* @param timeout 过期时间
*/
public void updateObjectTimeout(String key, long timeout);
// --------------------- Session相关 ---------------------
/**
@@ -69,40 +114,52 @@ public interface SaTokenDao {
* @param sessionId 键名称
* @return SaSession
*/
public SaSession getSession(String sessionId);
public default SaSession getSession(String sessionId) {
return (SaSession)getObject(sessionId);
}
/**
* 将指定Session持久化
* @param session 要保存的session对象
* @param timeout 过期时间 (单位: 秒)
*/
public void saveSession(SaSession session, long timeout);
public default void setSession(SaSession session, long timeout) {
setObject(session.getId(), session, timeout);
}
/**
* 更新指定session
* @param session 要更新的session对象
*/
public void updateSession(SaSession session);
public default void updateSession(SaSession session) {
updateObject(session.getId(), session);
}
/**
* 删除一个指定的session
* @param sessionId sessionId
*/
public void deleteSession(String sessionId);
public default void deleteSession(String sessionId) {
deleteObject(sessionId);
}
/**
* 获取指定SaSession的剩余存活时间 (单位: 秒)
* @param sessionId 指定SaSession
* @return 这个SaSession的剩余存活时间 (单位: 秒)
*/
public long getSessionTimeout(String sessionId);
public default long getSessionTimeout(String sessionId) {
return getObjectTimeout(sessionId);
}
/**
* 修改指定SaSession的剩余存活时间 (单位: 秒)
* @param sessionId sessionId
* @param timeout 过期时间
*/
public void updateSessionTimeout(String sessionId, long timeout);
public default void updateSessionTimeout(String sessionId, long timeout) {
updateObjectTimeout(sessionId, timeout);
}
// --------------------- 会话管理 ---------------------

View File

@@ -8,7 +8,6 @@ import java.util.Timer;
import java.util.concurrent.ConcurrentHashMap;
import cn.dev33.satoken.SaTokenManager;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.util.SaTaskUtil;
import cn.dev33.satoken.util.SaTaskUtil.FunctionRunClass;
import cn.dev33.satoken.util.SaTokenInsideUtil;
@@ -42,19 +41,19 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
// ------------------------ String 读写操作
@Override
public String getValue(String key) {
public String get(String key) {
clearKeyByTimeout(key);
return (String)dataMap.get(key);
}
@Override
public void setValue(String key, String value, long timeout) {
public void set(String key, String value, long timeout) {
dataMap.put(key, value);
expireMap.put(key, (timeout == SaTokenDao.NEVER_EXPIRE) ? (SaTokenDao.NEVER_EXPIRE) : (System.currentTimeMillis() + timeout * 1000));
}
@Override
public void updateValue(String key, String value) {
public void update(String key, String value) {
if(getKeyTimeout(key) == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
@@ -62,7 +61,7 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
}
@Override
public void deleteKey(String key) {
public void delete(String key) {
dataMap.remove(key);
expireMap.remove(key);
}
@@ -76,45 +75,49 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
public void updateTimeout(String key, long timeout) {
expireMap.put(key, System.currentTimeMillis() + timeout * 1000);
}
// ------------------------ Session 读写操作
// ------------------------ Object 读写操作
@Override
public SaSession getSession(String sessionId) {
clearKeyByTimeout(sessionId);
return (SaSession)dataMap.get(sessionId);
public Object getObject(String key) {
clearKeyByTimeout(key);
return dataMap.get(key);
}
@Override
public void saveSession(SaSession session, long timeout) {
dataMap.put(session.getId(), session);
expireMap.put(session.getId(), (timeout == SaTokenDao.NEVER_EXPIRE) ? (SaTokenDao.NEVER_EXPIRE) : (System.currentTimeMillis() + timeout * 1000));
public void setObject(String key, Object object, long timeout) {
dataMap.put(key, object);
expireMap.put(key, (timeout == SaTokenDao.NEVER_EXPIRE) ? (SaTokenDao.NEVER_EXPIRE) : (System.currentTimeMillis() + timeout * 1000));
}
@Override
public void updateSession(SaSession session) {
if(getKeyTimeout(session.getId()) == SaTokenDao.NOT_VALUE_EXPIRE) {
public void updateObject(String key, Object object) {
if(getKeyTimeout(key) == SaTokenDao.NOT_VALUE_EXPIRE) {
return;
}
// 无动作
}
@Override
public void deleteSession(String sessionId) {
dataMap.remove(sessionId);
expireMap.remove(sessionId);
public void deleteObject(String key) {
dataMap.remove(key);
expireMap.remove(key);
}
@Override
public long getObjectTimeout(String key) {
return getKeyTimeout(key);
}
@Override
public void updateObjectTimeout(String key, long timeout) {
expireMap.put(key, System.currentTimeMillis() + timeout * 1000);
}
@Override
public long getSessionTimeout(String sessionId) {
return getKeyTimeout(sessionId);
}
@Override
public void updateSessionTimeout(String sessionId, long timeout) {
expireMap.put(sessionId, System.currentTimeMillis() + timeout * 1000);
}
// ------------------------ Session 读写操作
// 使用接口默认实现
// ------------------------ 过期时间相关操作
@@ -215,6 +218,8 @@ public class SaTokenDaoDefaultImpl implements SaTokenDao {
public List<String> searchData(String prefix, String keyword, int start, int size) {
return SaTokenInsideUtil.searchList(expireMap.keySet(), prefix, keyword, start, size);
}

View File

@@ -32,4 +32,14 @@ public class SaTokenException extends RuntimeException {
super(cause);
}
/**
* 构建一个异常
*
* @param message 异常信息
* @param cause 异常对象
*/
public SaTokenException(String message, Throwable cause) {
super(message, cause);
}
}

View File

@@ -46,7 +46,7 @@ public class SaSessionCustomUtil {
SaSession session = SaTokenManager.getSaTokenDao().getSession(getSessionKey(sessionId));
if (session == null && isCreate) {
session = SaTokenManager.getSaTokenAction().createSession(sessionId);
SaTokenManager.getSaTokenDao().saveSession(session, SaTokenManager.getConfig().getTimeout());
SaTokenManager.getSaTokenDao().setSession(session, SaTokenManager.getConfig().getTimeout());
}
return session;
}

View File

@@ -177,7 +177,7 @@ public class StpLogic {
for (TokenSign tokenSign : tokenSignList) {
if(tokenSign.getDevice().equals(device)) {
// 1. 将此token 标记为已顶替
dao.updateValue(getKeyTokenValue(tokenSign.getValue()), NotLoginException.BE_REPLACED);
dao.update(getKeyTokenValue(tokenSign.getValue()), NotLoginException.BE_REPLACED);
// 2. 清理掉[token-最后操作时间]
clearLastActivity(tokenSign.getValue());
// 3. 清理账号session上的token签名记录
@@ -203,7 +203,7 @@ public class StpLogic {
// ------ 4. 持久化其它数据
// token -> uid
dao.setValue(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout());
dao.set(getKeyTokenValue(tokenValue), String.valueOf(loginId), config.getTimeout());
// 将token保存到本次request里
request.setAttribute(getKeyJustCreatedSave(), tokenValue);
// 写入 [最后操作时间]
@@ -244,7 +244,7 @@ public class StpLogic {
if(loginId == null || NotLoginException.ABNORMAL_LIST.contains(loginId)) {
return;
}
SaTokenManager.getSaTokenDao().deleteKey(getKeyTokenValue(tokenValue));
SaTokenManager.getSaTokenDao().delete(getKeyTokenValue(tokenValue));
// 3. 尝试清理账号session上的token签名 (如果为null或已被标记为异常, 那么无需继续执行 )
SaSession session = getSessionByLoginId(loginId, false);
@@ -288,7 +288,7 @@ public class StpLogic {
// 2. 清理掉[token-最后操作时间]
clearLastActivity(tokenValue);
// 3. 标记:已被踢下线
SaTokenManager.getSaTokenDao().updateValue(getKeyTokenValue(tokenValue), NotLoginException.KICK_OUT);
SaTokenManager.getSaTokenDao().update(getKeyTokenValue(tokenValue), NotLoginException.KICK_OUT);
// 4. 清理账号session上的token签名
session.removeTokenSign(tokenValue);
}
@@ -450,7 +450,7 @@ public class StpLogic {
* @return loginId
*/
public String getLoginIdNotHandle(String tokenValue) {
return SaTokenManager.getSaTokenDao().getValue(getKeyTokenValue(tokenValue));
return SaTokenManager.getSaTokenDao().get(getKeyTokenValue(tokenValue));
}
@@ -466,7 +466,7 @@ public class StpLogic {
SaSession session = SaTokenManager.getSaTokenDao().getSession(sessionId);
if(session == null && isCreate) {
session = SaTokenManager.getSaTokenAction().createSession(sessionId);
SaTokenManager.getSaTokenDao().saveSession(session, getConfig().getTimeout());
SaTokenManager.getSaTokenDao().setSession(session, getConfig().getTimeout());
}
return session;
}
@@ -589,7 +589,7 @@ public class StpLogic {
return;
}
// 将[最后操作时间]标记为当前时间戳
SaTokenManager.getSaTokenDao().setValue(getKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis()), getConfig().getTimeout());
SaTokenManager.getSaTokenDao().set(getKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis()), getConfig().getTimeout());
}
/**
@@ -602,7 +602,7 @@ public class StpLogic {
return;
}
// 删除[最后操作时间]
SaTokenManager.getSaTokenDao().deleteKey(getKeyLastActivityTime(tokenValue));
SaTokenManager.getSaTokenDao().delete(getKeyLastActivityTime(tokenValue));
// 清除标记
SaTokenManager.getSaTokenServlet().getRequest().removeAttribute(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY);
}
@@ -654,7 +654,7 @@ public class StpLogic {
if(tokenValue == null || getConfig().getActivityTimeout() == SaTokenDao.NEVER_EXPIRE) {
return;
}
SaTokenManager.getSaTokenDao().updateValue(getKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis()));
SaTokenManager.getSaTokenDao().update(getKeyLastActivityTime(tokenValue), String.valueOf(System.currentTimeMillis()));
}
/**
@@ -745,7 +745,7 @@ public class StpLogic {
// ------ 开始查询
// 获取相关数据
String keyLastActivityTime = getKeyLastActivityTime(tokenValue);
String lastActivityTimeString = SaTokenManager.getSaTokenDao().getValue(keyLastActivityTime);
String lastActivityTimeString = SaTokenManager.getSaTokenDao().get(keyLastActivityTime);
// 查不到,返回-2
if(lastActivityTimeString == null) {
return SaTokenDao.NOT_VALUE_EXPIRE;