mirror of
https://gitee.com/log4j/pig.git
synced 2024-12-31 08:14:18 +08:00
⬆️ Upgrading dependencies. nacos 2.1.0
This commit is contained in:
parent
88c197578e
commit
08355f8353
@ -1,4 +1,4 @@
|
|||||||
FROM mysql:8.0.27
|
FROM mysql/mysql-server:8.0.29
|
||||||
|
|
||||||
MAINTAINER lengleng(wangiegie@gmail.com)
|
MAINTAINER lengleng(wangiegie@gmail.com)
|
||||||
|
|
||||||
|
@ -2,46 +2,47 @@ DROP DATABASE IF EXISTS `pig_config`;
|
|||||||
|
|
||||||
CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
CREATE DATABASE `pig_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||||
|
|
||||||
|
USE pig_config;
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
USE pig_config;
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for config_info
|
-- Table structure for config_info
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `config_info`;
|
DROP TABLE IF EXISTS `config_info`;
|
||||||
CREATE TABLE `config_info` (
|
CREATE TABLE `config_info` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
||||||
`group_id` varchar(255) COLLATE utf8_bin DEFAULT NULL,
|
`group_id` varchar(255) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
||||||
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
||||||
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
||||||
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
|
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
||||||
`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,
|
`c_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
`c_use` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
`effect` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`type` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
`type` varchar(64) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`c_schema` text COLLATE utf8_bin,
|
`c_schema` text COLLATE utf8_bin,
|
||||||
PRIMARY KEY (`id`),
|
`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
|
||||||
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
PRIMARY KEY (`id`),
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
|
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of config_info
|
-- Records of config_info
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n\n# Spring 相关\n\nspring:\n mvc:\n pathmatch:\n matching-strategy: ant_path_matcher\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# spring security 配置\nsecurity:\n oauth2:\n resource:\n loadBalanced: true\n token-info-uri: http://pig-auth/oauth/check_token\n # 通用放行URL,服务个性化,请在对应配置文件覆盖\n ignore:\n urls:\n - /v3/api-docs\n - /actuator/**\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth/token\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '8d9ffc03cef9e316905d4f86d1914e6b', '2019-11-29 16:31:20', '2022-03-30 10:48:26', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '');
|
INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n\n# Spring 相关\n\nspring:\n mvc:\n pathmatch:\n matching-strategy: ant_path_matcher\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# spring security 配置\nsecurity:\n oauth2:\n resource:\n loadBalanced: true\n token-info-uri: http://pig-auth/oauth/check_token\n # 通用放行URL,服务个性化,请在对应配置文件覆盖\n ignore:\n urls:\n - /v3/api-docs\n - /actuator/**\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth/token\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '8d9ffc03cef9e316905d4f86d1914e6b', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '58b1b48a2888f49e667864be32edf9c1', '2019-11-29 16:31:48', '2020-01-01 18:30:58', NULL, '127.0.0.1', '', '', '认证中心配置', 'null', 'null', 'yaml', 'null');
|
INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', 'd92c284f687ae64ac9661f6313994545', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(27v1agvAug87ANOVnbKdsw==)\n client-secret: ENC(VbnkopxrwgbFVKp+UxJ2pg==)\n scope: server\n\n# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n# 直接放行URL\nignore:\n urls:\n - /v2/api-docs\n - /actuator/**\n', 'abc702838b34d11b46e96143ccd9f367', '2019-11-29 16:32:12', '2019-11-29 16:32:12', NULL, '127.0.0.1', '', '', '代码生成配置', NULL, NULL, 'yaml', NULL);
|
INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(27v1agvAug87ANOVnbKdsw==)\n client-secret: ENC(VbnkopxrwgbFVKp+UxJ2pg==)\n scope: server\n\n# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n# 直接放行URL\nignore:\n urls:\n - /v2/api-docs\n - /actuator/**\n', '02fe9e81c41986626067b8cbe589b77f', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # demo模块\n - id: pig-demo\n uri: lb://demo-biz\n predicates:\n - Path=/demo/**\n - id: openapi\n uri: http://localhost:${server.port}\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test', 'dbf00e83f80de7f011d244ea1ce5686e', '2019-11-29 16:32:42', '2022-03-27 23:19:33', '', '0:0:0:0:0:0:0:1', '', '', '网关配置', '', '', 'yaml', '');
|
INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # demo模块\n - id: pig-demo\n uri: lb://demo-biz\n predicates:\n - Path=/demo/**\n - id: openapi\n uri: http://localhost:${server.port}\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test', 'dbf00e83f80de7f011d244ea1ce5686e', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2019-11-29 16:33:05', '2022-03-22 17:50:52', 'nacos', '127.0.0.1', '', '', '监控配置', '', '', 'yaml', '');
|
INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', 'security:\n oauth2:\n client:\n client-id: ENC(imENTO7M8bLO38LFSIxnzw==)\n client-secret: ENC(i3cDFhs26sa2Ucrfz2hnQw==)\n scope: server\n\n# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '5041ac486e18aa0dd0bf624bb83806de', '2019-11-29 16:52:32', '2021-09-11 14:19:55', '', '127.0.0.1', '', '', '统一权限', 'null', 'null', 'yaml', 'null');
|
INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', 'security:\n oauth2:\n client:\n client-id: ENC(imENTO7M8bLO38LFSIxnzw==)\n client-secret: ENC(i3cDFhs26sa2Ucrfz2hnQw==)\n scope: server\n\n# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '107614b40932e8237787b769e0937ed2', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, '');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -49,140 +50,190 @@ COMMIT;
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `config_info_aggr`;
|
DROP TABLE IF EXISTS `config_info_aggr`;
|
||||||
CREATE TABLE `config_info_aggr` (
|
CREATE TABLE `config_info_aggr` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
||||||
`group_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
`group_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
||||||
`datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',
|
`datum_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'datum_id',
|
||||||
`content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',
|
`content` longtext COLLATE utf8_bin NOT NULL COMMENT '内容',
|
||||||
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
|
||||||
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
|
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
|
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of config_info_aggr
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for config_info_beta
|
-- Table structure for config_info_beta
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `config_info_beta`;
|
DROP TABLE IF EXISTS `config_info_beta`;
|
||||||
CREATE TABLE `config_info_beta` (
|
CREATE TABLE `config_info_beta` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
||||||
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
||||||
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
||||||
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
||||||
`beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',
|
`beta_ips` varchar(1024) COLLATE utf8_bin DEFAULT NULL COMMENT 'betaIps',
|
||||||
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
||||||
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
||||||
PRIMARY KEY (`id`),
|
`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
|
||||||
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of config_info_beta
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for config_info_tag
|
-- Table structure for config_info_tag
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `config_info_tag`;
|
DROP TABLE IF EXISTS `config_info_tag`;
|
||||||
CREATE TABLE `config_info_tag` (
|
CREATE TABLE `config_info_tag` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
||||||
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
||||||
`tag_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_id',
|
`tag_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_id',
|
||||||
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
||||||
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
`content` longtext COLLATE utf8_bin NOT NULL COMMENT 'content',
|
||||||
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'md5',
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
`src_user` text COLLATE utf8_bin COMMENT 'source user',
|
||||||
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT 'source ip',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
|
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of config_info_tag
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for config_tags_relation
|
-- Table structure for config_tags_relation
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `config_tags_relation`;
|
DROP TABLE IF EXISTS `config_tags_relation`;
|
||||||
CREATE TABLE `config_tags_relation` (
|
CREATE TABLE `config_tags_relation` (
|
||||||
`id` bigint(20) NOT NULL COMMENT 'id',
|
`id` bigint NOT NULL COMMENT 'id',
|
||||||
`tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',
|
`tag_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'tag_name',
|
||||||
`tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',
|
`tag_type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'tag_type',
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'data_id',
|
||||||
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
`group_id` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'group_id',
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
||||||
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
|
`nid` bigint NOT NULL AUTO_INCREMENT,
|
||||||
PRIMARY KEY (`nid`),
|
PRIMARY KEY (`nid`),
|
||||||
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
|
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
|
||||||
KEY `idx_tenant_id` (`tenant_id`)
|
KEY `idx_tenant_id` (`tenant_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of config_tags_relation
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for group_capacity
|
-- Table structure for group_capacity
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `group_capacity`;
|
DROP TABLE IF EXISTS `group_capacity`;
|
||||||
CREATE TABLE `group_capacity` (
|
CREATE TABLE `group_capacity` (
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
`group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
|
`group_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
|
||||||
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||||
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||||
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||||
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
|
`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
|
||||||
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||||
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
`max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `uk_group_id` (`group_id`)
|
UNIQUE KEY `uk_group_id` (`group_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of group_capacity
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for his_config_info
|
-- Table structure for his_config_info
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `his_config_info`;
|
DROP TABLE IF EXISTS `his_config_info`;
|
||||||
CREATE TABLE `his_config_info` (
|
CREATE TABLE `his_config_info` (
|
||||||
`id` bigint(64) unsigned NOT NULL,
|
`id` bigint unsigned NOT NULL,
|
||||||
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
`nid` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||||
`data_id` varchar(255) COLLATE utf8_bin NOT NULL,
|
`data_id` varchar(255) COLLATE utf8_bin NOT NULL,
|
||||||
`group_id` varchar(128) COLLATE utf8_bin NOT NULL,
|
`group_id` varchar(128) COLLATE utf8_bin NOT NULL,
|
||||||
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
`app_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT 'app_name',
|
||||||
`content` longtext COLLATE utf8_bin NOT NULL,
|
`content` longtext COLLATE utf8_bin NOT NULL,
|
||||||
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,
|
`md5` varchar(32) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`src_user` text COLLATE utf8_bin,
|
`src_user` text COLLATE utf8_bin,
|
||||||
`src_ip` varchar(20) COLLATE utf8_bin DEFAULT NULL,
|
`src_ip` varchar(50) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`op_type` char(10) COLLATE utf8_bin DEFAULT NULL,
|
`op_type` char(10) COLLATE utf8_bin DEFAULT NULL,
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT '租户字段',
|
||||||
PRIMARY KEY (`nid`),
|
`encrypted_data_key` text COLLATE utf8_bin NOT NULL COMMENT '秘钥',
|
||||||
KEY `idx_gmt_create` (`gmt_create`),
|
PRIMARY KEY (`nid`),
|
||||||
KEY `idx_gmt_modified` (`gmt_modified`),
|
KEY `idx_gmt_create` (`gmt_create`),
|
||||||
KEY `idx_did` (`data_id`)
|
KEY `idx_gmt_modified` (`gmt_modified`),
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
|
KEY `idx_did` (`data_id`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of his_config_info
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 1, 'application-dev.yml', 'DEFAULT_GROUP', '', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n\n# Spring 相关\n\nspring:\n mvc:\n pathmatch:\n matching-strategy: ant_path_matcher\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# spring security 配置\nsecurity:\n oauth2:\n resource:\n loadBalanced: true\n token-info-uri: http://pig-auth/oauth/check_token\n # 通用放行URL,服务个性化,请在对应配置文件覆盖\n ignore:\n urls:\n - /v3/api-docs\n - /actuator/**\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth/token\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '8d9ffc03cef9e316905d4f86d1914e6b', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', 'd92c284f687ae64ac9661f6313994545', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(27v1agvAug87ANOVnbKdsw==)\n client-secret: ENC(VbnkopxrwgbFVKp+UxJ2pg==)\n scope: server\n\n# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n\n# 直接放行URL\nignore:\n urls:\n - /v2/api-docs\n - /actuator/**\n', '02fe9e81c41986626067b8cbe589b77f', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', '', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # demo模块\n - id: pig-demo\n uri: lb://demo-biz\n predicates:\n - Path=/demo/**\n - id: openapi\n uri: http://localhost:${server.port}\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test', 'dbf00e83f80de7f011d244ea1ce5686e', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', '', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
INSERT INTO `his_config_info` VALUES (0, 6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '', 'security:\n oauth2:\n client:\n client-id: ENC(imENTO7M8bLO38LFSIxnzw==)\n client-secret: ENC(i3cDFhs26sa2Ucrfz2hnQw==)\n scope: server\n\n# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '107614b40932e8237787b769e0937ed2', '2022-05-08 12:10:36', '2022-05-08 12:10:37', NULL, '127.0.0.1', 'I', '', '');
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for permissions
|
-- Table structure for permissions
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `permissions`;
|
DROP TABLE IF EXISTS `permissions`;
|
||||||
CREATE TABLE `permissions` (
|
CREATE TABLE `permissions` (
|
||||||
`role` varchar(50) NOT NULL,
|
`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`resource` varchar(512) NOT NULL,
|
`resource` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`action` varchar(8) NOT NULL,
|
`action` varchar(8) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`)
|
UNIQUE KEY `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of permissions
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for roles
|
-- Table structure for roles
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `roles`;
|
DROP TABLE IF EXISTS `roles`;
|
||||||
CREATE TABLE `roles` (
|
CREATE TABLE `roles` (
|
||||||
`username` varchar(50) NOT NULL,
|
`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`role` varchar(50) NOT NULL,
|
`role` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
UNIQUE KEY `uk_username_role` (`username`,`role`)
|
UNIQUE KEY `idx_user_role` (`username`,`role`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of roles
|
-- Records of roles
|
||||||
@ -196,64 +247,60 @@ COMMIT;
|
|||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `tenant_capacity`;
|
DROP TABLE IF EXISTS `tenant_capacity`;
|
||||||
CREATE TABLE `tenant_capacity` (
|
CREATE TABLE `tenant_capacity` (
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',
|
`tenant_id` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',
|
||||||
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
`quota` int unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||||
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
`usage` int unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||||
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
`max_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||||
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
|
`max_aggr_count` int unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
|
||||||
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
`max_aggr_size` int unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||||
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
`max_history_count` int unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||||
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
|
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
|
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
|
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of tenant_capacity
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for tenant_info
|
-- Table structure for tenant_info
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `tenant_info`;
|
DROP TABLE IF EXISTS `tenant_info`;
|
||||||
CREATE TABLE `tenant_info` (
|
CREATE TABLE `tenant_info` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||||
`kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',
|
`kp` varchar(128) COLLATE utf8_bin NOT NULL COMMENT 'kp',
|
||||||
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
`tenant_id` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_id',
|
||||||
`tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',
|
`tenant_name` varchar(128) COLLATE utf8_bin DEFAULT '' COMMENT 'tenant_name',
|
||||||
`tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',
|
`tenant_desc` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT 'tenant_desc',
|
||||||
`create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',
|
`create_source` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT 'create_source',
|
||||||
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
|
`gmt_create` bigint NOT NULL COMMENT '创建时间',
|
||||||
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
|
`gmt_modified` bigint NOT NULL COMMENT '修改时间',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
|
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
|
||||||
KEY `idx_tenant_id` (`tenant_id`)
|
KEY `idx_tenant_id` (`tenant_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of tenant_info
|
||||||
|
-- ----------------------------
|
||||||
|
BEGIN;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for users
|
-- Table structure for users
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
DROP TABLE IF EXISTS `users`;
|
DROP TABLE IF EXISTS `users`;
|
||||||
CREATE TABLE `users` (
|
CREATE TABLE `users` (
|
||||||
`username` varchar(50) NOT NULL,
|
`username` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`password` varchar(500) NOT NULL,
|
`password` varchar(500) COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`enabled` tinyint(1) NOT NULL,
|
`enabled` tinyint(1) NOT NULL,
|
||||||
PRIMARY KEY (`username`)
|
PRIMARY KEY (`username`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of users
|
-- Records of users
|
||||||
|
@ -4,6 +4,7 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ./db
|
context: ./db
|
||||||
environment:
|
environment:
|
||||||
|
MYSQL_ROOT_HOST: "%"
|
||||||
MYSQL_ROOT_PASSWORD: root
|
MYSQL_ROOT_PASSWORD: root
|
||||||
restart: always
|
restart: always
|
||||||
container_name: pig-mysql
|
container_name: pig-mysql
|
||||||
@ -12,7 +13,7 @@ services:
|
|||||||
- 3306:3306
|
- 3306:3306
|
||||||
|
|
||||||
pig-redis:
|
pig-redis:
|
||||||
image: redis:6.2.6
|
image: redis:7.0.0
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
restart: always
|
restart: always
|
||||||
|
@ -27,12 +27,12 @@
|
|||||||
<description>nacos 注册配置中心</description>
|
<description>nacos 注册配置中心</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<nacos.version>2.0.4.RELEASE</nacos.version>
|
<nacos.version>2.1.0</nacos.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.pig4cloud.nacos</groupId>
|
<groupId>io.springboot.nacos</groupId>
|
||||||
<artifactId>nacos-config</artifactId>
|
<artifactId>nacos-config</artifactId>
|
||||||
<version>${nacos.version}</version>
|
<version>${nacos.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -42,16 +42,23 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.pig4cloud.nacos</groupId>
|
<groupId>io.springboot.nacos</groupId>
|
||||||
<artifactId>nacos-naming</artifactId>
|
<artifactId>nacos-naming</artifactId>
|
||||||
<version>${nacos.version}</version>
|
<version>${nacos.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.pig4cloud.nacos</groupId>
|
<groupId>io.springboot.nacos</groupId>
|
||||||
<artifactId>nacos-istio</artifactId>
|
<artifactId>nacos-istio</artifactId>
|
||||||
<version>${nacos.version}</version>
|
<version>${nacos.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.springboot.nacos</groupId>
|
||||||
|
<artifactId>nacos-plugin-default-impl</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-security</artifactId>
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
package com.alibaba.nacos.console.controller;
|
||||||
|
|
||||||
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
||||||
import com.alibaba.nacos.naming.controllers.OperatorController;
|
import com.alibaba.nacos.naming.controllers.OperatorController;
|
@ -14,24 +14,28 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
package com.alibaba.nacos.console.controller;
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.annotation.Secured;
|
import com.alibaba.nacos.auth.annotation.Secured;
|
||||||
import com.alibaba.nacos.auth.common.ActionTypes;
|
|
||||||
import com.alibaba.nacos.common.model.RestResult;
|
import com.alibaba.nacos.common.model.RestResult;
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
import com.alibaba.nacos.common.model.RestResultUtils;
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
import com.alibaba.nacos.common.utils.StringUtils;
|
||||||
import com.alibaba.nacos.config.server.model.TenantInfo;
|
import com.alibaba.nacos.config.server.model.TenantInfo;
|
||||||
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
||||||
import com.alibaba.nacos.enums.NamespaceTypeEnum;
|
import com.alibaba.nacos.console.enums.NamespaceTypeEnum;
|
||||||
import com.alibaba.nacos.model.Namespace;
|
import com.alibaba.nacos.console.model.Namespace;
|
||||||
import com.alibaba.nacos.model.NamespaceAllInfo;
|
import com.alibaba.nacos.console.model.NamespaceAllInfo;
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
|
||||||
|
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -69,22 +73,20 @@ public class NamespaceController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get namespace list.
|
* Get namespace list.
|
||||||
* @param request request
|
|
||||||
* @param response response
|
|
||||||
* @return namespace list
|
* @return namespace list
|
||||||
*/
|
*/
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public RestResult<List<Namespace>> getNamespaces(HttpServletRequest request, HttpServletResponse response) {
|
public RestResult<List<Namespace>> getNamespaces() {
|
||||||
// TODO 获取用kp
|
// TODO 获取用kp
|
||||||
List<TenantInfo> tenantInfos = persistService.findTenantByKp(DEFAULT_KP);
|
List<TenantInfo> tenantInfos = persistService.findTenantByKp(DEFAULT_KP);
|
||||||
Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
|
Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
|
||||||
persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
|
persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
|
||||||
List<Namespace> namespaces = new ArrayList<Namespace>();
|
List<Namespace> namespaces = new ArrayList<>();
|
||||||
namespaces.add(namespace0);
|
namespaces.add(namespace0);
|
||||||
for (TenantInfo tenantInfo : tenantInfos) {
|
for (TenantInfo tenantInfo : tenantInfos) {
|
||||||
int configCount = persistService.configInfoCount(tenantInfo.getTenantId());
|
int configCount = persistService.configInfoCount(tenantInfo.getTenantId());
|
||||||
Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(), DEFAULT_QUOTA,
|
Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(),
|
||||||
configCount, NamespaceTypeEnum.CUSTOM.getType());
|
tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType());
|
||||||
namespaces.add(namespaceTmp);
|
namespaces.add(namespaceTmp);
|
||||||
}
|
}
|
||||||
return RestResultUtils.success(namespaces);
|
return RestResultUtils.success(namespaces);
|
||||||
@ -92,14 +94,11 @@ public class NamespaceController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* get namespace all info by namespace id.
|
* get namespace all info by namespace id.
|
||||||
* @param request request
|
|
||||||
* @param response response
|
|
||||||
* @param namespaceId namespaceId
|
* @param namespaceId namespaceId
|
||||||
* @return namespace all info
|
* @return namespace all info
|
||||||
*/
|
*/
|
||||||
@GetMapping(params = "show=all")
|
@GetMapping(params = "show=all")
|
||||||
public NamespaceAllInfo getNamespace(HttpServletRequest request, HttpServletResponse response,
|
public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) {
|
||||||
@RequestParam("namespaceId") String namespaceId) {
|
|
||||||
// TODO 获取用kp
|
// TODO 获取用kp
|
||||||
if (StringUtils.isBlank(namespaceId)) {
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
|
return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
|
||||||
@ -116,16 +115,14 @@ public class NamespaceController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* create namespace.
|
* create namespace.
|
||||||
* @param request request
|
|
||||||
* @param response response
|
|
||||||
* @param namespaceName namespace Name
|
* @param namespaceName namespace Name
|
||||||
* @param namespaceDesc namespace Desc
|
* @param namespaceDesc namespace Desc
|
||||||
* @return whether create ok
|
* @return whether create ok
|
||||||
*/
|
*/
|
||||||
@PostMapping
|
@PostMapping
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
||||||
public Boolean createNamespace(HttpServletRequest request, HttpServletResponse response,
|
public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId,
|
||||||
@RequestParam("customNamespaceId") String namespaceId, @RequestParam("namespaceName") String namespaceName,
|
@RequestParam("namespaceName") String namespaceName,
|
||||||
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
||||||
// TODO 获取用kp
|
// TODO 获取用kp
|
||||||
if (StringUtils.isBlank(namespaceId)) {
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
@ -169,7 +166,7 @@ public class NamespaceController {
|
|||||||
* @return whether edit ok
|
* @return whether edit ok
|
||||||
*/
|
*/
|
||||||
@PutMapping
|
@PutMapping
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
||||||
public Boolean editNamespace(@RequestParam("namespace") String namespace,
|
public Boolean editNamespace(@RequestParam("namespace") String namespace,
|
||||||
@RequestParam("namespaceShowName") String namespaceShowName,
|
@RequestParam("namespaceShowName") String namespaceShowName,
|
||||||
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
||||||
@ -180,15 +177,12 @@ public class NamespaceController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* del namespace by id.
|
* del namespace by id.
|
||||||
* @param request request
|
|
||||||
* @param response response
|
|
||||||
* @param namespaceId namespace Id
|
* @param namespaceId namespace Id
|
||||||
* @return whether del ok
|
* @return whether del ok
|
||||||
*/
|
*/
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
||||||
public Boolean deleteConfig(HttpServletRequest request, HttpServletResponse response,
|
public Boolean deleteConfig(@RequestParam("namespaceId") String namespaceId) {
|
||||||
@RequestParam("namespaceId") String namespaceId) {
|
|
||||||
persistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
|
persistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
package com.alibaba.nacos.console.controller;
|
||||||
|
|
||||||
import com.alibaba.nacos.common.utils.VersionUtils;
|
import com.alibaba.nacos.common.utils.VersionUtils;
|
||||||
import com.alibaba.nacos.sys.env.EnvUtil;
|
import com.alibaba.nacos.sys.env.EnvUtil;
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.enums;
|
package com.alibaba.nacos.console.enums;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the enum of namespace. 0 : Global configuration, 1 : Default private namespace ,2 :
|
* the enum of namespace. 0 : Global configuration, 1 : Default private namespace ,2 :
|
@ -14,10 +14,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.exception;
|
package com.alibaba.nacos.console.exception;
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.exception.AccessException;
|
import com.alibaba.nacos.plugin.auth.exception.AccessException;
|
||||||
|
import com.alibaba.nacos.common.model.RestResultUtils;
|
||||||
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
||||||
|
import com.alibaba.nacos.core.utils.Commons;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
@ -25,6 +27,8 @@ import org.springframework.http.ResponseEntity;
|
|||||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception handler for console module.
|
* Exception handler for console module.
|
||||||
*
|
*
|
||||||
@ -47,8 +51,13 @@ public class ConsoleExceptionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(Exception.class)
|
@ExceptionHandler(Exception.class)
|
||||||
private ResponseEntity<String> handleException(Exception e) {
|
private ResponseEntity<Object> handleException(HttpServletRequest request, Exception e) {
|
||||||
LOGGER.error("CONSOLE", e);
|
String uri = request.getRequestURI();
|
||||||
|
LOGGER.error("CONSOLE {}", uri, e);
|
||||||
|
if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) {
|
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
.body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e)));
|
||||||
|
}
|
||||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e));
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e));
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.console.filter;
|
||||||
|
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XSS filter.
|
||||||
|
*
|
||||||
|
* @author onewe
|
||||||
|
*/
|
||||||
|
public class XssFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
private static final String CONTENT_SECURITY_POLICY_HEADER = "Content-Security-Policy";
|
||||||
|
|
||||||
|
private static final String CONTENT_SECURITY_POLICY = "script-src 'self'";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
response.setHeader(CONTENT_SECURITY_POLICY_HEADER, CONTENT_SECURITY_POLICY);
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.model;
|
package com.alibaba.nacos.console.model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Namespace.
|
* Namespace.
|
||||||
@ -27,6 +27,8 @@ public class Namespace {
|
|||||||
|
|
||||||
private String namespaceShowName;
|
private String namespaceShowName;
|
||||||
|
|
||||||
|
private String namespaceDesc;
|
||||||
|
|
||||||
private int quota;
|
private int quota;
|
||||||
|
|
||||||
private int configCount;
|
private int configCount;
|
||||||
@ -68,6 +70,24 @@ public class Namespace {
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Namespace(String namespace, String namespaceShowName, String namespaceDesc, int quota, int configCount,
|
||||||
|
int type) {
|
||||||
|
this.namespace = namespace;
|
||||||
|
this.namespaceShowName = namespaceShowName;
|
||||||
|
this.quota = quota;
|
||||||
|
this.configCount = configCount;
|
||||||
|
this.type = type;
|
||||||
|
this.namespaceDesc = namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespaceDesc() {
|
||||||
|
return namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceDesc(String namespaceDesc) {
|
||||||
|
this.namespaceDesc = namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
public int getQuota() {
|
public int getQuota() {
|
||||||
return quota;
|
return quota;
|
||||||
}
|
}
|
@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.alibaba.nacos.model;
|
package com.alibaba.nacos.console.model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* all namespace info.
|
* all namespace info.
|
||||||
@ -23,23 +23,9 @@ package com.alibaba.nacos.model;
|
|||||||
*/
|
*/
|
||||||
public class NamespaceAllInfo extends Namespace {
|
public class NamespaceAllInfo extends Namespace {
|
||||||
|
|
||||||
private String namespaceDesc;
|
|
||||||
|
|
||||||
public String getNamespaceDesc() {
|
|
||||||
return namespaceDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNamespaceDesc(String namespaceDesc) {
|
|
||||||
this.namespaceDesc = namespaceDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public NamespaceAllInfo() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type,
|
public NamespaceAllInfo(String namespace, String namespaceShowName, int quota, int configCount, int type,
|
||||||
String namespaceDesc) {
|
String namespaceDesc) {
|
||||||
super(namespace, namespaceShowName, quota, configCount, type);
|
super(namespace, namespaceShowName, namespaceDesc, quota, configCount, type);
|
||||||
this.namespaceDesc = namespaceDesc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.annotation.Secured;
|
|
||||||
import com.alibaba.nacos.auth.common.ActionTypes;
|
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
|
||||||
import com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Permission operation controller.
|
|
||||||
*
|
|
||||||
* @author nkorange
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/v1/auth/permissions")
|
|
||||||
public class PermissionController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosRoleServiceImpl nacosRoleService;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query permissions of a role.
|
|
||||||
* @param role the role
|
|
||||||
* @param pageNo page index
|
|
||||||
* @param pageSize page size
|
|
||||||
* @return permission of a role
|
|
||||||
*/
|
|
||||||
@GetMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "permissions", action = ActionTypes.READ)
|
|
||||||
public Object getPermissions(@RequestParam int pageNo, @RequestParam int pageSize,
|
|
||||||
@RequestParam(name = "role", defaultValue = StringUtils.EMPTY) String role) {
|
|
||||||
return nacosRoleService.getPermissionsFromDatabase(role, pageNo, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a permission to a role.
|
|
||||||
* @param role the role
|
|
||||||
* @param resource the related resource
|
|
||||||
* @param action the related action
|
|
||||||
* @return ok if succeed
|
|
||||||
*/
|
|
||||||
@PostMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "permissions", action = ActionTypes.WRITE)
|
|
||||||
public Object addPermission(@RequestParam String role, @RequestParam String resource, @RequestParam String action) {
|
|
||||||
nacosRoleService.addPermission(role, resource, action);
|
|
||||||
return RestResultUtils.success("add permission ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a permission from a role.
|
|
||||||
* @param role the role
|
|
||||||
* @param resource the related resource
|
|
||||||
* @param action the related action
|
|
||||||
* @return ok if succeed
|
|
||||||
*/
|
|
||||||
@DeleteMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "permissions", action = ActionTypes.WRITE)
|
|
||||||
public Object deletePermission(@RequestParam String role, @RequestParam String resource,
|
|
||||||
@RequestParam String action) {
|
|
||||||
nacosRoleService.deletePermission(role, resource, action);
|
|
||||||
return RestResultUtils.success("delete permission ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.annotation.Secured;
|
|
||||||
import com.alibaba.nacos.auth.common.ActionTypes;
|
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
|
||||||
import com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Role operation controller.
|
|
||||||
*
|
|
||||||
* @author nkorange
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/v1/auth/roles")
|
|
||||||
public class RoleController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosRoleServiceImpl roleService;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get roles list.
|
|
||||||
* @param pageNo number index of page
|
|
||||||
* @param pageSize page size
|
|
||||||
* @param username optional, username of user
|
|
||||||
* @return role list
|
|
||||||
*/
|
|
||||||
@GetMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "roles", action = ActionTypes.READ)
|
|
||||||
public Object getRoles(@RequestParam int pageNo, @RequestParam int pageSize,
|
|
||||||
@RequestParam(name = "username", defaultValue = "") String username) {
|
|
||||||
return roleService.getRolesFromDatabase(username, pageNo, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fuzzy matching role name .
|
|
||||||
* @param role role id
|
|
||||||
* @return role list
|
|
||||||
*/
|
|
||||||
@GetMapping("/search")
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "roles", action = ActionTypes.READ)
|
|
||||||
public List<String> searchRoles(@RequestParam String role) {
|
|
||||||
return roleService.findRolesLikeRoleName(role);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a role to a user
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* This method is used for 2 functions: 1. create a role and bind it to GLOBAL_ADMIN.
|
|
||||||
* 2. bind a role to an user.
|
|
||||||
* @param role role name
|
|
||||||
* @param username username
|
|
||||||
* @return Code 200 and message 'add role ok!'
|
|
||||||
*/
|
|
||||||
@PostMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "roles", action = ActionTypes.WRITE)
|
|
||||||
public Object addRole(@RequestParam String role, @RequestParam String username) {
|
|
||||||
roleService.addRole(role, username);
|
|
||||||
return RestResultUtils.success("add role ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a role. If no username is specified, all users under this role are deleted.
|
|
||||||
* @param role role
|
|
||||||
* @param username username
|
|
||||||
* @return ok if succeed
|
|
||||||
*/
|
|
||||||
@DeleteMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "roles", action = ActionTypes.WRITE)
|
|
||||||
public Object deleteRole(@RequestParam String role,
|
|
||||||
@RequestParam(name = "username", defaultValue = StringUtils.EMPTY) String username) {
|
|
||||||
if (StringUtils.isBlank(username)) {
|
|
||||||
roleService.deleteRole(role);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
roleService.deleteRole(role, username);
|
|
||||||
}
|
|
||||||
return RestResultUtils.success("delete role of user " + username + " ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,275 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.controller;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.api.common.Constants;
|
|
||||||
import com.alibaba.nacos.auth.annotation.Secured;
|
|
||||||
import com.alibaba.nacos.auth.common.ActionTypes;
|
|
||||||
import com.alibaba.nacos.auth.common.AuthConfigs;
|
|
||||||
import com.alibaba.nacos.auth.common.AuthSystemTypes;
|
|
||||||
import com.alibaba.nacos.auth.exception.AccessException;
|
|
||||||
import com.alibaba.nacos.common.model.RestResult;
|
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
|
||||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
|
||||||
import com.alibaba.nacos.config.server.auth.RoleInfo;
|
|
||||||
import com.alibaba.nacos.config.server.model.User;
|
|
||||||
import com.alibaba.nacos.config.server.utils.RequestUtil;
|
|
||||||
import com.alibaba.nacos.security.nacos.JwtTokenManager;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthManager;
|
|
||||||
import com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUser;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetailsServiceImpl;
|
|
||||||
import com.alibaba.nacos.utils.PasswordEncoderUtil;
|
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
|
||||||
import org.springframework.security.authentication.BadCredentialsException;
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User related methods entry.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
* @author nkorange
|
|
||||||
*/
|
|
||||||
@RestController("user")
|
|
||||||
@RequestMapping({ "/v1/auth", "/v1/auth/users" })
|
|
||||||
public class UserController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private JwtTokenManager jwtTokenManager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthenticationManager authenticationManager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosUserDetailsServiceImpl userDetailsService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosRoleServiceImpl roleService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthConfigs authConfigs;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosAuthManager authManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new user.
|
|
||||||
* @param username username
|
|
||||||
* @param password password
|
|
||||||
* @return ok if create succeed
|
|
||||||
* @throws IllegalArgumentException if user already exist
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "users", action = ActionTypes.WRITE)
|
|
||||||
@PostMapping
|
|
||||||
public Object createUser(@RequestParam String username, @RequestParam String password) {
|
|
||||||
|
|
||||||
User user = userDetailsService.getUserFromDatabase(username);
|
|
||||||
if (user != null) {
|
|
||||||
throw new IllegalArgumentException("user '" + username + "' already exist!");
|
|
||||||
}
|
|
||||||
userDetailsService.createUser(username, PasswordEncoderUtil.encode(password));
|
|
||||||
return RestResultUtils.success("create user ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete an existed user.
|
|
||||||
* @param username username of user
|
|
||||||
* @return ok if deleted succeed, keep silent if user not exist
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@DeleteMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "users", action = ActionTypes.WRITE)
|
|
||||||
public Object deleteUser(@RequestParam String username) {
|
|
||||||
List<RoleInfo> roleInfoList = roleService.getRoles(username);
|
|
||||||
if (roleInfoList != null) {
|
|
||||||
for (RoleInfo roleInfo : roleInfoList) {
|
|
||||||
if (roleInfo.getRole().equals(NacosRoleServiceImpl.GLOBAL_ADMIN_ROLE)) {
|
|
||||||
throw new IllegalArgumentException("cannot delete admin: " + username);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
userDetailsService.deleteUser(username);
|
|
||||||
return RestResultUtils.success("delete user ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update an user.
|
|
||||||
* @param username username of user
|
|
||||||
* @param newPassword new password of user
|
|
||||||
* @param response http response
|
|
||||||
* @param request http request
|
|
||||||
* @return ok if update succeed
|
|
||||||
* @throws IllegalArgumentException if user not exist or oldPassword is incorrect
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@PutMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.UPDATE_PASSWORD_ENTRY_POINT, action = ActionTypes.WRITE)
|
|
||||||
public Object updateUser(@RequestParam String username, @RequestParam String newPassword,
|
|
||||||
HttpServletResponse response, HttpServletRequest request) throws IOException {
|
|
||||||
// admin or same user
|
|
||||||
if (!hasPermission(username, request)) {
|
|
||||||
response.sendError(HttpServletResponse.SC_FORBIDDEN, "authorization failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
User user = userDetailsService.getUserFromDatabase(username);
|
|
||||||
if (user == null) {
|
|
||||||
throw new IllegalArgumentException("user " + username + " not exist!");
|
|
||||||
}
|
|
||||||
|
|
||||||
userDetailsService.updateUserPassword(username, PasswordEncoderUtil.encode(newPassword));
|
|
||||||
|
|
||||||
return RestResultUtils.success("update user ok!");
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasPermission(String username, HttpServletRequest request) {
|
|
||||||
if (!authConfigs.isAuthEnabled()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (Objects.isNull(request.getAttribute(RequestUtil.NACOS_USER_KEY))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
NacosUser user = (NacosUser) request.getAttribute(RequestUtil.NACOS_USER_KEY);
|
|
||||||
// admin
|
|
||||||
if (user.isGlobalAdmin()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// same user
|
|
||||||
return user.getUserName().equals(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get paged users.
|
|
||||||
* @param pageNo number index of page
|
|
||||||
* @param pageSize size of page
|
|
||||||
* @return A collection of users, empty set if no user is found
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@GetMapping
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "users", action = ActionTypes.READ)
|
|
||||||
public Object getUsers(@RequestParam int pageNo, @RequestParam int pageSize) {
|
|
||||||
return userDetailsService.getUsersFromDatabase(pageNo, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Login to Nacos
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* This methods uses username and password to require a new token.
|
|
||||||
* @param username username of user
|
|
||||||
* @param password password
|
|
||||||
* @param response http response
|
|
||||||
* @param request http request
|
|
||||||
* @return new token of the user
|
|
||||||
* @throws AccessException if user info is incorrect
|
|
||||||
*/
|
|
||||||
@PostMapping("/login")
|
|
||||||
public Object login(@RequestParam String username, @RequestParam String password, HttpServletResponse response,
|
|
||||||
HttpServletRequest request) throws AccessException {
|
|
||||||
|
|
||||||
if (AuthSystemTypes.NACOS.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())
|
|
||||||
|| AuthSystemTypes.LDAP.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
NacosUser user = (NacosUser) authManager.login(request);
|
|
||||||
|
|
||||||
response.addHeader(NacosAuthConfig.AUTHORIZATION_HEADER, NacosAuthConfig.TOKEN_PREFIX + user.getToken());
|
|
||||||
|
|
||||||
ObjectNode result = JacksonUtils.createEmptyJsonNode();
|
|
||||||
result.put(Constants.ACCESS_TOKEN, user.getToken());
|
|
||||||
result.put(Constants.TOKEN_TTL, authConfigs.getTokenValidityInSeconds());
|
|
||||||
result.put(Constants.GLOBAL_ADMIN, user.isGlobalAdmin());
|
|
||||||
result.put(Constants.USERNAME, user.getUserName());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create Authentication class through username and password, the implement class
|
|
||||||
// is UsernamePasswordAuthenticationToken
|
|
||||||
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username,
|
|
||||||
password);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// use the method authenticate of AuthenticationManager(default implement is
|
|
||||||
// ProviderManager) to valid Authentication
|
|
||||||
Authentication authentication = authenticationManager.authenticate(authenticationToken);
|
|
||||||
// bind SecurityContext to Authentication
|
|
||||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
||||||
// generate Token
|
|
||||||
String token = jwtTokenManager.createToken(authentication);
|
|
||||||
// write Token to Http header
|
|
||||||
response.addHeader(NacosAuthConfig.AUTHORIZATION_HEADER, "Bearer " + token);
|
|
||||||
return RestResultUtils.success("Bearer " + token);
|
|
||||||
}
|
|
||||||
catch (BadCredentialsException authentication) {
|
|
||||||
return RestResultUtils.failed(HttpStatus.UNAUTHORIZED.value(), null, "Login failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update password.
|
|
||||||
* @param oldPassword old password
|
|
||||||
* @param newPassword new password
|
|
||||||
* @return Code 200 if update successfully, Code 401 if old password invalid,
|
|
||||||
* otherwise 500
|
|
||||||
*/
|
|
||||||
@PutMapping("/password")
|
|
||||||
@Deprecated
|
|
||||||
public RestResult<String> updatePassword(@RequestParam(value = "oldPassword") String oldPassword,
|
|
||||||
@RequestParam(value = "newPassword") String newPassword) {
|
|
||||||
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
|
|
||||||
String username = ((UserDetails) principal).getUsername();
|
|
||||||
User user = userDetailsService.getUserFromDatabase(username);
|
|
||||||
String password = user.getPassword();
|
|
||||||
|
|
||||||
// TODO: throw out more fine grained exceptions
|
|
||||||
try {
|
|
||||||
if (PasswordEncoderUtil.matches(oldPassword, password)) {
|
|
||||||
userDetailsService.updateUserPassword(username, PasswordEncoderUtil.encode(newPassword));
|
|
||||||
return RestResultUtils.success("Update password success");
|
|
||||||
}
|
|
||||||
return RestResultUtils.failed(HttpStatus.UNAUTHORIZED.value(), "Old password is invalid");
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
return RestResultUtils.failed(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Update userpassword failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fuzzy matching username.
|
|
||||||
* @param username username
|
|
||||||
* @return Matched username
|
|
||||||
*/
|
|
||||||
@GetMapping("/search")
|
|
||||||
@Secured(resource = NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX + "users", action = ActionTypes.WRITE)
|
|
||||||
public List<String> searchUsersLikeUsername(@RequestParam String username) {
|
|
||||||
return userDetailsService.findUserLikeUsername(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.filter;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.api.common.Constants;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.security.nacos.JwtTokenManager;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
|
||||||
|
|
||||||
import javax.servlet.FilterChain;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* jwt auth token filter.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
*/
|
|
||||||
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
|
|
||||||
|
|
||||||
private static final String TOKEN_PREFIX = "Bearer ";
|
|
||||||
|
|
||||||
private final JwtTokenManager tokenManager;
|
|
||||||
|
|
||||||
public JwtAuthenticationTokenFilter(JwtTokenManager tokenManager) {
|
|
||||||
this.tokenManager = tokenManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
|
|
||||||
throws IOException, ServletException {
|
|
||||||
|
|
||||||
String jwt = resolveToken(request);
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(jwt) && SecurityContextHolder.getContext().getAuthentication() == null) {
|
|
||||||
this.tokenManager.validateToken(jwt);
|
|
||||||
Authentication authentication = this.tokenManager.getAuthentication(jwt);
|
|
||||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
||||||
}
|
|
||||||
chain.doFilter(request, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get token from header.
|
|
||||||
*/
|
|
||||||
private String resolveToken(HttpServletRequest request) {
|
|
||||||
String bearerToken = request.getHeader(NacosAuthConfig.AUTHORIZATION_HEADER);
|
|
||||||
if (StringUtils.isNotBlank(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
|
|
||||||
return bearerToken.substring(TOKEN_PREFIX.length());
|
|
||||||
}
|
|
||||||
String jwt = request.getParameter(Constants.ACCESS_TOKEN);
|
|
||||||
if (StringUtils.isNotBlank(jwt)) {
|
|
||||||
return jwt;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetailsServiceImpl;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.security.authentication.AuthenticationProvider;
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.AuthenticationException;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* auth provider.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class CustomAuthenticationProvider implements AuthenticationProvider {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosUserDetailsServiceImpl userDetailsService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
|
|
||||||
|
|
||||||
String username = (String) authentication.getPrincipal();
|
|
||||||
String password = (String) authentication.getCredentials();
|
|
||||||
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
|
|
||||||
|
|
||||||
if (!password.equals(userDetails.getPassword())) {
|
|
||||||
return new UsernamePasswordAuthenticationToken(username, null, null);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(Class<?> aClass) {
|
|
||||||
return aClass.equals(UsernamePasswordAuthenticationToken.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.security.core.AuthenticationException;
|
|
||||||
import org.springframework.security.web.AuthenticationEntryPoint;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* jwt auth fail point.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
|
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationEntryPoint.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
|
|
||||||
throws IOException, ServletException {
|
|
||||||
LOGGER.error("Responding with unauthorized error. Message:{}, url:{}", e.getMessage(), request.getRequestURI());
|
|
||||||
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.common.AuthConfigs;
|
|
||||||
import io.jsonwebtoken.Claims;
|
|
||||||
import io.jsonwebtoken.Jwts;
|
|
||||||
import io.jsonwebtoken.SignatureAlgorithm;
|
|
||||||
import io.jsonwebtoken.security.Keys;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.GrantedAuthority;
|
|
||||||
import org.springframework.security.core.authority.AuthorityUtils;
|
|
||||||
import org.springframework.security.core.userdetails.User;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JWT token manager.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
* @author nkorange
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class JwtTokenManager {
|
|
||||||
|
|
||||||
private static final String AUTHORITIES_KEY = "auth";
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthConfigs authConfigs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create token.
|
|
||||||
* @param authentication auth info
|
|
||||||
* @return token
|
|
||||||
*/
|
|
||||||
public String createToken(Authentication authentication) {
|
|
||||||
return createToken(authentication.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create token.
|
|
||||||
* @param userName auth info
|
|
||||||
* @return token
|
|
||||||
*/
|
|
||||||
public String createToken(String userName) {
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
|
|
||||||
Date validity;
|
|
||||||
validity = new Date(now + authConfigs.getTokenValidityInSeconds() * 1000L);
|
|
||||||
|
|
||||||
Claims claims = Jwts.claims().setSubject(userName);
|
|
||||||
return Jwts.builder().setClaims(claims).setExpiration(validity)
|
|
||||||
.signWith(Keys.hmacShaKeyFor(authConfigs.getSecretKeyBytes()), SignatureAlgorithm.HS256).compact();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get auth Info.
|
|
||||||
* @param token token
|
|
||||||
* @return auth info
|
|
||||||
*/
|
|
||||||
public Authentication getAuthentication(String token) {
|
|
||||||
Claims claims = Jwts.parserBuilder().setSigningKey(authConfigs.getSecretKeyBytes()).build()
|
|
||||||
.parseClaimsJws(token).getBody();
|
|
||||||
|
|
||||||
List<GrantedAuthority> authorities = AuthorityUtils
|
|
||||||
.commaSeparatedStringToAuthorityList((String) claims.get(AUTHORITIES_KEY));
|
|
||||||
|
|
||||||
User principal = new User(claims.getSubject(), "", authorities);
|
|
||||||
return new UsernamePasswordAuthenticationToken(principal, "", authorities);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* validate token.
|
|
||||||
* @param token token
|
|
||||||
*/
|
|
||||||
public void validateToken(String token) {
|
|
||||||
Jwts.parserBuilder().setSigningKey(authConfigs.getSecretKeyBytes()).build().parseClaimsJws(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.common.utils.CollectionUtils;
|
|
||||||
import com.alibaba.nacos.config.server.auth.RoleInfo;
|
|
||||||
import com.alibaba.nacos.config.server.model.User;
|
|
||||||
import com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetails;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetailsServiceImpl;
|
|
||||||
import com.alibaba.nacos.utils.PasswordEncoderUtil;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.security.authentication.AuthenticationProvider;
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.AuthenticationException;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.naming.CommunicationException;
|
|
||||||
import javax.naming.Context;
|
|
||||||
import javax.naming.directory.DirContext;
|
|
||||||
import javax.naming.ldap.InitialLdapContext;
|
|
||||||
import javax.naming.ldap.LdapContext;
|
|
||||||
import java.util.Hashtable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl.GLOBAL_ADMIN_ROLE;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LDAP auth provider.
|
|
||||||
*
|
|
||||||
* @author zjw
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class LdapAuthenticationProvider implements AuthenticationProvider {
|
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(LdapAuthenticationProvider.class);
|
|
||||||
|
|
||||||
private static final String FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
|
|
||||||
|
|
||||||
private static final String TIMEOUT = "com.sun.jndi.ldap.connect.timeout";
|
|
||||||
|
|
||||||
private static final String DEFAULT_PASSWORD = "nacos";
|
|
||||||
|
|
||||||
private static final String LDAP_PREFIX = "LDAP_";
|
|
||||||
|
|
||||||
private static final String DEFAULT_SECURITY_AUTH = "simple";
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosUserDetailsServiceImpl userDetailsService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosRoleServiceImpl nacosRoleService;
|
|
||||||
|
|
||||||
@Value(("${nacos.core.auth.ldap.url:ldap://localhost:389}"))
|
|
||||||
private String ldapUrl;
|
|
||||||
|
|
||||||
@Value(("${nacos.core.auth.ldap.timeout:3000}"))
|
|
||||||
private String time;
|
|
||||||
|
|
||||||
@Value(("${nacos.core.auth.ldap.userdn:cn={0},ou=user,dc=company,dc=com}"))
|
|
||||||
private String userNamePattern;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
|
|
||||||
String username = (String) authentication.getPrincipal();
|
|
||||||
String password = (String) authentication.getCredentials();
|
|
||||||
|
|
||||||
if (isAdmin(username)) {
|
|
||||||
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
|
|
||||||
if (PasswordEncoderUtil.matches(password, userDetails.getPassword())) {
|
|
||||||
return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ldapLogin(username, password)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
UserDetails userDetails;
|
|
||||||
try {
|
|
||||||
userDetails = userDetailsService.loadUserByUsername(LDAP_PREFIX + username);
|
|
||||||
}
|
|
||||||
catch (UsernameNotFoundException exception) {
|
|
||||||
String nacosPassword = PasswordEncoderUtil.encode(DEFAULT_PASSWORD);
|
|
||||||
userDetailsService.createUser(LDAP_PREFIX + username, nacosPassword);
|
|
||||||
User user = new User();
|
|
||||||
user.setUsername(LDAP_PREFIX + username);
|
|
||||||
user.setPassword(nacosPassword);
|
|
||||||
userDetails = new NacosUserDetails(user);
|
|
||||||
}
|
|
||||||
return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isAdmin(String username) {
|
|
||||||
List<RoleInfo> roleInfos = nacosRoleService.getRoles(username);
|
|
||||||
if (CollectionUtils.isEmpty(roleInfos)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (RoleInfo roleinfo : roleInfos) {
|
|
||||||
if (GLOBAL_ADMIN_ROLE.equals(roleinfo.getRole())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean ldapLogin(String username, String password) throws AuthenticationException {
|
|
||||||
Hashtable<String, String> env = new Hashtable<>();
|
|
||||||
env.put(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
|
|
||||||
env.put(Context.PROVIDER_URL, ldapUrl);
|
|
||||||
env.put(Context.SECURITY_AUTHENTICATION, DEFAULT_SECURITY_AUTH);
|
|
||||||
|
|
||||||
env.put(Context.SECURITY_PRINCIPAL, userNamePattern.replace("{0}", username));
|
|
||||||
env.put(Context.SECURITY_CREDENTIALS, password);
|
|
||||||
env.put(TIMEOUT, time);
|
|
||||||
LdapContext ctx = null;
|
|
||||||
try {
|
|
||||||
ctx = new InitialLdapContext(env, null);
|
|
||||||
}
|
|
||||||
catch (CommunicationException e) {
|
|
||||||
LOG.error("LDAP Service connect timeout:{}", e.getMessage());
|
|
||||||
throw new RuntimeException("LDAP Service connect timeout");
|
|
||||||
}
|
|
||||||
catch (javax.naming.AuthenticationException e) {
|
|
||||||
LOG.error("login error:{}", e.getMessage());
|
|
||||||
throw new RuntimeException("login error!");
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
LOG.warn("Exception cause by:{}", e.getMessage());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
closeContext(ctx);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean supports(Class<?> aClass) {
|
|
||||||
return aClass.equals(UsernamePasswordAuthenticationToken.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void closeContext(DirContext ctx) {
|
|
||||||
if (ctx != null) {
|
|
||||||
try {
|
|
||||||
ctx.close();
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
LOG.error("Exception closing context", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,140 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.common.AuthConfigs;
|
|
||||||
import com.alibaba.nacos.auth.common.AuthSystemTypes;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.filter.JwtAuthenticationTokenFilter;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetailsServiceImpl;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.core.env.Environment;
|
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
|
||||||
import org.springframework.security.config.BeanIds;
|
|
||||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
|
||||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
||||||
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
|
||||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
|
||||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
||||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
||||||
import org.springframework.web.cors.CorsUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spring security config.
|
|
||||||
*
|
|
||||||
* @author Nacos
|
|
||||||
*/
|
|
||||||
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
|
||||||
public class NacosAuthConfig extends WebSecurityConfigurerAdapter {
|
|
||||||
|
|
||||||
public static final String AUTHORIZATION_HEADER = "Authorization";
|
|
||||||
|
|
||||||
public static final String SECURITY_IGNORE_URLS_SPILT_CHAR = ",";
|
|
||||||
|
|
||||||
public static final String LOGIN_ENTRY_POINT = "/v1/auth/login";
|
|
||||||
|
|
||||||
public static final String TOKEN_BASED_AUTH_ENTRY_POINT = "/v1/auth/**";
|
|
||||||
|
|
||||||
public static final String TOKEN_PREFIX = "Bearer ";
|
|
||||||
|
|
||||||
public static final String CONSOLE_RESOURCE_NAME_PREFIX = "console/";
|
|
||||||
|
|
||||||
public static final String UPDATE_PASSWORD_ENTRY_POINT = CONSOLE_RESOURCE_NAME_PREFIX + "user/password";
|
|
||||||
|
|
||||||
private static final String DEFAULT_ALL_PATH_PATTERN = "/**";
|
|
||||||
|
|
||||||
private static final String PROPERTY_IGNORE_URLS = "nacos.security.ignore.urls";
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private Environment env;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private JwtTokenManager tokenProvider;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthConfigs authConfigs;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosUserDetailsServiceImpl userDetailsService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private LdapAuthenticationProvider ldapAuthenticationProvider;
|
|
||||||
|
|
||||||
@Bean(name = BeanIds.AUTHENTICATION_MANAGER)
|
|
||||||
@Override
|
|
||||||
public AuthenticationManager authenticationManagerBean() throws Exception {
|
|
||||||
return super.authenticationManagerBean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void configure(WebSecurity web) {
|
|
||||||
|
|
||||||
String ignoreUrls = null;
|
|
||||||
if (AuthSystemTypes.NACOS.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
ignoreUrls = DEFAULT_ALL_PATH_PATTERN;
|
|
||||||
}
|
|
||||||
else if (AuthSystemTypes.LDAP.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
ignoreUrls = DEFAULT_ALL_PATH_PATTERN;
|
|
||||||
}
|
|
||||||
if (StringUtils.isBlank(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
ignoreUrls = env.getProperty(PROPERTY_IGNORE_URLS, DEFAULT_ALL_PATH_PATTERN);
|
|
||||||
}
|
|
||||||
if (StringUtils.isNotBlank(ignoreUrls)) {
|
|
||||||
for (String each : ignoreUrls.trim().split(SECURITY_IGNORE_URLS_SPILT_CHAR)) {
|
|
||||||
web.ignoring().antMatchers(each.trim());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
|
|
||||||
if (AuthSystemTypes.NACOS.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
|
|
||||||
}
|
|
||||||
else if (AuthSystemTypes.LDAP.name().equalsIgnoreCase(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
auth.authenticationProvider(ldapAuthenticationProvider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configure(HttpSecurity http) throws Exception {
|
|
||||||
|
|
||||||
if (StringUtils.isBlank(authConfigs.getNacosAuthSystemType())) {
|
|
||||||
http.csrf().disable().cors()// We don't need CSRF for JWT based authentication
|
|
||||||
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
|
|
||||||
.authorizeRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
|
|
||||||
.antMatchers(LOGIN_ENTRY_POINT).permitAll().and().authorizeRequests()
|
|
||||||
.antMatchers(TOKEN_BASED_AUTH_ENTRY_POINT).authenticated().and().exceptionHandling()
|
|
||||||
.authenticationEntryPoint(new JwtAuthenticationEntryPoint());
|
|
||||||
// disable cache
|
|
||||||
http.headers().cacheControl();
|
|
||||||
|
|
||||||
http.addFilterBefore(new JwtAuthenticationTokenFilter(tokenProvider),
|
|
||||||
UsernamePasswordAuthenticationFilter.class);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public PasswordEncoder passwordEncoder() {
|
|
||||||
return new BCryptPasswordEncoder();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,211 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.api.common.Constants;
|
|
||||||
import com.alibaba.nacos.api.remote.request.Request;
|
|
||||||
import com.alibaba.nacos.auth.AuthManager;
|
|
||||||
import com.alibaba.nacos.auth.exception.AccessException;
|
|
||||||
import com.alibaba.nacos.auth.model.Permission;
|
|
||||||
import com.alibaba.nacos.auth.model.User;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.config.server.auth.RoleInfo;
|
|
||||||
import com.alibaba.nacos.config.server.utils.RequestUtil;
|
|
||||||
import com.alibaba.nacos.core.utils.Loggers;
|
|
||||||
import com.alibaba.nacos.security.nacos.roles.NacosRoleServiceImpl;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUser;
|
|
||||||
import io.jsonwebtoken.ExpiredJwtException;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.AuthenticationException;
|
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builtin access control entry of Nacos.
|
|
||||||
*
|
|
||||||
* @author nkorange
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class NacosAuthManager implements AuthManager {
|
|
||||||
|
|
||||||
private static final String TOKEN_PREFIX = "Bearer ";
|
|
||||||
|
|
||||||
private static final String PARAM_USERNAME = "username";
|
|
||||||
|
|
||||||
private static final String PARAM_PASSWORD = "password";
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private JwtTokenManager tokenManager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthenticationManager authenticationManager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosRoleServiceImpl roleService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public User login(Object request) throws AccessException {
|
|
||||||
HttpServletRequest req = (HttpServletRequest) request;
|
|
||||||
String token = resolveToken(req);
|
|
||||||
if (StringUtils.isBlank(token)) {
|
|
||||||
throw new AccessException("user not found!");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
tokenManager.validateToken(token);
|
|
||||||
}
|
|
||||||
catch (ExpiredJwtException e) {
|
|
||||||
throw new AccessException("token expired!");
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new AccessException("token invalid!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Authentication authentication = tokenManager.getAuthentication(token);
|
|
||||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
||||||
|
|
||||||
String username = authentication.getName();
|
|
||||||
NacosUser user = new NacosUser();
|
|
||||||
user.setUserName(username);
|
|
||||||
user.setToken(token);
|
|
||||||
List<RoleInfo> roleInfoList = roleService.getRoles(username);
|
|
||||||
if (roleInfoList != null) {
|
|
||||||
for (RoleInfo roleInfo : roleInfoList) {
|
|
||||||
if (roleInfo.getRole().equals(NacosRoleServiceImpl.GLOBAL_ADMIN_ROLE)) {
|
|
||||||
user.setGlobalAdmin(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
req.setAttribute(RequestUtil.NACOS_USER_KEY, user);
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public User loginRemote(Object request) throws AccessException {
|
|
||||||
Request req = (Request) request;
|
|
||||||
String token = resolveToken(req);
|
|
||||||
if (StringUtils.isBlank(token)) {
|
|
||||||
throw new AccessException("user not found!");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
tokenManager.validateToken(token);
|
|
||||||
}
|
|
||||||
catch (ExpiredJwtException e) {
|
|
||||||
throw new AccessException("token expired!");
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new AccessException("token invalid!");
|
|
||||||
}
|
|
||||||
|
|
||||||
Authentication authentication = tokenManager.getAuthentication(token);
|
|
||||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
||||||
|
|
||||||
String username = authentication.getName();
|
|
||||||
NacosUser user = new NacosUser();
|
|
||||||
user.setUserName(username);
|
|
||||||
user.setToken(token);
|
|
||||||
List<RoleInfo> roleInfoList = roleService.getRoles(username);
|
|
||||||
if (roleInfoList != null) {
|
|
||||||
for (RoleInfo roleInfo : roleInfoList) {
|
|
||||||
if (roleInfo.getRole().equals(NacosRoleServiceImpl.GLOBAL_ADMIN_ROLE)) {
|
|
||||||
user.setGlobalAdmin(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void auth(Permission permission, User user) throws AccessException {
|
|
||||||
if (Loggers.AUTH.isDebugEnabled()) {
|
|
||||||
Loggers.AUTH.debug("auth permission: {}, user: {}", permission, user);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!roleService.hasPermission(user.getUserName(), permission)) {
|
|
||||||
throw new AccessException("authorization failed!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get token from header.
|
|
||||||
*/
|
|
||||||
private String resolveToken(HttpServletRequest request) throws AccessException {
|
|
||||||
String bearerToken = request.getHeader(NacosAuthConfig.AUTHORIZATION_HEADER);
|
|
||||||
if (StringUtils.isNotBlank(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
|
|
||||||
return bearerToken.substring(7);
|
|
||||||
}
|
|
||||||
bearerToken = request.getParameter(Constants.ACCESS_TOKEN);
|
|
||||||
if (StringUtils.isBlank(bearerToken)) {
|
|
||||||
String userName = request.getParameter(PARAM_USERNAME);
|
|
||||||
String password = request.getParameter(PARAM_PASSWORD);
|
|
||||||
bearerToken = resolveTokenFromUser(userName, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bearerToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get token from header.
|
|
||||||
*/
|
|
||||||
private String resolveToken(Request request) throws AccessException {
|
|
||||||
String bearerToken = request.getHeader(NacosAuthConfig.AUTHORIZATION_HEADER);
|
|
||||||
if (StringUtils.isNotBlank(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
|
|
||||||
return bearerToken.substring(7);
|
|
||||||
}
|
|
||||||
bearerToken = request.getHeader(Constants.ACCESS_TOKEN);
|
|
||||||
if (StringUtils.isBlank(bearerToken)) {
|
|
||||||
String userName = request.getHeader(PARAM_USERNAME);
|
|
||||||
String password = request.getHeader(PARAM_PASSWORD);
|
|
||||||
bearerToken = resolveTokenFromUser(userName, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bearerToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String resolveTokenFromUser(String userName, String rawPassword) throws AccessException {
|
|
||||||
String finalName;
|
|
||||||
Authentication authenticate;
|
|
||||||
try {
|
|
||||||
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName,
|
|
||||||
rawPassword);
|
|
||||||
authenticate = authenticationManager.authenticate(authenticationToken);
|
|
||||||
}
|
|
||||||
catch (AuthenticationException e) {
|
|
||||||
throw new AccessException("unknown user!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null == authenticate || StringUtils.isBlank(authenticate.getName())) {
|
|
||||||
finalName = userName;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
finalName = authenticate.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
return tokenManager.createToken(finalName);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,245 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos.roles;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.common.AuthConfigs;
|
|
||||||
import com.alibaba.nacos.auth.model.Permission;
|
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
|
||||||
import com.alibaba.nacos.config.server.auth.PermissionInfo;
|
|
||||||
import com.alibaba.nacos.config.server.auth.PermissionPersistService;
|
|
||||||
import com.alibaba.nacos.config.server.auth.RoleInfo;
|
|
||||||
import com.alibaba.nacos.config.server.auth.RolePersistService;
|
|
||||||
import com.alibaba.nacos.config.server.model.Page;
|
|
||||||
import com.alibaba.nacos.core.utils.Loggers;
|
|
||||||
import com.alibaba.nacos.security.nacos.NacosAuthConfig;
|
|
||||||
import com.alibaba.nacos.security.nacos.users.NacosUserDetailsServiceImpl;
|
|
||||||
import io.jsonwebtoken.lang.Collections;
|
|
||||||
import org.apache.mina.util.ConcurrentHashSet;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Nacos builtin role service.
|
|
||||||
*
|
|
||||||
* @author nkorange
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class NacosRoleServiceImpl {
|
|
||||||
|
|
||||||
public static final String GLOBAL_ADMIN_ROLE = "ROLE_ADMIN";
|
|
||||||
|
|
||||||
private static final int DEFAULT_PAGE_NO = 1;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthConfigs authConfigs;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RolePersistService rolePersistService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private NacosUserDetailsServiceImpl userDetailsService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private PermissionPersistService permissionPersistService;
|
|
||||||
|
|
||||||
private volatile Set<String> roleSet = new ConcurrentHashSet<>();
|
|
||||||
|
|
||||||
private volatile Map<String, List<RoleInfo>> roleInfoMap = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
private volatile Map<String, List<PermissionInfo>> permissionInfoMap = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
@Scheduled(initialDelay = 5000, fixedDelay = 15000)
|
|
||||||
private void reload() {
|
|
||||||
try {
|
|
||||||
Page<RoleInfo> roleInfoPage = rolePersistService.getRolesByUserName(StringUtils.EMPTY, DEFAULT_PAGE_NO,
|
|
||||||
Integer.MAX_VALUE);
|
|
||||||
if (roleInfoPage == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Set<String> tmpRoleSet = new HashSet<>(16);
|
|
||||||
Map<String, List<RoleInfo>> tmpRoleInfoMap = new ConcurrentHashMap<>(16);
|
|
||||||
for (RoleInfo roleInfo : roleInfoPage.getPageItems()) {
|
|
||||||
if (!tmpRoleInfoMap.containsKey(roleInfo.getUsername())) {
|
|
||||||
tmpRoleInfoMap.put(roleInfo.getUsername(), new ArrayList<>());
|
|
||||||
}
|
|
||||||
tmpRoleInfoMap.get(roleInfo.getUsername()).add(roleInfo);
|
|
||||||
tmpRoleSet.add(roleInfo.getRole());
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, List<PermissionInfo>> tmpPermissionInfoMap = new ConcurrentHashMap<>(16);
|
|
||||||
for (String role : tmpRoleSet) {
|
|
||||||
Page<PermissionInfo> permissionInfoPage = permissionPersistService.getPermissions(role, DEFAULT_PAGE_NO,
|
|
||||||
Integer.MAX_VALUE);
|
|
||||||
tmpPermissionInfoMap.put(role, permissionInfoPage.getPageItems());
|
|
||||||
}
|
|
||||||
|
|
||||||
roleSet = tmpRoleSet;
|
|
||||||
roleInfoMap = tmpRoleInfoMap;
|
|
||||||
permissionInfoMap = tmpPermissionInfoMap;
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
Loggers.AUTH.warn("[LOAD-ROLES] load failed", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if the user has permission of the resource.
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* Note if the user has many roles, this method returns true if any one role of the
|
|
||||||
* user has the desired permission.
|
|
||||||
* @param username user info
|
|
||||||
* @param permission permission to auth
|
|
||||||
* @return true if granted, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean hasPermission(String username, Permission permission) {
|
|
||||||
// update password
|
|
||||||
if (NacosAuthConfig.UPDATE_PASSWORD_ENTRY_POINT.equals(permission.getResource())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<RoleInfo> roleInfoList = getRoles(username);
|
|
||||||
if (Collections.isEmpty(roleInfoList)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Global admin pass:
|
|
||||||
for (RoleInfo roleInfo : roleInfoList) {
|
|
||||||
if (GLOBAL_ADMIN_ROLE.equals(roleInfo.getRole())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Old global admin can pass resource 'console/':
|
|
||||||
if (permission.getResource().startsWith(NacosAuthConfig.CONSOLE_RESOURCE_NAME_PREFIX)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For other roles, use a pattern match to decide if pass or not.
|
|
||||||
for (RoleInfo roleInfo : roleInfoList) {
|
|
||||||
List<PermissionInfo> permissionInfoList = getPermissions(roleInfo.getRole());
|
|
||||||
if (Collections.isEmpty(permissionInfoList)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (PermissionInfo permissionInfo : permissionInfoList) {
|
|
||||||
String permissionResource = permissionInfo.getResource().replaceAll("\\*", ".*");
|
|
||||||
String permissionAction = permissionInfo.getAction();
|
|
||||||
if (permissionAction.contains(permission.getAction())
|
|
||||||
&& Pattern.matches(permissionResource, permission.getResource())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<RoleInfo> getRoles(String username) {
|
|
||||||
List<RoleInfo> roleInfoList = roleInfoMap.get(username);
|
|
||||||
if (!authConfigs.isCachingEnabled() || roleInfoList == null) {
|
|
||||||
Page<RoleInfo> roleInfoPage = getRolesFromDatabase(username, DEFAULT_PAGE_NO, Integer.MAX_VALUE);
|
|
||||||
if (roleInfoPage != null) {
|
|
||||||
roleInfoList = roleInfoPage.getPageItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return roleInfoList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Page<RoleInfo> getRolesFromDatabase(String userName, int pageNo, int pageSize) {
|
|
||||||
Page<RoleInfo> roles = rolePersistService.getRolesByUserName(userName, pageNo, pageSize);
|
|
||||||
if (roles == null) {
|
|
||||||
return new Page<>();
|
|
||||||
}
|
|
||||||
return roles;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<PermissionInfo> getPermissions(String role) {
|
|
||||||
List<PermissionInfo> permissionInfoList = permissionInfoMap.get(role);
|
|
||||||
if (!authConfigs.isCachingEnabled() || permissionInfoList == null) {
|
|
||||||
Page<PermissionInfo> permissionInfoPage = getPermissionsFromDatabase(role, DEFAULT_PAGE_NO,
|
|
||||||
Integer.MAX_VALUE);
|
|
||||||
if (permissionInfoPage != null) {
|
|
||||||
permissionInfoList = permissionInfoPage.getPageItems();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return permissionInfoList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Page<PermissionInfo> getPermissionsByRoleFromDatabase(String role, int pageNo, int pageSize) {
|
|
||||||
return permissionPersistService.getPermissions(role, pageNo, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add role.
|
|
||||||
* @param role role name
|
|
||||||
* @param username user name
|
|
||||||
*/
|
|
||||||
public void addRole(String role, String username) {
|
|
||||||
if (userDetailsService.getUserFromDatabase(username) == null) {
|
|
||||||
throw new IllegalArgumentException("user '" + username + "' not found!");
|
|
||||||
}
|
|
||||||
if (GLOBAL_ADMIN_ROLE.equals(role)) {
|
|
||||||
throw new IllegalArgumentException("role '" + GLOBAL_ADMIN_ROLE + "' is not permitted to create!");
|
|
||||||
}
|
|
||||||
rolePersistService.addRole(role, username);
|
|
||||||
roleSet.add(role);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteRole(String role, String userName) {
|
|
||||||
rolePersistService.deleteRole(role, userName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteRole(String role) {
|
|
||||||
rolePersistService.deleteRole(role);
|
|
||||||
roleSet.remove(role);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Page<PermissionInfo> getPermissionsFromDatabase(String role, int pageNo, int pageSize) {
|
|
||||||
Page<PermissionInfo> pageInfo = permissionPersistService.getPermissions(role, pageNo, pageSize);
|
|
||||||
if (pageInfo == null) {
|
|
||||||
return new Page<>();
|
|
||||||
}
|
|
||||||
return pageInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add permission.
|
|
||||||
* @param role role name
|
|
||||||
* @param resource resource
|
|
||||||
* @param action action
|
|
||||||
*/
|
|
||||||
public void addPermission(String role, String resource, String action) {
|
|
||||||
if (!roleSet.contains(role)) {
|
|
||||||
throw new IllegalArgumentException("role " + role + " not found!");
|
|
||||||
}
|
|
||||||
permissionPersistService.addPermission(role, resource, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deletePermission(String role, String resource, String action) {
|
|
||||||
permissionPersistService.deletePermission(role, resource, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findRolesLikeRoleName(String role) {
|
|
||||||
return rolePersistService.findRolesLikeRoleName(role);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos.users;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.model.User;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Nacos User.
|
|
||||||
*
|
|
||||||
* @author nkorange
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
public class NacosUser extends User {
|
|
||||||
|
|
||||||
private String token;
|
|
||||||
|
|
||||||
private boolean globalAdmin = false;
|
|
||||||
|
|
||||||
public String getToken() {
|
|
||||||
return token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setToken(String token) {
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isGlobalAdmin() {
|
|
||||||
return globalAdmin;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setGlobalAdmin(boolean globalAdmin) {
|
|
||||||
this.globalAdmin = globalAdmin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "NacosUser{" + "token='" + token + '\'' + ", globalAdmin=" + globalAdmin + '}';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos.users;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.config.server.model.User;
|
|
||||||
import org.springframework.security.core.GrantedAuthority;
|
|
||||||
import org.springframework.security.core.authority.AuthorityUtils;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* custom user.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
*/
|
|
||||||
public class NacosUserDetails implements UserDetails {
|
|
||||||
|
|
||||||
private final User user;
|
|
||||||
|
|
||||||
public NacosUserDetails(User user) {
|
|
||||||
this.user = user;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
|
||||||
// TODO: get authorities
|
|
||||||
return AuthorityUtils.commaSeparatedStringToAuthorityList("");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPassword() {
|
|
||||||
return user.getPassword();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUsername() {
|
|
||||||
return user.getUsername();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAccountNonExpired() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAccountNonLocked() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCredentialsNonExpired() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.security.nacos.users;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.auth.common.AuthConfigs;
|
|
||||||
import com.alibaba.nacos.config.server.auth.UserPersistService;
|
|
||||||
import com.alibaba.nacos.config.server.model.Page;
|
|
||||||
import com.alibaba.nacos.config.server.model.User;
|
|
||||||
import com.alibaba.nacos.core.utils.Loggers;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
|
||||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Custom user service.
|
|
||||||
*
|
|
||||||
* @author wfnuser
|
|
||||||
* @author nkorange
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class NacosUserDetailsServiceImpl implements UserDetailsService {
|
|
||||||
|
|
||||||
private Map<String, User> userMap = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserPersistService userPersistService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthConfigs authConfigs;
|
|
||||||
|
|
||||||
@Scheduled(initialDelay = 5000, fixedDelay = 15000)
|
|
||||||
private void reload() {
|
|
||||||
try {
|
|
||||||
Page<User> users = getUsersFromDatabase(1, Integer.MAX_VALUE);
|
|
||||||
if (users == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, User> map = new ConcurrentHashMap<>(16);
|
|
||||||
for (User user : users.getPageItems()) {
|
|
||||||
map.put(user.getUsername(), user);
|
|
||||||
}
|
|
||||||
userMap = map;
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
Loggers.AUTH.warn("[LOAD-USERS] load failed", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
|
||||||
|
|
||||||
User user = userMap.get(username);
|
|
||||||
if (!authConfigs.isCachingEnabled()) {
|
|
||||||
user = userPersistService.findUserByUsername(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
throw new UsernameNotFoundException(username);
|
|
||||||
}
|
|
||||||
return new NacosUserDetails(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateUserPassword(String username, String password) {
|
|
||||||
userPersistService.updateUserPassword(username, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Page<User> getUsersFromDatabase(int pageNo, int pageSize) {
|
|
||||||
return userPersistService.getUsers(pageNo, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
public User getUser(String username) {
|
|
||||||
User user = userMap.get(username);
|
|
||||||
if (!authConfigs.isCachingEnabled() || user == null) {
|
|
||||||
user = getUserFromDatabase(username);
|
|
||||||
}
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
public User getUserFromDatabase(String username) {
|
|
||||||
return userPersistService.findUserByUsername(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findUserLikeUsername(String username) {
|
|
||||||
return userPersistService.findUserLikeUsername(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void createUser(String username, String password) {
|
|
||||||
userPersistService.createUser(username, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteUser(String username) {
|
|
||||||
userPersistService.deleteUser(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.utils;
|
|
||||||
|
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Password encoder tool.
|
|
||||||
*
|
|
||||||
* @author nacos
|
|
||||||
*/
|
|
||||||
public class PasswordEncoderUtil {
|
|
||||||
|
|
||||||
public static Boolean matches(String raw, String encoded) {
|
|
||||||
return new BCryptPasswordEncoder().matches(raw, encoded);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String encode(String raw) {
|
|
||||||
return new BCryptPasswordEncoder().encode(raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,78 @@
|
|||||||
|
#
|
||||||
|
# Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Console Default Properties
|
||||||
|
|
||||||
|
spring.mvc.view.prefix=/jsp/
|
||||||
|
# the default suffix of page
|
||||||
|
spring.mvc.view.suffix=.jsp
|
||||||
|
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
|
||||||
|
#logging.level.root=DEBUG
|
||||||
|
|
||||||
|
# P0 key,For Debug. whether use address-server; true:use; false:not use;default:true
|
||||||
|
useAddressServer=true
|
||||||
|
|
||||||
|
# whether open interInterFaceFilter; true:open; false:close; if open, others can't call inner interface. default:false
|
||||||
|
openInnerInterfaceFilter=false
|
||||||
|
|
||||||
|
# quickStart stip dumpAll;only dump change config
|
||||||
|
isQuickStart=false
|
||||||
|
|
||||||
|
# server notify each otherd
|
||||||
|
notifyConnectTimeout=200
|
||||||
|
|
||||||
|
# server notify each other
|
||||||
|
notifySocketTimeout=8000
|
||||||
|
|
||||||
|
# whether health check
|
||||||
|
isHealthCheck=true
|
||||||
|
|
||||||
|
# health check max fail count
|
||||||
|
maxHealthCheckFailCount=12
|
||||||
|
|
||||||
|
# whether open spas; true:open; false:close
|
||||||
|
OPEN_SPAS=true
|
||||||
|
|
||||||
|
nacos.cmdb.dumpTaskInterval=3600
|
||||||
|
nacos.cmdb.eventTaskInterval=10
|
||||||
|
nacos.cmdb.labelTaskInterval=300
|
||||||
|
nacos.cmdb.loadDataAtStart=false
|
||||||
|
|
||||||
|
#management.endpoints.web.exposure.include=*
|
||||||
|
|
||||||
|
#spring.security.enabled=false
|
||||||
|
#management.security=false
|
||||||
|
#security.basic.enabled=false
|
||||||
|
#nacos.security.ignore.urls=/**
|
||||||
|
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/login,/v1/console/health,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**
|
||||||
|
|
||||||
|
management.metrics.export.elastic.enabled=false
|
||||||
|
#management.metrics.export.elastic.host=http://localhost:9200
|
||||||
|
|
||||||
|
# metrics for influx
|
||||||
|
management.metrics.export.influx.enabled=false
|
||||||
|
#management.metrics.export.influx.db=springboot
|
||||||
|
#management.metrics.export.influx.uri=http://localhost:8086
|
||||||
|
#management.metrics.export.influx.auto-create-db=true
|
||||||
|
#management.metrics.export.influx.consistency=one
|
||||||
|
#management.metrics.export.influx.compressed=true
|
||||||
|
|
||||||
|
server.tomcat.accesslog.enabled=true
|
||||||
|
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
|
||||||
|
# default current work dir
|
||||||
|
server.tomcat.basedir=
|
||||||
|
|
||||||
|
|
215
pig-register/src/main/resources/META-INF/schema.sql
Normal file
215
pig-register/src/main/resources/META-INF/schema.sql
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
CREATE SCHEMA nacos AUTHORIZATION nacos;
|
||||||
|
|
||||||
|
CREATE TABLE config_info (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) default '',
|
||||||
|
app_name varchar(128),
|
||||||
|
content CLOB,
|
||||||
|
md5 varchar(32) DEFAULT NULL,
|
||||||
|
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
src_user varchar(128) DEFAULT NULL,
|
||||||
|
src_ip varchar(20) DEFAULT NULL,
|
||||||
|
c_desc varchar(256) DEFAULT NULL,
|
||||||
|
c_use varchar(64) DEFAULT NULL,
|
||||||
|
effect varchar(64) DEFAULT NULL,
|
||||||
|
type varchar(64) DEFAULT NULL,
|
||||||
|
c_schema LONG VARCHAR DEFAULT NULL,
|
||||||
|
encrypted_data_key LONG VARCHAR DEFAULT NULL,
|
||||||
|
constraint configinfo_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_configinfo_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
|
||||||
|
|
||||||
|
CREATE INDEX configinfo_dataid_key_idx ON config_info(data_id);
|
||||||
|
CREATE INDEX configinfo_groupid_key_idx ON config_info(group_id);
|
||||||
|
CREATE INDEX configinfo_dataid_group_key_idx ON config_info(data_id, group_id);
|
||||||
|
|
||||||
|
CREATE TABLE his_config_info (
|
||||||
|
id bigint NOT NULL,
|
||||||
|
nid bigint NOT NULL generated by default as identity,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) default '',
|
||||||
|
app_name varchar(128),
|
||||||
|
content CLOB,
|
||||||
|
md5 varchar(32) DEFAULT NULL,
|
||||||
|
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
|
||||||
|
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00.000',
|
||||||
|
src_user varchar(128),
|
||||||
|
src_ip varchar(20) DEFAULT NULL,
|
||||||
|
op_type char(10) DEFAULT NULL,
|
||||||
|
encrypted_data_key LONG VARCHAR DEFAULT NULL,
|
||||||
|
constraint hisconfiginfo_nid_key PRIMARY KEY (nid));
|
||||||
|
|
||||||
|
CREATE INDEX hisconfiginfo_dataid_key_idx ON his_config_info(data_id);
|
||||||
|
CREATE INDEX hisconfiginfo_gmt_create_idx ON his_config_info(gmt_create);
|
||||||
|
CREATE INDEX hisconfiginfo_gmt_modified_idx ON his_config_info(gmt_modified);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE config_info_beta (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) default '',
|
||||||
|
app_name varchar(128),
|
||||||
|
content CLOB,
|
||||||
|
beta_ips varchar(1024),
|
||||||
|
md5 varchar(32) DEFAULT NULL,
|
||||||
|
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
src_user varchar(128),
|
||||||
|
src_ip varchar(20) DEFAULT NULL,
|
||||||
|
encrypted_data_key LONG VARCHAR DEFAULT NULL,
|
||||||
|
constraint configinfobeta_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_configinfobeta_datagrouptenant UNIQUE (data_id,group_id,tenant_id));
|
||||||
|
|
||||||
|
CREATE TABLE config_info_tag (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) default '',
|
||||||
|
tag_id varchar(128) NOT NULL,
|
||||||
|
app_name varchar(128),
|
||||||
|
content CLOB,
|
||||||
|
md5 varchar(32) DEFAULT NULL,
|
||||||
|
gmt_create timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
src_user varchar(128),
|
||||||
|
src_ip varchar(20) DEFAULT NULL,
|
||||||
|
constraint configinfotag_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_configinfotag_datagrouptenanttag UNIQUE (data_id,group_id,tenant_id,tag_id));
|
||||||
|
|
||||||
|
CREATE TABLE config_info_aggr (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) default '',
|
||||||
|
datum_id varchar(255) NOT NULL,
|
||||||
|
app_name varchar(128),
|
||||||
|
content CLOB,
|
||||||
|
gmt_modified timestamp NOT NULL DEFAULT '2010-05-05 00:00:00',
|
||||||
|
constraint configinfoaggr_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_configinfoaggr_datagrouptenantdatum UNIQUE (data_id,group_id,tenant_id,datum_id));
|
||||||
|
|
||||||
|
CREATE TABLE app_list (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
app_name varchar(128) NOT NULL,
|
||||||
|
is_dynamic_collect_disabled smallint DEFAULT 0,
|
||||||
|
last_sub_info_collected_time timestamp DEFAULT '1970-01-01 08:00:00.0',
|
||||||
|
sub_info_lock_owner varchar(128),
|
||||||
|
sub_info_lock_time timestamp DEFAULT '1970-01-01 08:00:00.0',
|
||||||
|
constraint applist_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_appname UNIQUE (app_name));
|
||||||
|
|
||||||
|
CREATE TABLE app_configdata_relation_subs (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
app_name varchar(128) NOT NULL,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
constraint configdatarelationsubs_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_app_sub_config_datagroup UNIQUE (app_name, data_id, group_id));
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE app_configdata_relation_pubs (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
app_name varchar(128) NOT NULL,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
constraint configdatarelationpubs_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_app_pub_config_datagroup UNIQUE (app_name, data_id, group_id));
|
||||||
|
|
||||||
|
CREATE TABLE config_tags_relation (
|
||||||
|
id bigint NOT NULL,
|
||||||
|
tag_name varchar(128) NOT NULL,
|
||||||
|
tag_type varchar(64) DEFAULT NULL,
|
||||||
|
data_id varchar(255) NOT NULL,
|
||||||
|
group_id varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) DEFAULT '',
|
||||||
|
nid bigint NOT NULL generated by default as identity,
|
||||||
|
constraint config_tags_id_key PRIMARY KEY (nid),
|
||||||
|
constraint uk_configtagrelation_configidtag UNIQUE (id, tag_name, tag_type));
|
||||||
|
|
||||||
|
CREATE INDEX config_tags_tenant_id_idx ON config_tags_relation(tenant_id);
|
||||||
|
|
||||||
|
CREATE TABLE group_capacity (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
group_id varchar(128) DEFAULT '',
|
||||||
|
quota int DEFAULT 0,
|
||||||
|
usage int DEFAULT 0,
|
||||||
|
max_size int DEFAULT 0,
|
||||||
|
max_aggr_count int DEFAULT 0,
|
||||||
|
max_aggr_size int DEFAULT 0,
|
||||||
|
max_history_count int DEFAULT 0,
|
||||||
|
gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
constraint group_capacity_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_group_id UNIQUE (group_id));
|
||||||
|
|
||||||
|
CREATE TABLE tenant_capacity (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
tenant_id varchar(128) DEFAULT '',
|
||||||
|
quota int DEFAULT 0,
|
||||||
|
usage int DEFAULT 0,
|
||||||
|
max_size int DEFAULT 0,
|
||||||
|
max_aggr_count int DEFAULT 0,
|
||||||
|
max_aggr_size int DEFAULT 0,
|
||||||
|
max_history_count int DEFAULT 0,
|
||||||
|
gmt_create timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
gmt_modified timestamp DEFAULT '2010-05-05 00:00:00',
|
||||||
|
constraint tenant_capacity_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_tenant_id UNIQUE (tenant_id));
|
||||||
|
|
||||||
|
CREATE TABLE tenant_info (
|
||||||
|
id bigint NOT NULL generated by default as identity,
|
||||||
|
kp varchar(128) NOT NULL,
|
||||||
|
tenant_id varchar(128) DEFAULT '',
|
||||||
|
tenant_name varchar(128) DEFAULT '',
|
||||||
|
tenant_desc varchar(256) DEFAULT NULL,
|
||||||
|
create_source varchar(32) DEFAULT NULL,
|
||||||
|
gmt_create bigint NOT NULL,
|
||||||
|
gmt_modified bigint NOT NULL,
|
||||||
|
constraint tenant_info_id_key PRIMARY KEY (id),
|
||||||
|
constraint uk_tenant_info_kptenantid UNIQUE (kp,tenant_id));
|
||||||
|
CREATE INDEX tenant_info_tenant_id_idx ON tenant_info(tenant_id);
|
||||||
|
|
||||||
|
CREATE TABLE users (
|
||||||
|
username varchar(50) NOT NULL PRIMARY KEY,
|
||||||
|
password varchar(500) NOT NULL,
|
||||||
|
enabled boolean NOT NULL DEFAULT true
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE roles (
|
||||||
|
username varchar(50) NOT NULL,
|
||||||
|
role varchar(50) NOT NULL,
|
||||||
|
constraint uk_username_role UNIQUE (username,role)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE permissions (
|
||||||
|
role varchar(50) NOT NULL,
|
||||||
|
resource varchar(512) NOT NULL,
|
||||||
|
action varchar(8) NOT NULL,
|
||||||
|
constraint uk_role_permission UNIQUE (role,resource,action)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
|
||||||
|
|
||||||
|
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
|
@ -1,5 +1,5 @@
|
|||||||
server:
|
server:
|
||||||
port: 8848
|
port: 8848 #如何修改 pig-register 启动端口 >: https://t.cn/A6XGvTdb
|
||||||
tomcat:
|
tomcat:
|
||||||
basedir: logs
|
basedir: logs
|
||||||
|
|
||||||
@ -35,6 +35,8 @@ spring:
|
|||||||
service-host-type: ip
|
service-host-type: ip
|
||||||
application:
|
application:
|
||||||
name: @project.artifactId@
|
name: @project.artifactId@
|
||||||
|
main:
|
||||||
|
allow-circular-references: true
|
||||||
|
|
||||||
useAddressServer: true
|
useAddressServer: true
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
version=${project.version}
|
version=2.1.0
|
||||||
|
File diff suppressed because one or more lines are too long
@ -22,20 +22,20 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||||
|
<meta http-equiv="Pragma" content="no-cache">
|
||||||
|
<meta http-equiv="Expires" content="0">
|
||||||
<title>Nacos</title>
|
<title>Nacos</title>
|
||||||
|
<link rel="shortcut icon" href="console-ui/public/img/nacos-logo.png" type="image/x-icon">
|
||||||
<link rel="shortcut icon" href="console-ui/public/img/nacos-logo.png" type="image/x-icon">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/bootstrap.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/bootstrap.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/console1412.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/console1412.css">
|
|
||||||
<!-- 第三方css开始 -->
|
<!-- 第三方css开始 -->
|
||||||
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/codemirror.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/codemirror.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/merge.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/merge.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
|
|
||||||
<!-- 第三方css结束 -->
|
<!-- 第三方css结束 -->
|
||||||
<link href="css/main.css" rel="stylesheet">
|
<link href="./css/main.css?1cbbea1b0db3eec7912c" rel="stylesheet"></head>
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="root" style="overflow:hidden"></div>
|
<div id="root" style="overflow:hidden"></div>
|
||||||
@ -43,20 +43,19 @@
|
|||||||
<div id="other"></div>
|
<div id="other"></div>
|
||||||
|
|
||||||
<!-- 第三方js开始 -->
|
<!-- 第三方js开始 -->
|
||||||
<script src="console-ui/public/js/jquery.js"></script>
|
<script src="console-ui/public/js/jquery.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.js"></script>
|
<script src="console-ui/public/js/codemirror.js"></script>
|
||||||
<script src="console-ui/public/js/javascript.js"></script>
|
<script src="console-ui/public/js/javascript.js"></script>
|
||||||
<script src="console-ui/public/js/xml.js"></script>
|
<script src="console-ui/public/js/xml.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.addone.fullscreen.js"></script>
|
<script src="console-ui/public/js/codemirror.addone.fullscreen.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.addone.lint.js"></script>
|
<script src="console-ui/public/js/codemirror.addone.lint.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.lib.json-lint.js"></script>
|
<script src="console-ui/public/js/codemirror.lib.json-lint.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.addone.json-lint.js"></script>
|
<script src="console-ui/public/js/codemirror.addone.json-lint.js"></script>
|
||||||
<script src="console-ui/public/js/codemirror.lib.clike-lint.js"></script>
|
<script src="console-ui/public/js/codemirror.lib.clike-lint.js"></script>
|
||||||
<script src="console-ui/public/js/diff_match_patch.js"></script>
|
<script src="console-ui/public/js/diff_match_patch.js"></script>
|
||||||
<script src="console-ui/public/js/merge.js"></script>
|
<script src="console-ui/public/js/merge.js"></script>
|
||||||
<script src="console-ui/public/js/loader.js"></script>
|
<script src="console-ui/public/js/loader.js"></script>
|
||||||
|
|
||||||
<!-- 第三方js结束 -->
|
<!-- 第三方js结束 -->
|
||||||
<script type="text/javascript" src="js/main.js"></script></body>
|
<script type="text/javascript" src="./js/main.js?1cbbea1b0db3eec7912c"></script></body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
File diff suppressed because one or more lines are too long
4
pom.xml
4
pom.xml
@ -34,7 +34,7 @@
|
|||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<spring-boot-admin.version>2.6.7</spring-boot-admin.version>
|
<spring-boot-admin.version>2.6.7</spring-boot-admin.version>
|
||||||
<hutool.version>5.7.22</hutool.version>
|
<hutool.version>5.8.0</hutool.version>
|
||||||
<dynamic-ds.version>3.5.1</dynamic-ds.version>
|
<dynamic-ds.version>3.5.1</dynamic-ds.version>
|
||||||
<captcha.version>2.2.2</captcha.version>
|
<captcha.version>2.2.2</captcha.version>
|
||||||
<velocity.version>2.3</velocity.version>
|
<velocity.version>2.3</velocity.version>
|
||||||
@ -50,7 +50,7 @@
|
|||||||
<docker.username>username</docker.username>
|
<docker.username>username</docker.username>
|
||||||
<docker.password>password</docker.password>
|
<docker.password>password</docker.password>
|
||||||
<git.commit.plugin>4.9.9</git.commit.plugin>
|
<git.commit.plugin>4.9.9</git.commit.plugin>
|
||||||
<spring.checkstyle.plugin>0.0.29</spring.checkstyle.plugin>
|
<spring.checkstyle.plugin>0.0.33</spring.checkstyle.plugin>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<!-- 以下依赖 全局所有的模块都会引入 -->
|
<!-- 以下依赖 全局所有的模块都会引入 -->
|
||||||
|
Loading…
Reference in New Issue
Block a user