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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
package security;
import com.google.common.base.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* Created by nolan on 11/11/2016.
* description:
*/
@Service
public class RedisTokenManager extends AbstractTokenManager {
private final String GLOBAL_TOKEN = "GLOBAL_TOKEN";
/**
* Redis中Key的前缀
*/
private static final String REDIS_KEY_PREFIX = "MANAGER_AUTHORIZATION_KEY_";
/**
* Redis中Token的前缀
*/
private static final String REDIS_TOKEN_PREFIX = "MANAGER_AUTHORIZATION_TOKEN_";
/**
* Redis中账户的前缀
*/
private static final String REDIS_ACCOUNT_PREFIX = "MANAGER_AUTHORIZATION_ACCOUNT_";
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 踢出此账号下的所有登陆
*/
@Override
public void delMultiRelationshipByKey(String key) {
if(Strings.isNullOrEmpty(key))
return;
//获取所有登陆TOKEN
Set<String> tokenSet = this.smembers(formatAccountKey(key));
if(!CollectionUtils.isEmpty(tokenSet)){
//删除这些TOKEN
delete(tokenSet);
//删除对应关系
delete(formatAccountKey(key));
}
}
@Override
protected void delSingleRelationshipByKey(String key) {
String token = getToken(key);
if (token != null) {
delete(formatKey(key), formatToken(token));
}
}
/**
* 根据token删掉关系
* @param token
*/
@Override
public void delRelationshipByToken(String token) {
final String formatToken = formatToken(token);
if (singleTokenWithUser) {
String key = getKeyFromToken(token);
delete(formatKey(key), formatToken);
} else {
//删除对应关系中的token
srem(formatAccountKey(get(formatToken)),formatToken);
//删除token
delete(formatToken);
}
}
/**
* 创建单点登陆的登陆关系
* @param key
* @param token
*/
@Override
protected void createSingleRelationship(String key, String token) {
String oldToken = get(formatKey(key));
if (oldToken != null) {
delete(formatToken(oldToken));
}
set(formatToken(token), key, tokenExpireSeconds);
set(formatKey(key), token, tokenExpireSeconds);
}
/**
* 创建多点登陆的登陆关系
* @param key
* @param token
*/
@Override
protected void createMultipleRelationship(String key, String token) {
set(formatToken(token), key, tokenExpireSeconds);
//添加到账户KEY对应的SET中
sadd(formatAccountKey(key), formatToken(token), tokenExpireSeconds);
}
@Override
protected String getKeyByToken(String token) {
return get(formatToken(token));
}
@Override
protected String getTokenByKey(String key) {
return get(formatKey(key));
}
/**
* 操作后刷新登陆关系时长
* @param key
* @param token
*/
@Override
protected void flushExpireAfterOperation(String key, String token) {
if (singleTokenWithUser) {
expire(formatKey(key), tokenExpireSeconds);
}
expire(formatToken(token), tokenExpireSeconds);
//刷新对应关系时长
expire(formatAccountKey(get(formatToken(token))), tokenExpireSeconds);
}
private String get(String key) {
return redisTemplate.opsForValue().get(key);
}
private String set(String key, String value, int expireSeconds) {
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, expireSeconds, TimeUnit.SECONDS);
return value;
}
/**
* 添加value 对于的KEY set
*/
private Long sadd(String key, String value, int expireSeconds){
Long num = redisTemplate.opsForSet().add(key, value);
if(0 != num){
redisTemplate.expire(key, expireSeconds, TimeUnit.SECONDS);
}
return num;
}
/**
* 删除set中的某个
*/
private Long srem(String key, String value){
return redisTemplate.opsForSet().remove(key,value);
}
/**
* 获取set中所有元素
*/
private Set<String> smembers(String key){
return redisTemplate.opsForSet().members(key);
}
private void expire(String key, int seconds) {
redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
}
private void delete(String... keys) {
redisTemplate.delete(Arrays.asList(keys));
}
private void delete(Collection<String> collection){
redisTemplate.delete(collection);
}
private String getToken(String key) {
return get(formatKey(key));
}
private String formatKey(String key) {
return REDIS_KEY_PREFIX.concat(key);
}
private String formatToken(String token) {
return REDIS_TOKEN_PREFIX.concat(token);
}
private String formatAccountKey(String key){
return REDIS_ACCOUNT_PREFIX.concat(key);
}
}