Skip to content

Commit a11ed17

Browse files
author
fanxb
committed
完成sso单点登录demo
1 parent 6dc9c35 commit a11ed17

File tree

17 files changed

+137
-42
lines changed

17 files changed

+137
-42
lines changed

1.SSO单点登录/sso/pom.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@
2828
<dependency>
2929
<groupId>org.springframework.boot</groupId>
3030
<artifactId>spring-boot-starter-data-redis</artifactId>
31+
<exclusions>
32+
<exclusion>
33+
<groupId>io.lettuce</groupId>
34+
<artifactId>lettuce-core</artifactId>
35+
</exclusion>
36+
</exclusions>
37+
</dependency>
38+
39+
<dependency>
40+
<groupId>org.apache.commons</groupId>
41+
<artifactId>commons-pool2</artifactId>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>redis.clients</groupId>
46+
<artifactId>jedis</artifactId>
3147
</dependency>
3248

3349
<dependency>

1.SSO单点登录/sso/src/main/java/com/infinova/sso/config/RedisConfig.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import com.fasterxml.jackson.annotation.JsonAutoDetect;
44
import com.fasterxml.jackson.annotation.PropertyAccessor;
55
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.beans.factory.annotation.Value;
69
import org.springframework.cache.CacheManager;
710
import org.springframework.cache.annotation.CachingConfigurerSupport;
811
import org.springframework.cache.annotation.EnableCaching;
@@ -12,11 +15,13 @@
1215
import org.springframework.data.redis.cache.RedisCacheManager;
1316
import org.springframework.data.redis.cache.RedisCacheWriter;
1417
import org.springframework.data.redis.connection.RedisConnectionFactory;
18+
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
1519
import org.springframework.data.redis.core.RedisTemplate;
1620
import org.springframework.data.redis.core.StringRedisTemplate;
1721
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
1822
import org.springframework.data.redis.serializer.RedisSerializer;
1923
import org.springframework.data.redis.serializer.StringRedisSerializer;
24+
import redis.clients.jedis.JedisPoolConfig;
2025

2126
import java.time.Duration;
2227

@@ -31,18 +36,40 @@
3136
@Configuration
3237
public class RedisConfig extends CachingConfigurerSupport {
3338

39+
private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);
40+
41+
@Value("${spring.redis.host}")
42+
private String host;
43+
@Value("${spring.redis.password}")
44+
private String password;
45+
@Value("${spring.redis.port}")
46+
private int port;
47+
@Value("${spring.redis.timeout}")
48+
private int timeout;
49+
@Value("${spring.redis.database}")
50+
private int database;
51+
@Value("${spring.redis.jedis.pool.max-idle}")
52+
private int maxIdle;
53+
@Value("${spring.redis.jedis.pool.min-idle}")
54+
private int minIdle;
55+
@Value("${spring.redis.jedis.pool.max-wait}")
56+
private long maxWaitMillis;
57+
@Value("${spring.redis.jedis.pool.max-active}")
58+
private int maxActive;
59+
60+
3461
/**
3562
* 设置缓存管理器,这里可以配置默认过期时间等
3663
*
3764
* @param connectionFactory 连接池
3865
* @return
3966
*/
4067
@Bean
41-
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
68+
public CacheManager cacheManager(JedisConnectionFactory jedisConnectionFactory) {
4269
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
4370
.defaultCacheConfig()
4471
.entryTtl(Duration.ofSeconds(60));
45-
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
72+
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(jedisConnectionFactory);
4673
RedisCacheManager manager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
4774
return manager;
4875
}
@@ -64,4 +91,27 @@ public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factor
6491
template.afterPropertiesSet();
6592
return template;
6693
}
94+
95+
96+
@Bean
97+
public JedisConnectionFactory jedisConnectionFactory() {
98+
logger.info("jedisConnectionFactory:初始化了");
99+
JedisPoolConfig config = new JedisPoolConfig();
100+
config.setMaxIdle(maxIdle);
101+
config.setMinIdle(minIdle);
102+
config.setMaxWaitMillis(maxWaitMillis);
103+
config.setMaxTotal(maxActive);
104+
//链接耗尽时是否阻塞,默认true
105+
config.setBlockWhenExhausted(true);
106+
//是否启用pool的jmx管理功能,默认true
107+
config.setJmxEnabled(true);
108+
JedisConnectionFactory factory = new JedisConnectionFactory();
109+
factory.setPoolConfig(config);
110+
factory.setHostName(host);
111+
factory.setPort(port);
112+
factory.setPassword(password);
113+
factory.setDatabase(database);
114+
factory.setTimeout(timeout);
115+
return factory;
116+
}
67117
}

1.SSO单点登录/sso/src/main/java/com/infinova/sso/controller/JwtController.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.infinova.sso.controller;
22

