Merge branch 'master' of http://192.168.11.205:9000/r/se-cloud
| | |
| | | *.jar |
| | | /docker-compose/nginx/html |
| | | /docker-compose/mysql/data |
| | | /docker-compose/nacos/logs/nacos_gc.log.0.current |
| | | /docker-compose/redis/data/dump.rdb |
| | |
| | | - ./nacos/conf/application.properties:/home/nacos/conf/application.properties |
| | | ports: |
| | | - 8848:8848 |
| | | - 9848:9848 |
| | | - 9849:9849 |
| | | # - 9848:9848 |
| | | # - 9849:9849 |
| | | depends_on: |
| | | - se-mysql |
| | | networks: |
| | |
| | | # gateway |
| | | se-gateway: |
| | | image: openjdk:8-jre |
| | | ports: |
| | | - 9204:8080 |
| | | # ports: |
| | | # - 9204:8080 |
| | | volumes: |
| | | - ./gateway:/data |
| | | environment: |
| | |
| | | # auth |
| | | se-auth: |
| | | image: openjdk:8-jre |
| | | ports: |
| | | - 9200:9200 |
| | | # ports: |
| | | # - 9200:9200 |
| | | volumes: |
| | | - ./auth:/data |
| | | environment: |
| | |
| | | # system |
| | | se-system: |
| | | image: openjdk:8-jre |
| | | ports: |
| | | - 9201:9201 |
| | | # ports: |
| | | # - 9201:9201 |
| | | volumes: |
| | | - ./system:/data |
| | | environment: |
| | |
| | | networks: |
| | | - network-se |
| | | restart: always |
| | | # se-file |
| | | se-file: |
| | | image: openjdk:8-jre |
| | | # ports: |
| | | # - 9300:9300 |
| | | volumes: |
| | | - ./file:/data |
| | | environment: |
| | | TZ: Asia/Shanghai |
| | | entrypoint: java -jar /data/se-modules-file.jar --spring.config.location=file:/data/ |
| | | depends_on: |
| | | - se-nacos |
| | | networks: |
| | | - network-se |
| | | restart: always |
| | | # nginx |
| | | se-nginx: |
| | | image: nginx:latest |
¶Ô±ÈÐÂÎļþ |
| | |
| | | # Tomcat |
| | | server: |
| | | port: 9300 |
| | | |
| | | # Spring |
| | | spring: |
| | | application: |
| | | # åºç¨åç§° |
| | | name: se-file |
| | | profiles: |
| | | # ç¯å¢é
ç½® |
| | | active: dev |
| | | cloud: |
| | | nacos: |
| | | discovery: |
| | | # æå¡æ³¨åå°å |
| | | server-addr: se-nacos:8848 |
| | | config: |
| | | # é
ç½®ä¸å¿å°å |
| | | server-addr: se-nacos:8848 |
| | | # é
ç½®æä»¶æ ¼å¼ |
| | | file-extension: yml |
| | | # å
±äº«é
ç½® |
| | | shared-configs: |
| | | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} |
| | |
| | | (5,'se-system-dev.yml','DEFAULT_GROUP','# springé
ç½®\nspring:\n redis:\n host: se-redis\n port: 6379\n password: Redis_s!E_6.2.6\n datasource:\n druid:\n stat-view-servlet:\n enabled: false\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n connectTimeout: 30000\n socketTimeout: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # ä¸»åºæ°æ®æº\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://se-mysql:3306/se-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: My_Sql_s!E_v5.7\n # ä»åºæ°æ®æº\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n\n# mybatisé
ç½®\nmybatis:\n # æç´¢æå®å
å«å\n typeAliasesPackage: com.se.system\n # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶\n mapperLocations: classpath:mapper/**/*.xml\n\n# swaggeré
ç½®\nswagger:\n title: ç³»ç»æ¨¡åæ¥å£ææ¡£\n license: Powered By se','00678c89684ec0b825cb9b71e032db64','2020-11-20 00:00:00','2023-12-04 07:51:28','nacos','0:0:0:0:0:0:0:1','','','ç³»ç»æ¨¡å','null','null','yaml','',''), |
| | | (6,'se-gen-dev.yml','DEFAULT_GROUP','# springé
ç½®\nspring:\n redis:\n host: se-redis\n port: 6379\n password: Redis_s!E_6.2.6\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://se-mysql:3306/se-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: My_Sql_s!E_v5.7\n\n# mybatisé
ç½®\nmybatis:\n # æç´¢æå®å
å«å\n typeAliasesPackage: com.se.gen.domain\n # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶\n mapperLocations: classpath:mapper/**/*.xml\n\n# swaggeré
ç½®\nswagger:\n title: 代ç çææ¥å£ææ¡£\n # 代ç çæ\ngen:\n # ä½è
\n author: se\n # é»è®¤çæå
è·¯å¾ system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool\n packageName: com.se.system\n # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯false\n autoRemovePre: false\n # 表åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼\n tablePrefix: sys_\n','eb592420b3fceae1402881887b8a6a0d','2020-11-20 00:00:00','2022-09-29 02:49:42','nacos','0:0:0:0:0:0:0:1','','','代ç çæ','null','null','yaml','',''), |
| | | (7,'se-job-dev.yml','DEFAULT_GROUP','# springé
ç½®\nspring:\n redis:\n host: se-redis\n port: 6379\n password: Redis_s!E_6.2.6\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://se-mysql:3306/se-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: root\n password: My_Sql_s!E_v5.7\n\n# mybatisé
ç½®\nmybatis:\n # æç´¢æå®å
å«å\n typeAliasesPackage: com.se.job.domain\n # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶\n mapperLocations: classpath:mapper/**/*.xml\n\n# swaggeré
ç½®\nswagger:\n title: 宿¶ä»»å¡æ¥å£ææ¡£\n ','edcf0e3fe13fea07b4ec08b1088f30b3','2020-11-20 00:00:00','2022-09-29 02:50:50','nacos','0:0:0:0:0:0:0:1','','','宿¶ä»»å¡','null','null','yaml','',''), |
| | | (8,'se-file-dev.yml','DEFAULT_GROUP','# æ¬å°æä»¶ä¸ä¼ \r\nfile:\r\n domain: http://127.0.0.1:9300\r\n path: D:/se/uploadPath\r\n prefix: /statics\r\n\r\n# FastDFSé
ç½®\r\nfdfs:\r\n domain: http://8.129.231.12\r\n soTimeout: 3000\r\n connectTimeout: 2000\r\n trackerList: 8.129.231.12:22122\r\n\r\n# Minioé
ç½®\r\nminio:\r\n url: http://8.129.231.12:9000\r\n accessKey: minioadmin\r\n secretKey: minioadmin\r\n bucketName: test','5382b93f3d8059d6068c0501fdd41195','2020-11-20 00:00:00','2020-12-21 21:01:59',NULL,'0:0:0:0:0:0:0:1','','','æä»¶æå¡','null','null','yaml',NULL,''), |
| | | (8,'se-file-dev.yml','DEFAULT_GROUP','# æ¬å°æä»¶ä¸ä¼ \r\nfile:\r\n domain: http://127.0.0.1:9300\r\n path: /data/uploadPath\r\n prefix: /statics\r\n\r\n# FastDFSé
ç½®\r\nfdfs:\r\n domain: http://8.129.231.12\r\n soTimeout: 3000\r\n connectTimeout: 2000\r\n trackerList: 8.129.231.12:22122\r\n\r\n# Minioé
ç½®\r\nminio:\r\n url: http://8.129.231.12:9000\r\n accessKey: minioadmin\r\n secretKey: minioadmin\r\n bucketName: test','5382b93f3d8059d6068c0501fdd41195','2020-11-20 00:00:00','2020-12-21 21:01:59',NULL,'0:0:0:0:0:0:0:1','','','æä»¶æå¡','null','null','yaml',NULL,''), |
| | | (9,'sentinel-se-gateway','DEFAULT_GROUP','[\r\n {\r\n \"resource\": \"se-auth\",\r\n \"count\": 500,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"se-system\",\r\n \"count\": 1000,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"se-gen\",\r\n \"count\": 200,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n },\r\n {\r\n \"resource\": \"se-job\",\r\n \"count\": 300,\r\n \"grade\": 1,\r\n \"limitApp\": \"default\",\r\n \"strategy\": 0,\r\n \"controlBehavior\": 0\r\n }\r\n]','9f3a3069261598f74220bc47958ec252','2020-11-20 00:00:00','2020-11-20 00:00:00',NULL,'0:0:0:0:0:0:0:1','','','éæµçç¥','null','null','json',NULL,''); |
| | | |
| | | |
| | |
| | | try_files $uri $uri/ /sys/; |
| | | #index index.html index.htm; |
| | | } |
| | | |
| | | location /se-file/ { |
| | | proxy_set_header Host $http_host; |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header REMOTE-HOST $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | |
| | | proxy_pass http://se-file:9300/; |
| | | } |
| | | |
| | | location /prod-api/ { |
| | | proxy_set_header Host $http_host; |
| | |
| | | |
| | | import com.se.common.core.constant.Constants; |
| | | import com.se.common.core.text.StrFormatter; |
| | | import org.springframework.http.HttpCookie; |
| | | import org.springframework.http.server.reactive.ServerHttpRequest; |
| | | import org.springframework.util.AntPathMatcher; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.util.MultiValueMap; |
| | | |
| | | import javax.servlet.http.Cookie; |
| | | import javax.servlet.http.HttpServletRequest; |
| | |
| | | return sb.toString(); |
| | | } |
| | | |
| | | public static String getValueFromCookie(ServerHttpRequest request, String key) { |
| | | MultiValueMap<String, HttpCookie> cookies = request.getCookies(); |
| | | if (CollectionUtils.isEmpty(cookies)) { |
| | | return null; |
| | | } |
| | | |
| | | for (Map.Entry<String, List<HttpCookie>> itemList : cookies.entrySet()) { |
| | | for (HttpCookie cookie :itemList.getValue()) { |
| | | if (cookie.getName().equals(key)){ |
| | | return cookie.getValue(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | public static String getValueFromCookie(HttpServletRequest request,String key) { |
| | | Cookie[] cookies = request.getCookies(); |
| | | if (cookies == null || cookies.length == 0) { |
| | |
| | | * @date 2024-08-28 |
| | | */ |
| | | @Configuration |
| | | @SuppressWarnings("ALL") |
| | | public class CorsConfig |
| | | { |
| | | /** |
| | |
| | | * @author admin |
| | | */ |
| | | @Component |
| | | public class AuthFilter implements GlobalFilter, Ordered |
| | | { |
| | | public class AuthFilter implements GlobalFilter, Ordered { |
| | | private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); |
| | | |
| | | // æé¤è¿æ»¤ç uri å°åï¼nacosèªè¡æ·»å |
| | |
| | | |
| | | |
| | | @Override |
| | | public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) |
| | | { |
| | | public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { |
| | | ServerHttpRequest request = exchange.getRequest(); |
| | | ServerHttpRequest.Builder mutate = request.mutate(); |
| | | |
| | | String url = request.getURI().getPath(); |
| | | // è·³è¿ä¸éè¦éªè¯çè·¯å¾ |
| | | if (StringUtils.matches(url, ignoreWhite.getWhites())) |
| | | { |
| | | if (StringUtils.matches(url, ignoreWhite.getWhites())) { |
| | | return chain.filter(exchange); |
| | | } |
| | | String token = getToken(request); |
| | | if (StringUtils.isEmpty(token)) |
| | | { |
| | | if (StringUtils.isEmpty(token)) { |
| | | return unauthorizedResponse(exchange, "令çä¸è½ä¸ºç©º"); |
| | | } |
| | | Claims claims = JwtUtils.parseToken(token); |
| | | if (claims == null) |
| | | { |
| | | if (claims == null) { |
| | | return unauthorizedResponse(exchange, "令çå·²è¿ææéªè¯ä¸æ£ç¡®ï¼"); |
| | | } |
| | | String userkey = JwtUtils.getUserKey(claims); |
| | | boolean islogin = redisService.hasKey(getTokenKey(userkey)); |
| | | if (!islogin) |
| | | { |
| | | if (!islogin) { |
| | | return unauthorizedResponse(exchange, "ç»å½ç¶æå·²è¿æ"); |
| | | } |
| | | String userid = JwtUtils.getUserId(claims); |
| | | String username = JwtUtils.getUserName(claims); |
| | | if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) |
| | | { |
| | | if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) { |
| | | return unauthorizedResponse(exchange, "令çéªè¯å¤±è´¥"); |
| | | } |
| | | |
| | |
| | | return chain.filter(exchange.mutate().request(mutate.build()).build()); |
| | | } |
| | | |
| | | private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) |
| | | { |
| | | if (value == null) |
| | | { |
| | | private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) { |
| | | if (value == null) { |
| | | return; |
| | | } |
| | | String valueStr = value.toString(); |
| | |
| | | mutate.header(name, valueEncode); |
| | | } |
| | | |
| | | private void removeHeader(ServerHttpRequest.Builder mutate, String name) |
| | | { |
| | | private void removeHeader(ServerHttpRequest.Builder mutate, String name) { |
| | | mutate.headers(httpHeaders -> httpHeaders.remove(name)).build(); |
| | | } |
| | | |
| | | private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) |
| | | { |
| | | private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) { |
| | | log.error("[é´æå¼å¸¸å¤ç]请æ±è·¯å¾:{}", exchange.getRequest().getPath()); |
| | | return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED); |
| | | } |
| | |
| | | /** |
| | | * è·åç¼åkey |
| | | */ |
| | | private String getTokenKey(String token) |
| | | { |
| | | private String getTokenKey(String token) { |
| | | return CacheConstants.LOGIN_TOKEN_KEY + token; |
| | | } |
| | | |
| | | /** |
| | | * è·å请æ±token |
| | | */ |
| | | private String getToken(ServerHttpRequest request) |
| | | { |
| | | private String getToken(ServerHttpRequest request) { |
| | | // ä»headerè·åtokenæ è¯ |
| | | String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION); |
| | | |
| | | // ä»urlè·åtokenæ è¯ |
| | | if (StringUtils.isEmpty(token)) { |
| | | token = request.getQueryParams().getFirst(TokenConstants.ACCESS_TOKEN); |
| | | } |
| | | if (StringUtils.isEmpty(token)) { |
| | | token = request.getQueryParams().getFirst(TokenConstants.TOKEN); |
| | | } |
| | | |
| | | // ä»cookieè·åtokenæ è¯ |
| | | if (StringUtils.isEmpty(token)) { |
| | | token = StringUtils.getValueFromCookie(request, TokenConstants.COOKIE_TOKEN); |
| | | } |
| | | |
| | | //String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION); |
| | | // 妿å端设置äºä»¤çåç¼ï¼åè£åªæåç¼ |
| | | if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) |
| | | { |
| | | if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) { |
| | | token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY); |
| | | } |
| | | return token; |
| | | } |
| | | |
| | | @Override |
| | | public int getOrder() |
| | | { |
| | | public int getOrder() { |
| | | return -200; |
| | | } |
| | | } |