修复网关跨域问题,修复cas cookie重复问题,抽象后台

This commit is contained in:
lhc
2021-03-10 09:12:26 +08:00
parent c84dba33c7
commit f9e10be006
33 changed files with 370 additions and 100 deletions

View File

@@ -25,9 +25,14 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-redis</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<groupId>com.hcframe</groupId>
<artifactId>hcframe-redis-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>

View File

@@ -27,15 +27,15 @@ public class SimpleCORSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String myOrigin = httpServletRequest.getHeader("origin");
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with, X-Access-Token, datasource-Key");
// 是否支持cookie跨域
httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
// HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// String myOrigin = httpServletRequest.getHeader("origin");
// HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// httpServletResponse.setHeader("Access-Control-Allow-Origin", myOrigin);
// httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
// httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
// httpServletResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with, X-Access-Token, datasource-Key");
// // 是否支持cookie跨域
// httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
chain.doFilter(request, response);
}

View File

@@ -1,9 +1,9 @@
package com.hcframe.base.module.datasource.aop;
import com.hcframe.base.common.utils.RedisUtil;
import com.hcframe.base.module.datasource.annotation.DatasourceAnno;
import com.hcframe.base.module.datasource.dynamic.DBContextHolder;
import com.hcframe.base.module.shiro.dao.FtTokenDao;
import com.hcframe.redis.RedisUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

View File

@@ -1,7 +1,6 @@
package com.hcframe.base.module.datasource.aop;
import com.hcframe.base.common.config.FrameConfig;
import com.hcframe.base.common.utils.RedisUtil;
import com.hcframe.base.module.datasource.dao.DatasourceConfigDao;
import com.hcframe.base.module.datasource.dynamic.DBContextHolder;
import com.hcframe.base.module.datasource.utils.DataUnit;

View File

@@ -4,7 +4,7 @@ package com.hcframe.base.module.shiro;
import com.hcframe.base.common.config.FrameConfig;
import com.hcframe.base.module.shiro.service.ShiroService;
import com.hcframe.base.module.shiro.service.SystemRealm;
import com.hcframe.base.common.utils.RedisUtil;
import com.hcframe.redis.RedisUtil;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;

View File

@@ -5,8 +5,8 @@ import com.hcframe.base.common.ServiceException;
import com.hcframe.base.common.config.FrameConfig;
import com.hcframe.base.module.shiro.dao.FtTokenDao;
import com.hcframe.base.module.shiro.FtToken;
import com.hcframe.base.common.utils.RedisUtil;
import com.hcframe.base.common.utils.TokenProccessor;
import com.hcframe.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

View File