3-
import com.alibaba.fastjson.JSONArray;
43
import com.infinova.sso.entity.ReturnEntity;
54
import com.infinova.sso.entity.User;
65
import com.infinova.sso.service.JwtService;
7-
import com.infinova.sso.util.HttpUtil;
86
import org.springframework.beans.factory.annotation.Autowired;
97
import org.springframework.web.bind.annotation.GetMapping;
108
import org.springframework.web.bind.annotation.PostMapping;
@@ -34,14 +32,13 @@ public ReturnEntity login(@RequestBody User user) {
3432
return ReturnEntity.successResult(token);
3533
}
3634

37-
@PostMapping("/checkJwt")
35+
@GetMapping("/checkJwt")
3836
public ReturnEntity checkJwt(String token) {
3937
return ReturnEntity.successResult(service.checkJwt(token));
4038
}
4139

4240
@GetMapping("/inValid")
43-
public ReturnEntity inValid() {
44-
String token = HttpUtil.getData(JwtService.JWT_KEY);
41+
public ReturnEntity inValid(String token) {
4542
service.inValid(token);
4643
return ReturnEntity.successResult(null);
4744
}

1.SSO单点登录/sso/src/main/java/com/infinova/sso/util/RedisUtil.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.infinova.sso.util;
22

3-
import com.alibaba.fastjson.JSON;
43
import org.springframework.beans.factory.annotation.Autowired;
5-
import org.springframework.data.redis.core.RedisTemplate;
4+
import org.springframework.data.redis.core.StringRedisTemplate;
65
import org.springframework.stereotype.Component;
76

87
import java.util.concurrent.TimeUnit;
@@ -18,20 +17,23 @@
1817
public class RedisUtil {
1918
private static final int DEFAULT_EXPIRE_TIME = 60 * 1000;
2019

21-
public static RedisTemplate<String, String> redisTemplate;
20+
public static StringRedisTemplate redisTemplate;
2221

2322
@Autowired
24-
public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
23+
public void setRedisTemplate(StringRedisTemplate redisTemplate) {
2524
RedisUtil.redisTemplate = redisTemplate;
2625
}
2726

27+
@Autowired
28+
29+
2830
/**
2931
* 设置键值对,使用默认过期时间
3032
*
3133
* @param key 键
3234
* @param value 值
3335
*/
34-
public static void set(String key, Object value) {
36+
public static void set(String key, String value) {
3537
set(key, value, DEFAULT_EXPIRE_TIME);
3638
}
3739

@@ -42,8 +44,8 @@ public static void set(String key, Object value) {
4244
* @param value value
4345
* @param expireTime 过期时间
4446
*/
45-
public static void set(String key, Object value, long expireTime) {
46-
redisTemplate.opsForValue().set(key, JSON.toJSONString(value));
47+
public static void set(String key, String value, long expireTime) {
48+
redisTemplate.opsForValue().set(key, value);
4749
redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS);
4850
}
4951

1.SSO单点登录/sso/src/main/resources/application.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,22 @@ spring:
99
type: redis
1010
redis:
1111
database: 0
12-
host: 192.168.1.100
12+
host: 10.82.27.177
1313
port: 6379
1414
password:
1515
# 连接超时时间(ms)
16-
timeout: 1000ms
16+
timeout: 5000
1717
# 高版本springboot中使用jedis或者lettuce
1818
jedis:
1919
pool:
2020
# 连接池最大连接数(负值表示无限制)
2121
max-active: 8
2222
# 连接池最大阻塞等待时间(负值无限制)
23-
max-wait: 5000ms
23+
max-wait: 5000
2424
# 最大空闲链接数
2525
max-idle: 8
2626
# 最小空闲链接数
27-
min-idle: 0
27+
min-idle: 1
2828
mvc:
2929
static-path-pattern: /static/**
3030
# jwt过期时间,单位分钟

1.SSO单点登录/sso/src/main/resources/static/index.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525
} else {
2626
//有token,检查token是否还有效
2727
$.get("/sso/checkJwt?token=" + localStorage.getItem("token"), function (res) {
28-
if (res.code === 1) {
28+
console.log(res);
29+
if (res.data === true) {
2930
alert('已登录,跳转到回调页面');
30-
window.location.href = getUrlParam("redirect") + "&token=" + getToken();
31+
window.location.href = getUrlParam("redirect") + "?token=" + localStorage.getItem("token");
3132
} else {
3233
goLogin();
3334
}

1.SSO单点登录/sso/src/main/resources/static/login.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
data: JSON.stringify({name: name, password: password}),
2626
success: function (res) {
2727
if (res.code === 1) {
28-
setToken(res.data);
28+
localStorage.setItem("token", res.data);
2929
alert("登录成功,跳转到回调地址");
30-
window.location.href = getUrlParam("redirect") + "&token=" + res.data;
30+
window.location.href = getUrlParam("redirect") + "?token=" + res.data;
3131
} else {
3232
alert("账号密码错误");
3333
}

1.SSO单点登录/sys-a/src/main/java/com/example/sysa/controller/Main.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.example.sysa.entity.ReturnEntity;
44
import com.example.sysa.entity.UserContext;
5-
import com.example.sysa.filter.LoginFilter;
65
import com.example.sysa.util.HttpClient;
76
import com.example.sysa.util.UserContextHolder;
87
import org.springframework.beans.factory.annotation.Value;
@@ -31,7 +30,7 @@ public ReturnEntity test() {
3130
@RequestMapping("/logout")
3231
public ReturnEntity logout() throws Exception {
3332
UserContext context = UserContextHolder.get();
34-
HttpClient.get(serverHost + "/clearToken?token=" + context.getToken());
33+
HttpClient.get(serverHost + "/inValid?token=" + context.getToken());
3534
return null;
3635
}
3736
}

1.SSO单点登录/sys-a/src/main/java/com/example/sysa/filter/LoginFilter.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
import javax.servlet.http.HttpServletRequest;
1818
import javax.servlet.http.HttpServletResponse;
1919
import java.io.IOException;
20-
import java.util.Map;
21-
import java.util.concurrent.ConcurrentHashMap;
2220

2321

2422
/**
@@ -76,7 +74,7 @@ private boolean check(String jwt) {
7674
return false;
7775
}
7876
JSONObject object = HttpClient.get(serverHost + "/checkJwt?token=" + jwt);
79-
return object.getInteger("code") == 1;
77+
return object.getBoolean("data");
8078
} catch (Exception e) {
8179
logger.error("向认证中心请求失败", e);
8280
return false;

1.SSO单点登录/sys-a/src/main/resources/static/index.html

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8">
5-
<title>系统A</title>
5+
<title>系统</title>
66
</head>
77
<body>
88
<div id="currentHost"></div>
@@ -14,16 +14,12 @@
1414
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
1515
<script src="https://cdn.bootcss.com/Base64/1.0.2/base64.min.js"></script>
1616
<script>
17-
$('#currentHost').text(location.origin);
18-
var token = getUrlParam("token");
19-
if (token != null && token.trim().length > 0) {
20-
localStorage.setItem("token", token);
21-
}
2217
test();
2318

2419
var info = localStorage.getItem("token").split(".")[1];
2520
var userName = JSON.parse(window.atob(info)).name;
2621
$('#loginStatus').text(userName);
22+
$('#currentHost').text("当前ip,端口:" + location.origin);
2723

2824

2925
//测试token是否有效
@@ -38,22 +34,16 @@
3834

3935
//注销登录
4036
function clearToken() {
41-
$.get("/logout?token=" + getToken(), function (res) {
37+
$.get("/logout?token=" + localStorage.getItem("token"), function (res) {
4238
localStorage.removeItem("token");
4339
goToLoginServer();
4440
})
4541
}
4642

4743
function goToLoginServer() {
4844
alert("当前无登录信息,跳转到认证中心");
49-
location.href = encodeURI("http://localhost:8080/sso/static/index.html?order=checkLogin&redirect=" + window.location.href);
50-
}
51-
52-
function getUrlParam(name) {
53-
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
54-
var r = window.location.search.substr(1).match(reg); //匹配目标参数
55-
if (r != null) return unescape(r[2]);
56-
return null; //返回参数值
45+
localStorage.setItem("redirect", location.href);
46+
location.href = encodeURI("http://localhost:8080/sso/static/index.html?order=checkLogin&redirect=" + window.location.origin + "/static/redirect.html");
5747
}
5848

5949
</script>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>系统</title>
6+
</head>
7+
<body>
8+
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
9+
<script>
10+
//本页面用于回调中转
11+
var token = getUrlParam("token");
12+
localStorage.setItem("token", token);
13+
location.replace(localStorage.getItem("redirect"))
14+
15+
function getUrlParam(name) {
16+
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
17+
var r = window.location.search.substr(1).match(reg); //匹配目标参数
18+
if (r != null) return unescape(r[2]);
19+
return null; //返回参数值
20+
}
21+
22+
</script>
23+
</body>
24+
</html>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
server:
2+
port: 10011
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
server:
2+
port: 10012
3+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
server:
2+
port: 10001
3+
spring:
4+
application:
5+
name: licensingservice
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
server:
2+
port: 10012
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
server:
2+
port: 10012
3+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
spring:
2+
application:
3+
name: organizationservice

0 commit comments

Comments
 (0)