1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package security;
import security.exception.MethodNotSupportException;
import java.util.UUID;
public abstract class AbstractTokenManager implements TokenManager {
protected int tokenExpireSeconds = 7 * 24 * 3600;
protected boolean singleTokenWithUser = false;
protected boolean flushExpireAfterOperation = true;
public void setTokenExpireSeconds(int tokenExpireSeconds) {
this.tokenExpireSeconds = tokenExpireSeconds;
}
public void setSingleTokenWithUser(boolean singleTokenWithUser) {
this.singleTokenWithUser = singleTokenWithUser;
}
public void setFlushExpireAfterOperation(boolean flushExpireAfterOperation) {
this.flushExpireAfterOperation = flushExpireAfterOperation;
}
@Override
public void delRelationshipByKey(String key) {
//如果是多个Token关联同一个Key,不允许直接通过Key删除所有Token,防止误操作
if (!singleTokenWithUser) {
throw new MethodNotSupportException("非单点登录时无法调用该方法");
}
delSingleRelationshipByKey(key);
}
/**
* 一个用户只能绑定一个Token时通过Key删除关联关系
* @param key
*/
protected abstract void delSingleRelationshipByKey(String key);
private void createRelationship(String key, String token) {
//根据设置的每个用户是否只允许绑定一个Token,调用不同的方法
if (singleTokenWithUser) {
createSingleRelationship(key, token);
} else {
createMultipleRelationship(key, token);
}
}
/**
* 一个用户可以绑定多个Token时创建关联关系
* @param key
* @param token
*/
protected abstract void createMultipleRelationship(String key, String token);
/**
* 一个用户只能绑定一个Token时创建关联关系
* @param key
* @param token
*/
protected abstract void createSingleRelationship(String key, String token);
@Override
public String getKeyFromToken(String token) {
String key = getKeyByToken(token);
//根据设置,在每次有效操作后刷新过期时间
if (key != null && flushExpireAfterOperation) {
flushExpireAfterOperation(key, token);
}
return key;
}
@Override
public String getTokenFromKey(String key) {
return getTokenByKey(key);
}
@Override
public String createToken(String key) {
final String token = generateToken();
createRelationship(key, token);
return token;
}
protected String generateToken(){
return UUID.randomUUID().toString();
}
/**
* 通过Token获得Key
* @param token
* @return
*/
protected abstract String getKeyByToken(String token);
/**
* 通过key获取token
* @param key
* @return
*/
protected abstract String getTokenByKey(String key);
/**
* 在操作后刷新Token的过期时间
* @param key
* @param token
*/
protected abstract void flushExpireAfterOperation(String key, String token);
}