@@ -16,22 +16,22 @@
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>net.unicon.cas</groupId>-->
<!-- <artifactId>cas-client-autoconfig-support</artifactId>-->
<!-- <version>1.4.0-GA</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>org.jasig.cas.client</groupId>-->
<!-- <artifactId>cas-client-core</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.jasig.cas.client</groupId>-->
<!-- <artifactId>cas-client-core</artifactId>-->
<!-- <version>${java.cas.client.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>1.4.0-GA</version>
<exclusions>
<exclusion>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>${java.cas.client.version}</version>
</dependency>
<dependency>
<groupId>com.hcframe</groupId>
<artifactId>hcframe-boot-starter</artifactId>

View File

@@ -1,5 +1,6 @@
package com.hcframe.config;
import net.unicon.cas.client.configuration.EnableCasClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -18,6 +19,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableCaching
@EnableDiscoveryClient
@EnableFeignClients
//@EnableCasClient
@ComponentScan(basePackages = {"com.hcframe.**"})
public class ConfigApplication {
public static void main(String[] args) {

View File

@@ -1,8 +1,12 @@
package com.hcframe.config.module.controller;
import com.hcframe.base.common.ResultVO;
import com.hcframe.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@@ -12,21 +16,45 @@ import java.io.IOException;
@Controller
public class CasController {
@Autowired
RedisUtil redisUtil;
@GetMapping("valid")
public ResultVO<String> casValid(HttpServletResponse response, HttpServletRequest request){
public ResultVO<String> casValid(HttpServletResponse response, HttpServletRequest request) {
String token = "";
try {
Cookie[] cookies= request.getCookies();
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("X-Access-Token".equals(cookie.getName())) {
token = cookie.getValue();
response.addCookie(cookie);
break;
}
}
response.sendRedirect("http://192.168.1.130:9527/?token="+token);
response.sendRedirect("http://192.168.1.130:9527/#/login?token=" + token + "&redirect=%2Fdashboard");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@GetMapping("userinfo")
@ResponseBody
public ResultVO<Object> getUserInfo(String token) {
return ResultVO.getSuccess(redisUtil.hget("session", token));
}
@GetMapping("/logout")
@ResponseBody
public ResultVO<String> logout(HttpServletResponse response, @CookieValue("X-Access-Token") String token) {
Cookie cookie = new Cookie("X-Access-Token", null);
cookie.setMaxAge(0);
redisUtil.hdel("session", token);
return ResultVO.getSuccess("http://192.168.1.131:8080/cas/logout");
}
@GetMapping("/cas")
public String getCasHtml() {
return "cas";
}
}

View File

@@ -17,10 +17,7 @@ public class TestController {
BaseMapper baseMapper;
@GetMapping("/test")
public ResultVO<FtUser> getUser(HttpServletRequest request) {
System.out.println(request.getHeader("X-Access-Token"));
FtUser ftUser = (FtUser) SecurityUtils.getSubject().getPrincipal();
System.out.println("+++++++++"+ftUser.getUsername());
return ResultVO.getSuccess(ftUser);
public ResultVO<String> getUser(HttpServletRequest request) {
return ResultVO.getSuccess("token");
}
}

View File

@@ -4,7 +4,7 @@ server:
context-path: /config
cas:
server-url-prefix: http://192.168.1.131:8080/cas
client-host-url: http://192.168.1.130:9527
client-host-url: http://192.168.1.130:8081
validation-type: cas3
server-login-url: http://192.168.1.131:8080/cas/login
pagehelper:

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>

View File

@@ -1,11 +1,14 @@
package com.hcframe.gateway;
import com.hcframe.redis.RedisUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@EnableDiscoveryClient
@Import(RedisUtil.class)
public class GatewayApplication {
public static void main(String[] args) {

View File

@@ -16,7 +16,7 @@ public class CorsConfig {
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedHeader("X-Access-Token");
//设置预检请求的缓存时间(秒),在这个时间段里,对于相同的跨域请求不会再预检了
config.setMaxAge(18000L);
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource(new PathPatternParser());

View File

@@ -0,0 +1,55 @@
package com.hcframe.gateway.config;
import com.hcframe.gateway_cas_stater.data.DataStorage;
import com.hcframe.redis.RedisUtil;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* @author lhc
*/
public class MyDataStorage implements DataStorage {
private static final String SESSION = "session";
private static final String EXPIRE_TIME = "expireTime";
private Long expireTime;
@Resource
private RedisUtil redisUtil;
public MyDataStorage(Long expireTime) {
if (expireTime==null){
throw new RuntimeException("expireTime can not be null");
}
this.expireTime = expireTime;
}
@Override
public Object getValue(String userKey, String key) {
Map<String,Object> map = (Map<String, Object>) redisUtil.hget(SESSION, userKey);
if (map == null) {
return null;
}
if (!map.containsKey(key)) {
return null;
}
return map.get(key);
}
@Override
public void setValue(String userKey, String key, Object attr) {
Map<String,Object> map = (Map<String, Object>) redisUtil.hget(SESSION, userKey);
if (map != null) {
map.put(key, attr);
redisUtil.hset("session", userKey, map, expireTime);
} else {
map = new HashMap<>(2);
map.put(key, attr);
map.put(EXPIRE_TIME, expireTime);
redisUtil.hset("session", userKey, map, expireTime);
}
}
}

View File

@@ -5,6 +5,9 @@ import com.hcframe.gateway_cas_stater.config.CasGatewayClientConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class GatewayController {
@@ -15,8 +18,11 @@ public class GatewayController {
this.casGatewayClientConfig = casGatewayClientConfig;
}
@GetMapping("cas")
public ResultVO<String> getCasUrl(){
return ResultVO.getSuccess(casGatewayClientConfig.casServiceUrl+casGatewayClientConfig.casContextPath);
@GetMapping("gateway/cas")
public ResultVO<Map<String,String>> getCasUrl(){
Map<String,String> map=new HashMap<>(2);
map.put("cas", casGatewayClientConfig.casServiceUrl + casGatewayClientConfig.casContextPath + casGatewayClientConfig.getLoginUrl());
map.put("config", "http://192.168.1.130:8084/user/cas/valid");
return ResultVO.getSuccess(map);
}
}

View File

@@ -20,6 +20,8 @@ spring:
uri: lb://cloud-user
predicates:
- Path=/user/**
filters:
- PreserveHostHeader
- id: config
uri: lb://cloud-config
predicates:
@@ -53,23 +55,6 @@ spring:
filters: stat,slf4j
# 通过connectProperties属性来打开mergeSql功能慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 若不使用redis需要注释掉此类信息
redis:
database: 0
host: 192.168.4.119
port: 6379
password:
lettuce:
pool:
# 连接池中的最大空闲连接 默认8
max-idle: 8
# 连接池中的最小空闲连接 默认0
min-idle: 0
# 连接池最大连接数 默认8 ,负数表示没有限制
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
max-wait: -1
timeout: 30000
eureka:
client:
service-url:
@@ -119,4 +104,6 @@ hcframe:
casServiceUrl: http://192.168.1.131:8080
serviceUrl: http://192.168.1.130:9527
clientContextPath: /
cookieHolderPattern: com.hcframe.gateway.config.MyDataStorage
white-url: "^(.*(/logout?))|(/user/cas/url)$"

View File

@@ -24,8 +24,7 @@ spring:
druid:
# 配置sqlite文件路径需要填写绝对路径推荐将sqlite文件放入到服务器上而非程序jar包或war包中
driver-class-name: org.sqlite.JDBC
url: jdbc:sqlite:/Volumes/DATA/ideaProject/common-frame/hcframe/hcframe-parent/hcframe-config/src/main/resources/datasource.db
# url: jdbc:sqlite:D:/nacos-server-1.4.1/datasource.db
url: jdbc:sqlite:D:/nacos-server-1.4.1/datasource.db
username:
password:
#使用Druid数据源
@@ -113,3 +112,4 @@ hcframe:
casServiceUrl: http://192.168.1.131:8080
serviceUrl: http://192.168.1.130:9527
clientContextPath: /
cookieHolderPattern: com.hcframe.gateway.config.MyDataStorage

View File

@@ -24,7 +24,6 @@ spring:
druid:
# 配置sqlite文件路径需要填写绝对路径推荐将sqlite文件放入到服务器上而非程序jar包或war包中
driver-class-name: org.sqlite.JDBC
# url: jdbc:sqlite:/Volumes/DATA/ideaProject/common-frame/hcframe/hcframe-parent/hcframe-config/src/main/resources/datasource.db
url: jdbc:sqlite:D:/nacos-server-1.4.1/datasource.db
username:
password:
@@ -64,11 +63,6 @@ spring:
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
max-wait: -1
timeout: 30000
eureka:
client:
service-url:
# defaultZone: http://admin:123456@tomcat1:8080/eureka/
defaultZone: http://admin:123456@192.168.4.119:8081/eureka/
# 框架配置
frame:
# 是否开启redis 用户登录若开启此项需要配置redis节点及相关配置若不开启需要注释掉redis相关配置信息
@@ -111,5 +105,6 @@ feign:
hcframe:
cas:
casServiceUrl: http://192.168.1.131:8080
serviceUrl: http://192.168.4.131:8084
serviceUrl: http://192.168.1.130:8084
clientContextPath: /
cookieHolderPattern: com.hcframe.gateway.config.MyDataStorage

View File

@@ -3,6 +3,23 @@ spring:
active: @profile.name@
application:
name: cloud-gateway
# 若不使用redis需要注释掉此类信息
redis:
database: @redis.database@
host: @redis.host@
port: @redis.port@
password: @redis.password@
lettuce:
pool:
# 连接池中的最大空闲连接 默认8
max-idle: 8
# 连接池中的最小空闲连接 默认0
min-idle: 0
# 连接池最大连接数 默认8 ,负数表示没有限制
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
max-wait: -1
timeout: 30000
mybatis:
mapper-locations: classpath*:mapping/**/*.xml
type-aliases-package: com.hcframe.**.entity

View File

@@ -72,16 +72,26 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
if (isWhiteList(request)) {
return chain.filter(exchange);
}
MultiValueMap<String, HttpCookie> cookieMultiValueMap = request.getCookies();
List<HttpCookie> authId = cookieMultiValueMap.get(casGatewayClientConfig.authKey);
if (StringUtils.isEmpty(authId)) {
String token = this.tokenProccessor.makeToken();
response.addCookie(ResponseCookie.from(casGatewayClientConfig.authKey, token).build());
HttpHeaders responseHeaders = response.getHeaders();
responseHeaders.set("X-Access-Token", token);
String token;
HttpHeaders requestHeaders = request.getHeaders();
List<String> tokens = requestHeaders.get(casGatewayClientConfig.authKey);
if (tokens != null && tokens.size()>0) {
token = tokens.get(0);
} else {
MultiValueMap<String, HttpCookie> cookieMultiValueMap = request.getCookies();
List<HttpCookie> authId = cookieMultiValueMap.get(casGatewayClientConfig.authKey);
if (StringUtils.isEmpty(authId)) {
token = this.tokenProccessor.makeToken();
response.addCookie(ResponseCookie.from(casGatewayClientConfig.authKey, token).build());
HttpHeaders responseHeaders = response.getHeaders();
responseHeaders.set(casGatewayClientConfig.authKey, token);
} else {
token = authId.get(0).getValue();
}
}
// Assertion assertion = (Assertion) dataStorage.getValue(authId.get(0).getValue(), CAS_ASSERTION_KEY);
if (dataStorage.getValue(authId.get(0).getValue(), CAS_ASSERTION_KEY) != null) {
Assertion assertion = (Assertion) dataStorage.getValue(token, CAS_ASSERTION_KEY);
if (assertion != null) {
return chain.filter(exchange);
} else {
String serviceUrl = Utils.encodingUrl(request, true, false);

View File

@@ -17,6 +17,7 @@ import reactor.core.publisher.Mono;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Utils {
@@ -29,17 +30,40 @@ public class Utils {
public static String getParameter(ServerHttpRequest request, String parameter) {
if (request.getQueryParams().containsKey(parameter)) {
return request.getQueryParams().getFirst(parameter);
List<String> list = request.getQueryParams().get(parameter);
return list.get(list.size()-1);
}
return null;
}
public static String exceptTicket(ServerHttpRequest request) {
MultiValueMap<String, String> multiValueMap = request.getQueryParams();
StringBuilder stringBuffer = new StringBuilder();
for (MultiValueMap.Entry<String, List<String>> entry : multiValueMap.entrySet()) {
if (!"ticket".equals(entry.getKey())) {
stringBuffer.append(entry.getKey()).append("=").append(entry.getValue().get(0)).append("&");
}
}
if (stringBuffer.length() == 0) {
return "";
}
return stringBuffer.substring(0, stringBuffer.length() - 1);
}
public static String encodingUrl(ServerHttpRequest request, boolean isEncode, boolean isTicket) {
String url = request.getURI().toString();
// url = "http://" + request.getURI().getHost() + ":" + request.getURI().getPort() + request.getURI().getPath();
String query = request.getURI().getQuery();
// if (!StringUtils.isEmpty(query)) {
// url = url + QUESTION_MARK + query;
// }
HttpHeaders headers = request.getHeaders();
List<String> forwardedUrl = headers.get("x-forwarded-host");
if (!StringUtils.isEmpty(forwardedUrl)) {
url = "http://" + forwardedUrl.get(0) + request.getURI().getPath() + QUESTION_MARK + request.getURI().getQuery();
url = "http://" + forwardedUrl.get(0) + request.getURI().getPath();
if (!StringUtils.isEmpty(query)) {
url = url + QUESTION_MARK + query;
}
}
if (isTicket) {
if (url.contains(QUESTION_MARK)) {

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>hcframe-starter</artifactId>
<groupId>com.hcframe</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hcframe-redis-starter</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,4 +1,4 @@
package com.hcframe.base.common.config;
package com.hcframe.redis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -22,7 +22,7 @@ public class RedisConfig {
* @param redisConnectionFactory
* @return
*/
@Bean
@Bean("hcframeRedisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setKeySerializer(new StringRedisSerializer());

View File

@@ -1,19 +1,17 @@
package com.hcframe.base.common.utils;
package com.hcframe.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.hcframe.base.common.config.FrameConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@@ -23,18 +21,10 @@ import javax.annotation.Resource;
@Component
public final class RedisUtil {
// url
public static boolean isUseful;
// 通过yml文件获取host
@Autowired
public void setHost(FrameConfig config) {
RedisUtil.isUseful = config.getIsRedisLogin();
}
private final static Logger logger = LoggerFactory.getLogger(RedisUtil.class);
@Resource
@Qualifier("hcframeRedisTemplate")
private RedisTemplate<String, Object> redisTemplate;
/**

View File

@@ -0,0 +1 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.hcframe.redis.RedisConfig

View File

@@ -15,6 +15,7 @@
<module>hcframe-gateway-cas-starter</module>
<module>hcframe-boot-starter</module>
<module>hcframe-cloud-starter</module>
<module>hcframe-redis-starter</module>
</modules>
<properties>

View File

@@ -16,6 +16,22 @@
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>1.4.0-GA</version>
<exclusions>
<exclusion>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>${java.cas.client.version}</version>
</dependency>
<dependency>
<groupId>com.hcframe</groupId>
<artifactId>hcframe-base</artifactId>

View File

@@ -1,5 +1,6 @@
package com.hcframe.user;
import net.unicon.cas.client.configuration.EnableCasClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -10,6 +11,8 @@ import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.net.URLEncoder;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableSwagger2
@@ -17,8 +20,11 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableCaching
@ComponentScan(basePackages = {"com.hcframe.**"})
@EnableDiscoveryClient
//@EnableCasClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}

View File

@@ -0,0 +1,71 @@
package com.hcframe.user.module.manage.controller;
import com.hcframe.base.common.ResultVO;
import com.hcframe.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("cas")
public class CasController {
@Autowired
RedisUtil redisUtil;
@GetMapping("valid")
public ResultVO<String> casValid(HttpServletResponse response, HttpServletRequest request,String webUrl) {
String token = "";
try {
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if ("X-Access-Token".equals(cookie.getName())) {
token = cookie.getValue();
response.addCookie(cookie);
break;
}
}
webUrl = URLDecoder.decode(webUrl, "utf-8");
response.sendRedirect("http://"+webUrl+"/#/login?token=" + token + "&redirect=%2Fdashboard");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@GetMapping("userinfo")
@ResponseBody
public ResultVO<Object> getUserInfo(String token) {
return ResultVO.getSuccess(redisUtil.hget("session", token));
}
@GetMapping("/logout")
@ResponseBody
public ResultVO<String> logout(HttpServletResponse response, @CookieValue("X-Access-Token") String token) {
Cookie cookie = new Cookie("X-Access-Token", null);
cookie.setMaxAge(0);
redisUtil.hdel("session", token);
return ResultVO.getSuccess("http://192.168.1.131:8080/cas/logout");
}
@GetMapping("url")
@ResponseBody
public ResultVO<Map<String,String>> getCasUrl(){
Map<String,String> map=new HashMap<>(2);
map.put("cas", "http://192.168.1.131:8080/cas/login");
map.put("config", "http://192.168.1.130:8084/user/cas/valid");
return ResultVO.getSuccess(map);
}
}

View File

@@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.hcframe.user.module.manage.service.ManageDataService;
import java.net.URLEncoder;
/**
* @author lhc
@@ -20,4 +22,8 @@ public class ManageServiceImpl implements ManageDataService {
public ManageServiceImpl(@Qualifier(BaseMapperImpl.BASE) BaseMapper baseMapper) {
this.baseMapper = baseMapper;
}
public static void main(String[] args) {
System.out.println(URLEncoder.encode("http://192.168.1.130:9527/#/login"));
}
}

View File

@@ -4,6 +4,11 @@ server:
context-path: /user
pagehelper:
auto-runtime-dialect: true
cas:
server-url-prefix: http://192.168.1.131:8080/cas
client-host-url: http://192.168.1.130:8080
validation-type: cas3
server-login-url: http://192.168.1.131:8080/cas/login
spring:
application:
name: cloud-user

View File

@@ -134,6 +134,10 @@
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>192.168.1.131:8848</discovery.server-addr>
<redis.database>0</redis.database>
<redis.host>192.168.4.119</redis.host>
<redis.port>6379</redis.port>
<redis.password/>
</properties>
</profile>
<profile>
@@ -148,6 +152,10 @@
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>192.168.1.131:8848</discovery.server-addr>
<redis.database>0</redis.database>
<redis.host>192.168.4.119</redis.host>
<redis.port>6379</redis.port>
<redis.password/>
</properties>
</profile>
<profile>
@@ -163,6 +171,10 @@
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>127.0.0.1:8848</discovery.server-addr>
<redis.database>0</redis.database>
<redis.host>192.168.4.119</redis.host>
<redis.port>6379</redis.port>
<redis.password/>
</properties>
</profile>
</profiles>