Commit f1ff49ff authored by AfirSraftGarrier's avatar AfirSraftGarrier

Merge branch 'master' into for-yx

parents c75b27a6 3f0b43e8
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST----- -----BEGIN CERTIFICATE REQUEST-----
MIICrjCCAZYCAQAwTzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH MIICljCCAX4CAQAwUTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQwwCgYDVQQDDANBQ0MwggEi DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQ4wDAYDVQQDDAVTUi1DQTCC
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/8E30sg/i8rr1Vu9jplt/60eF ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOGm68efDJou2ElrzrEUpDGS
hNMcNbhRTml0IFz7Da7s9DB4I20fys7ogmGVzCTFJFt3HoOZW6WaSg0C/e+A7Nw9 p5oOqn+60UbFKquObbH1sfnkpJeJYsTLT9EkZYEt1um76St2+4VJAyeLC6KEW4j8
dzIZ8kUFFKxA4zfqgQBeAbofP+VqrAIi7Pm5D69LqDiFQqVVnSE7TA4G2VfI2Wls q8QoIoDDwYa85+uwEgNAj8AJikBidCboFjdgtHJLqwmrdJGHYtqnFnIdyvzLZe7G
kJuUJ2lcpMtks2R8/lu92U5MAJJ/4gwvep5EEKJfGy3vnZ9Y0WWZELzOIxIyWdCU rxsbDhZ399qEaxvYmwGRI7ZkT5v9lPpw9RqfPysaS829zn6W1mUCeVPPMSbCtgSq
auT8hS+U/YB/ldRznQJuZ12q3tTG/rnsgDMoS2xf+5bWttFtiifhxSJXme4z7iSZ sYjRPDHuzi15GygEnsMMFTozSvLm5xrpSbY9jNvXo5weUy/OCaIkiVmiL2dUVMf1
xb08RMlYShPY4xwbKuEUsGk9awttwzrP/t8TwISKLYB1Fz4ymnkEN+DRrEcFAgMB 0y4PphxvzGnnX78dJ7iuo1as+V0zs6CngVdiMWmmt1yX2TyTsm2tbZHH5w+wknkC
AAGgGjAYBgkqhkiG9w0BCQcxCwwJc3J0aGlua2VyMA0GCSqGSIb3DQEBCwUAA4IB AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQAAmVVU9YceDSOtKv5k0YLc0so6rsD0
AQBRyccBv7lwv4/GNiXTWTcuLPXbauSXAGyVT2Vk2XFg3dI5ZBYbE/Ir05Afhf4+ y53KlEVDRDBmllSl45Q5J444U3bgg+mBQgHfEcTG5r/LCiBifnpezvNMHPvrlBK2
gdTBIzeRBSI1hcYrdYDHhFXaq/JS8lO/wEMULvJBcHVEsUa9LHf9hBRmr6+aO6Sn 4ivKNXfqi/sK9OwWvZfRHMfkQalPoDsno2AZ5HKTf9ljf+/qQlvHegSt+5CbeLOZ
QYWGUtPfYSn3/WzUUBYeSWvotCqwOUjfmdcPXtbOIHapy5fUuF3UHST4DLHdkjVq +wWgLujDcCo/qNRIgBkJJMERt2tdllww7rUC1e0vXQaLUoL1tre+n9lKSNscxX1P
ihbwyr4XS68W63hHzs1mvjgD+v5fn0KMfxm8QUEtJ9duDLF3RMGv71K0F3qHk+5a Cx8a8RJF+9Rdu+ZZOvn0zU+xwxRmiYBrtnJDS1p/Mstpa97xezC6CofpXZGbvUwm
qT2vmkBGs4nDYfUHs930mjb+/nUkRxk4KQZupJ64WSiTjNkIEf0dsj/MmCfQoTJK 0XjjwV4rzQ1XEdG1oUgusC2tp9PYRZHiPE4HIi0HoRKxj8XHGggEIGkz
nlb2i5Qp2A6N71bqoH0eWunw
-----END CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
B81C2DC0B70ABED4 B81C2DC0B70ABED8
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST----- -----BEGIN CERTIFICATE REQUEST-----
MIICrjCCAZYCAQAwTzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH MIICmjCCAYICAQAwVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQwwCgYDVQQDDANBQ0MwggEi DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1DTElF
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD1PB+QqgxKYnsqypu3lT5u6TDB TlQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC//jI81JWRFmuXI2TH
Chdrn91utjDynvIk0fKjrOAvlzpugoRLHSkpz5kWyw727otdq4MBdMxzVN2udEBC dQX7Mu1chPBXhmkGRP8Ex77CQRcAzTFNV3m5SuMJ+ggO+Ig7O24LzupSjJEto5tY
dcNekfgzm1ZhWl71lNX7sDTigIdd7hBnNZY/uYz0bRdExkodqmx08VENnc4Xkj1E Zzu15DJWrBMvtdDCK+zsPCwatLSQ1nx+5q4OsLzuA+MsWrF2r+KfnEIh4CSGf4Ap
Iw5YB0+3hLBC0Y2Ab++qKq3x97V6+Oeoqqu1wtRLA4VV2GqTHbg9jooBmJUsPu1W FS9yUz157JIVqWnHmABy40/DssWOsch0/oJ1W1Ge8XgmVKKwg83Gl+VUFdJWL+4n
4MVPX5Oi7QkemPeWyfY6C3z/Ur9ifc+/5UIrIkh9Tb3u15bZ2Hx04LfkwdiUOW4a lupKTXKAL/EOxgcGK8nXUBhOR/kj6kHMk0avoG3J4Y0tM5NNTqhD2HbSuW+TdSf9
gVLQKCB/b1vFaT7sueC4DonBSxpVtbnI0viDPLYN7Vd9AuTzF8ceYpGvId5/AgMB SNc/dUeaUHgvZuvzkaFEI2xxulQsLPD3PGmugJi88wROyf1k3o8f14Yo3y3wWMM/
AAGgGjAYBgkqhkiG9w0BCQcxCwwJc3J0aGlua2VyMA0GCSqGSIb3DQEBCwUAA4IB MdolAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEALbAVckgD4YRmV1lcLQtlL5cy
AQBhTESkmnhrk9h+Otd4LXk0REuDtcT/JYxoTwm8I5Umpys+a3sw9oqgK/6zogm+ oGyqhf+5YfvdlK5jOVVSnT/vE3nPvoz5SQ1ewDTewHdS3nyYirxbyxh730/RhFeU
uEJyC2XcshFJVo2sf0qCvc6EeZHPiW8Ip5PfFk+7FzYIPJC74VEbWSx8O7KMXknl r7nzqvzasH8tsk/R5NImRYDEp1yuCc5aUpQYHeBx2oVMwClCZm1TmmnJbH+EXHZw
aaujpf5Z8kT/ZjoutV6cb38bwHuKeYTSj9iZIMoyIo/DCmnBFAGA0BcsVzYOplCQ TLlLAVaGmu1UbBozb1RIf/LeTO3e8H7S/8D9nPLprjOjVqUUEOWEuxgO+cGO5wkw
M3YYOa1INc5LukZQyL+vlLUmWwG4iDktcrql0Cre1wXOQtNfgAcdhajNtEih60Av AvbysVaMxTmHhKXW74OpOlSXY/i+Ma93OYJ3K7XwuAjrGOIuemjEn8fy2RkyO3KZ
KQNV/iazeQJI+wqn2gZu0muQJsK5uWFyj5kexxPtL/vriWXw4M6Kkirg96TH9l9W 0kW19fiJllm5BFyL+vXwW3S8gD8k2B4hpPlgtAHZk2DztjAoN9KLkg4EUsbQWQ==
CyPnz6CoTaohfq58sGTiorrS
-----END CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY----- -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9TwfkKoMSmJ7Ksqbt5U+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/4yPNSVkRZrlyNkx3UF
bukwwQoXa5/dbrYw8p7yJNHyo6zgL5c6boKESx0pKc+ZFssO9u6LXauDAXTMc1Td +zLtXITwV4ZpBkT/BMe+wkEXAM0xTVd5uUrjCfoIDviIOztuC87qUoyRLaObWGc7
rnRAQnXDXpH4M5tWYVpe9ZTV+7A04oCHXe4QZzWWP7mM9G0XRMZKHapsdPFRDZ3O teQyVqwTL7XQwivs7DwsGrS0kNZ8fuauDrC87gPjLFqxdq/in5xCIeAkhn+AKRUv
F5I9RCMOWAdPt4SwQtGNgG/vqiqt8fe1evjnqKqrtcLUSwOFVdhqkx24PY6KAZiV clM9eeySFalpx5gAcuNPw7LFjrHIdP6CdVtRnvF4JlSisIPNxpflVBXSVi/uJ5bq
LD7tVuDFT1+Tou0JHpj3lsn2Ogt8/1K/Yn3Pv+VCKyJIfU297teW2dh8dOC35MHY Sk1ygC/xDsYHBivJ11AYTkf5I+pBzJNGr6BtyeGNLTOTTU6oQ9h20rlvk3Un/UjX
lDluGoFS0Cggf29bxWk+7LnguA6JwUsaVbW5yNL4gzy2De1XfQLk8xfHHmKRryHe P3VHmlB4L2br85GhRCNscbpULCzw9zxproCYvPMETsn9ZN6PH9eGKN8t8FjDPzHa
fwIDAQAB JQIDAQAB
-----END PUBLIC KEY----- -----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
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
+73hLbLm2l2qrVL7AYRqGAqmug== 4/LJjwVqjnO4rAOIupn2QxH/
-----END PRIVATE KEY----- -----END PRIVATE KEY-----
# 1.生成服务器端私钥
openssl genrsa -out server.key 2048
# 2.生成服务器端公钥
openssl rsa -in server.key -pubout -out server.pem
# 3.生成客户端私钥
openssl genrsa -out client.key 2048
# 4.生成客户端公钥
openssl rsa -in client.key -pubout -out client.pem
# 5.生成 CA 私钥
openssl genrsa -out ca.key 2048
# 6.生成CA的csr文件,保存必要信息
openssl req -new -key ca.key -out ca.csr
# 7.生成CA的证书文件crt文件
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650
# 8.生成服务器端的csr文件,为生成服务器证书做准备
openssl req -new -key server.key -out server.csr
# 9.生成服务器端证书crt文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -days 3650
# 10.生成client 端csr文件,为生成client证书做准备
openssl req -new -key client.key -out client.csr
# 11.生成client 端证书crt文件
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt -days 3650
# 将key文件进行PKCS8编码
openssl pkcs8 -topk8 -in server.key -out server.pkcs8.key -nocrypt
openssl pkcs8 -topk8 -in client.key -out client.pkcs8.key -nocrypt
# 注意生成的 Common Name不能一样,否则客户端会出错
\ No newline at end of file
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIDGjCCAgICCQC4HC3Atwq+0zANBgkqhkiG9w0BAQUFADBPMQswCQYDVQQGEwJD MIIDIjCCAgoCCQC4HC3Atwq+1zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJD
TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQswCQYDVQQKDAJTUjELMAkGA1UE TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQswCQYDVQQKDAJTUjELMAkGA1UE
CwwCU1IxDDAKBgNVBAMMA0FDQzAeFw0yMzAyMDEwMzMyNTBaFw0yMzAzMDMwMzMy CwwCU1IxDjAMBgNVBAMMBVNSLUNBMB4XDTIzMDIwMzA5NTUxOVoXDTMzMDEzMTA5
NTBaME8xCzAJBgNVBAYTAkNOMQswCQYDVQQIDAJHRDELMAkGA1UEBwwCR1oxCzAJ NTUxOVowVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEL
BgNVBAoMAlNSMQswCQYDVQQLDAJTUjEMMAoGA1UEAwwDQUNDMIIBIjANBgkqhkiG MAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1TRVJWRVIwggEi
9w0BAQEFAAOCAQ8AMIIBCgKCAQEArSevYBRhek89GA1hEOWb5tc8hIMic3fuQB99 MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt718RXKUVJwm4V2GoTk0X2d4R
01QOkgAFM1h33vtX+FOjVlEchdn/S0RLVGatnRSIkcnJufOewDVmuvPYrfIxg0bE 8RsmpdrxQnyAbQE8P4BxJAPZYCrYZQ4PMh9mcMcCeSHq6hMSPlgZKxYOwHJAOI7g
gyG0h+VyX4fZtOJPl7T5aq69n3XuAAMd9vw250WwnbaJ465EdHporZnwTf5qWkFg /WcbtGfsXkzqyfnZtG8KACP35ykcgffGVi5MBIM1aG7ah11o0ZpmFtueT8cYWd4W
xkVOc/6vC1dNOrWo2g18pIy+tLSYb/hw5l95T4EhS8qMOvq7wHh2ukUsb1hhm5Hu 1+NKfObFDviU1g8wV5ka6L+zeih+5Eiy6Zd9m8q+DjdTHaQVTlgIrLLyn+6pkwgt
I3aGTByVYLjxssruTQXMaryUmiao1/JsgAnZwgwMJJv5KlTy2iW03NzItKqh5kdb 3EMxVBy7wN+k2RK656iVqRHc4ttPWWc7HCVa1u9XiFR2K56qJDKLt4nEWJ3O+qC0
K/WglktBgrEkJLtgIVcHa4yC5WQz1gQ/NsgA3dIMprQWdXxBBQIDAQABMA0GCSqG D++l8N/blZI3TYU07nC9j3mdWs8pOSvAQO+1Gg76LTM2T1bGL5at1ZYoRBmfAgMB
SIb3DQEBBQUAA4IBAQCeGRWtKf6bZOcKxoT6H5U0qMKHdAeJudtOyxYB/Nv66Ah6 AAEwDQYJKoZIhvcNAQEFBQADggEBAHOgZsqs4xb7i58xTZZ03fcOMz62aUh9vHNY
Rzl5v46EAU4kStpKURKfu/uDiezilCNILLL7FiuSZh9Q8evunmC6zjs5lVwdvBeC 09ifHnrJq0R3aJmxB7NluJ+PCx7j8MouTzxLrpon4EPRu5RmryXgQrMP1wfFTelS
TdAK7NlNGyNxoFdmsrgySUcf84SqsZypWvKnKNd1Kavrl9IpgHuUANTjh5CH9hX8 iX0pNfSAsc5cXu33i/fBQmV6UNcaQ00toN7cj4FqQ0VVQzFpZ/Mv7nllrDR3Z5PP
ua73Yy5yOQ6p+m9gx4QnwdXeCYoywb5EL59LoYMyI0sZDx3by3CO7ISGYjkTEEgr gYmrzHy5WKet/zHPq8T95L1/AeOIVkr1fOuGQEa/LMgXCLITWQrlxoFQPLpRTW3B
UxycDYiKXgxUWPvRaS7jjrA6jEhMaEvYDVNlT0OvKvesIuUayKFCiVEWcV4jJxyv m79EXCOK2ra6NmyF47aa3BRkn3q4ySoUkkpvWdTGIxnjlTh/t8CWfmsXAETpiqNN
oxp2hAzSo3Fho74YBeYoZ2E/FcgDExjgLDUhCF8I 6VgagtHeg/qMqD2S0Q2GBXHolpFe9gfKStpQXUVF9njZrFWAdMI=
-----END CERTIFICATE----- -----END CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST----- -----BEGIN CERTIFICATE REQUEST-----
MIICrjCCAZYCAQAwTzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH MIICmjCCAYICAQAwVTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMQwwCgYDVQQDDANBQ0MwggEi DAJHWjELMAkGA1UECgwCU1IxCzAJBgNVBAsMAlNSMRIwEAYDVQQDDAlTUi1TRVJW
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtJ69gFGF6Tz0YDWEQ5Zvm1zyE RVIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt718RXKUVJwm4V2Go
gyJzd+5AH33TVA6SAAUzWHfe+1f4U6NWURyF2f9LREtUZq2dFIiRycm5857ANWa6 Tk0X2d4R8RsmpdrxQnyAbQE8P4BxJAPZYCrYZQ4PMh9mcMcCeSHq6hMSPlgZKxYO
89it8jGDRsSDIbSH5XJfh9m04k+XtPlqrr2fde4AAx32/DbnRbCdtonjrkR0emit wHJAOI7g/WcbtGfsXkzqyfnZtG8KACP35ykcgffGVi5MBIM1aG7ah11o0ZpmFtue
mfBN/mpaQWDGRU5z/q8LV006tajaDXykjL60tJhv+HDmX3lPgSFLyow6+rvAeHa6 T8cYWd4W1+NKfObFDviU1g8wV5ka6L+zeih+5Eiy6Zd9m8q+DjdTHaQVTlgIrLLy
RSxvWGGbke4jdoZMHJVguPGyyu5NBcxqvJSaJqjX8myACdnCDAwkm/kqVPLaJbTc n+6pkwgt3EMxVBy7wN+k2RK656iVqRHc4ttPWWc7HCVa1u9XiFR2K56qJDKLt4nE
3Mi0qqHmR1sr9aCWS0GCsSQku2AhVwdrjILlZDPWBD82yADd0gymtBZ1fEEFAgMB WJ3O+qC0D++l8N/blZI3TYU07nC9j3mdWs8pOSvAQO+1Gg76LTM2T1bGL5at1ZYo
AAGgGjAYBgkqhkiG9w0BCQcxCwwJc3J0aGlua2VyMA0GCSqGSIb3DQEBCwUAA4IB RBmfAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAa4KUVDxcBOjIewXpPBMEQOW2
AQA4prOJNCytDJw8WxVu92t8JR4Acxa1bDKsrvvl/OKkDzZT0/yfZUsVq4pSdxzI cTD0SQminwEnJJAC8ocp34Ia9ZZnBz3G7izQ9BTWL4iTlBXkcpqM4SoUYTAKbXIi
OgYiuYSgwC7kBoq4MqzV1MBeO6/kOaOKiPHbJyIrKuqEZ8Nxe9RKOZ40AE+zCUBA JQZbFPeacn0jCp3X9tl8Pea4lWNfT03iuvDA2izo5TmbEufO9SXSsm5UvrPAXuk8
TzSX+errvc+ZQweGsmjTenic3nT9wuFgM2B7VnpDagzvhbSlG7NdGldrhBMWL3JY Q1jzlk3Se8SwI240Vm6OTidS3YdM7ldet+ds4aUa1HuR75jUYy44jjDap4qCnmyn
IKiovSmAoSndeT+7+7qkGPx48l8sTGdPvziRxPVHtmFPfLMacUDMVE8BRdEQ+xtt 4NAH7jB1EeqbJt6I8U9KbUQxbHeaxzWtD2L3pcsVD+JsADz4rNcJm+UD2vII425B
Nh6R+GPPfchGOfH3/mEeYAgUgS4/m0AqzODyEB3SUcz/UDlYBfO9uhOPkCnbzsdz uTIQM/pU/FveRqt2W0r9GIKdKztE6RdFTU3Czfu4VRb0P+iH2K0ec4WRcgjyog==
L0JCPdF3ZR5yjQEWJJGnEM0r
-----END CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST-----
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY----- -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArSevYBRhek89GA1hEOWb MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAre9fEVylFScJuFdhqE5N
5tc8hIMic3fuQB9901QOkgAFM1h33vtX+FOjVlEchdn/S0RLVGatnRSIkcnJufOe F9neEfEbJqXa8UJ8gG0BPD+AcSQD2WAq2GUODzIfZnDHAnkh6uoTEj5YGSsWDsBy
wDVmuvPYrfIxg0bEgyG0h+VyX4fZtOJPl7T5aq69n3XuAAMd9vw250WwnbaJ465E QDiO4P1nG7Rn7F5M6sn52bRvCgAj9+cpHIH3xlYuTASDNWhu2oddaNGaZhbbnk/H
dHporZnwTf5qWkFgxkVOc/6vC1dNOrWo2g18pIy+tLSYb/hw5l95T4EhS8qMOvq7 GFneFtfjSnzmxQ74lNYPMFeZGui/s3oofuRIsumXfZvKvg43Ux2kFU5YCKyy8p/u
wHh2ukUsb1hhm5HuI3aGTByVYLjxssruTQXMaryUmiao1/JsgAnZwgwMJJv5KlTy qZMILdxDMVQcu8DfpNkSuueolakR3OLbT1lnOxwlWtbvV4hUdiueqiQyi7eJxFid
2iW03NzItKqh5kdbK/WglktBgrEkJLtgIVcHa4yC5WQz1gQ/NsgA3dIMprQWdXxB zvqgtA/vpfDf25WSN02FNO5wvY95nVrPKTkrwEDvtRoO+i0zNk9Wxi+WrdWWKEQZ
BQIDAQAB nwIDAQAB
-----END PUBLIC KEY----- -----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
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
AQtIg483qMemUN48HxG6l1wNiA== hQzxGsuou5osqIml3CjtBp0=
-----END PRIVATE KEY----- -----END PRIVATE KEY-----
...@@ -12,15 +12,15 @@ import io.swagger.annotations.Api; ...@@ -12,15 +12,15 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import iot.sixiang.license.auth.AuthManager;
import iot.sixiang.license.device.DeviceManager;
import iot.sixiang.license.entity.Permission; import iot.sixiang.license.entity.Permission;
import iot.sixiang.license.entity.Report;
import iot.sixiang.license.entity.User; import iot.sixiang.license.entity.User;
import iot.sixiang.license.entity.UserPermission; import iot.sixiang.license.entity.UserPermission;
import iot.sixiang.license.handler.IotLicenseException; import iot.sixiang.license.handler.IotLicenseException;
import iot.sixiang.license.jwt.UserUtils; import iot.sixiang.license.jwt.UserUtils;
import iot.sixiang.license.log.BusinessType; import iot.sixiang.license.log.BusinessType;
import iot.sixiang.license.log.MyLog; import iot.sixiang.license.log.MyLog;
import iot.sixiang.license.mapper.UserMapper;
import iot.sixiang.license.model.BaseResult; import iot.sixiang.license.model.BaseResult;
import iot.sixiang.license.model.PageInfoModel; import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.PageResult; import iot.sixiang.license.model.PageResult;
...@@ -28,10 +28,7 @@ import iot.sixiang.license.model.ResResult; ...@@ -28,10 +28,7 @@ import iot.sixiang.license.model.ResResult;
import iot.sixiang.license.model.dto.AssignUserPermissionDTO; import iot.sixiang.license.model.dto.AssignUserPermissionDTO;
import iot.sixiang.license.model.dto.UpdateNotifyDTO; import iot.sixiang.license.model.dto.UpdateNotifyDTO;
import iot.sixiang.license.model.vo.*; import iot.sixiang.license.model.vo.*;
import iot.sixiang.license.service.PermissionService; import iot.sixiang.license.service.*;
import iot.sixiang.license.service.ReportService;
import iot.sixiang.license.service.UserPermissionService;
import iot.sixiang.license.service.UserService;
import iot.sixiang.license.util.CommonUtil; import iot.sixiang.license.util.CommonUtil;
import iot.sixiang.license.util.EmailUtils; import iot.sixiang.license.util.EmailUtils;
import iot.sixiang.license.util.TreeUtil; import iot.sixiang.license.util.TreeUtil;
...@@ -45,7 +42,6 @@ import org.springframework.web.bind.annotation.*; ...@@ -45,7 +42,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -63,12 +59,20 @@ public class UserController { ...@@ -63,12 +59,20 @@ public class UserController {
@Resource @Resource
EmailUtils emailUtils; EmailUtils emailUtils;
@Autowired @Resource
private UserService userService; private UserService userService;
@Resource @Resource
private PermissionService permissionService; private PermissionService permissionService;
@Resource @Resource
private UserPermissionService userPermissionService; private UserPermissionService userPermissionService;
@Resource
private ApplyService applyService;
@Resource
private DeviceService deviceService;
@Resource
private DeviceManager deviceManager;
@Resource
private AuthManager authManager;
@Value("${rsa.private_key}") @Value("${rsa.private_key}")
private String PRIVATE_KRY; private String PRIVATE_KRY;
...@@ -147,8 +151,16 @@ public class UserController { ...@@ -147,8 +151,16 @@ public class UserController {
if (!CommonUtil.checkPermission(userPermissions, 2)) { if (!CommonUtil.checkPermission(userPermissions, 2)) {
throw new IotLicenseException(403, "您无删除用户权限!"); throw new IotLicenseException(403, "您无删除用户权限!");
} }
List<UserChildIdVO> childUser = userService.getChildUser(Integer.parseInt(userId));
if (!childUser.isEmpty()) {
throw new IotLicenseException(403, "该账户存在子账号,请先删除所有子账号!");
}
deviceService.deleteByUserId(Integer.parseInt(userId));
applyService.deleteByUserId(Integer.parseInt(userId));
boolean res = userService.deleteUser(Integer.parseInt(userId)); boolean res = userService.deleteUser(Integer.parseInt(userId));
userPermissionService.deleteUserPermission(Integer.parseInt(userId)); userPermissionService.deleteUserPermission(Integer.parseInt(userId));
deviceManager.initDevices();
authManager.initApps();
UserUtils.removeToken(userId); UserUtils.removeToken(userId);
UserUtils.removeTokenExp(userId); UserUtils.removeTokenExp(userId);
if (res) { if (res) {
......
...@@ -21,4 +21,6 @@ public interface ApplyMapper extends BaseMapper<Apply> { ...@@ -21,4 +21,6 @@ public interface ApplyMapper extends BaseMapper<Apply> {
List<AppVo> getAppList(String appName, List<Integer> userChildIds); List<AppVo> getAppList(String appName, List<Integer> userChildIds);
Apply getApplyByAppName(String appName); Apply getApplyByAppName(String appName);
void deleteByUserId(Integer userId);
} }
...@@ -18,4 +18,6 @@ public interface DeviceMapper extends BaseMapper<Device> { ...@@ -18,4 +18,6 @@ public interface DeviceMapper extends BaseMapper<Device> {
boolean addDevice(String sn, String appId); boolean addDevice(String sn, String appId);
int updateDeviceById(Device device); int updateDeviceById(Device device);
void deleteByUserId(int userId);
} }
...@@ -20,4 +20,6 @@ public interface ApplyService extends IService<Apply> { ...@@ -20,4 +20,6 @@ public interface ApplyService extends IService<Apply> {
boolean addApply(String appName, String appKey, int userId); boolean addApply(String appName, String appKey, int userId);
PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName, List<Integer> userChildIds); PageInfoModel<AppVo> getAppList(int pageNo, int pageSize, String appName, List<Integer> userChildIds);
void deleteByUserId(Integer userId);
} }
...@@ -30,4 +30,6 @@ public interface DeviceService extends IService<Device> { ...@@ -30,4 +30,6 @@ public interface DeviceService extends IService<Device> {
ResResult getBindStatus(TerminalDevieUnBindDTO terminalDevieUnBindDTO); ResResult getBindStatus(TerminalDevieUnBindDTO terminalDevieUnBindDTO);
BaseResult platFormBind(PlatFormBindDTO platFormBindDTO); BaseResult platFormBind(PlatFormBindDTO platFormBindDTO);
void deleteByUserId(int userId);
} }
...@@ -71,4 +71,9 @@ public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements ...@@ -71,4 +71,9 @@ public class ApplyServiceImpl extends ServiceImpl<ApplyMapper, Apply> implements
objectPageInfoModel.setResult(result); objectPageInfoModel.setResult(result);
return objectPageInfoModel; return objectPageInfoModel;
} }
@Override
public void deleteByUserId(Integer userId) {
applyMapper.deleteByUserId(userId);
}
} }
...@@ -156,7 +156,15 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme ...@@ -156,7 +156,15 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
if (deviceId.equals(device.getDeviceId())) { if (deviceId.equals(device.getDeviceId())) {
return BaseResult.success(); return BaseResult.success();
} else { } else {
return BaseResult.failed().setMsgValue("设备sn已被绑定"); return BaseResult.failed().setMsgValue("设备编码已被绑定");
}
}
LambdaQueryWrapper<Device> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Device::getSn, sn).last("limit 1");
Device device1 = deviceMapper.selectOne(lambdaQueryWrapper);
if (device1 != null) {
if (!deviceId.equals(device1.getDeviceId())) {
return BaseResult.failed().setMsgValue("SN已存在");
} }
} }
LambdaQueryWrapper<Device> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Device> wrapper = new LambdaQueryWrapper<>();
...@@ -180,4 +188,9 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme ...@@ -180,4 +188,9 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> impleme
return BaseResult.failed(); return BaseResult.failed();
} }
} }
@Override
public void deleteByUserId(int userId) {
deviceMapper.deleteByUserId(userId);
}
} }
...@@ -45,7 +45,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us ...@@ -45,7 +45,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg()); throw new IotLicenseException(ResultCode.VALIDATE_FAILED.getCode(), ResultCode.VALIDATE_FAILED.getMsg());
} }
List<UserVo> records = userMapper.getUserList(userName, company, userIds); List<UserVo> records = userMapper.getUserList(userName, company, userIds);
records = records.stream().sorted(Comparator.comparing(UserVo::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList()); records = records.stream().sorted(Comparator.comparing(UserVo::getCreateTime, Comparator.reverseOrder())).sorted(Comparator.comparing(UserVo::getLevel)).collect(Collectors.toList());
List<UserVo> result = new ArrayList<>(); List<UserVo> result = new ArrayList<>();
int begin = (pageNo - 1) * pageSize; int begin = (pageNo - 1) * pageSize;
if (begin >= 0 && records.size() > 0) { if (begin >= 0 && records.size() > 0) {
......
...@@ -6,9 +6,15 @@ ...@@ -6,9 +6,15 @@
app.app_id, app.app_name, app.app_key, app.create_time, app.update_time, us.user_id, app.app_id, app.app_name, app.app_key, app.create_time, app.update_time, us.user_id,
COUNT(sn) AS deviceCount, us.user_name, us.company COUNT(sn) AS deviceCount, us.user_name, us.company
</sql> </sql>
<insert id="addApply" parameterType="iot.sixiang.license.entity.Apply"> <insert id="addApply" parameterType="iot.sixiang.license.entity.Apply">
insert into apply(app_id,app_name, app_key, user_id, create_time, update_time) values (#{appId}, #{appName}, #{appKey}, #{userId}, now(), now()) insert into apply(app_id,app_name, app_key, user_id, create_time, update_time) values (#{appId}, #{appName}, #{appKey}, #{userId}, now(), now())
</insert> </insert>
<delete id="deleteByUserId">
delete from `apply` where user_id = #{userId}
</delete>
<select id="getAppList" resultType="iot.sixiang.license.model.vo.AppVo"> <select id="getAppList" resultType="iot.sixiang.license.model.vo.AppVo">
SELECT <include refid="AppVoColumn"/> SELECT <include refid="AppVoColumn"/>
FROM apply AS app LEFT JOIN device AS de ON app.app_id = de.app_id FROM apply AS app LEFT JOIN device AS de ON app.app_id = de.app_id
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="iot.sixiang.license.mapper.DeviceMapper"> <mapper namespace="iot.sixiang.license.mapper.DeviceMapper">
<delete id="deleteByUserId">
delete device from device,apply,`user` WHERE device.app_id = apply.app_id
and user.user_id = apply.user_id and user.user_id = #{userId}
</delete>
<select id="getDeviceList" resultType="iot.sixiang.license.model.vo.DeviceVo"> <select id="getDeviceList" resultType="iot.sixiang.license.model.vo.DeviceVo">
SELECT de.device_id, de.app_id, app_name,user_name,sn,sn_bind,de.status,de.create_time,de.update_time,de.device_id IN (select SELECT de.device_id, de.app_id, app_name,user_name,sn,sn_bind,de.status,de.create_time,de.update_time,de.device_id IN (select
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
</update> </update>
<select id="getUserList" resultType="iot.sixiang.license.model.vo.UserVo"> <select id="getUserList" resultType="iot.sixiang.license.model.vo.UserVo">
SELECT user.user_id, user_name, password, company, user.create_time, user.update_time, SELECT user.user_id, user_name, password, company, user.level, user.create_time, user.update_time,
COUNT(device.`device_id`) totalDevice, COUNT(device.`device_id`) totalDevice,
COUNT(if(device.device_id is NOT NULL, if (device.`status` = 0 or device.`status` is NULL, 1, NULL), NULL)) COUNT(if(device.device_id is NOT NULL, if (device.`status` = 0 or device.`status` is NULL, 1, NULL), NULL))
unUseDevice, unUseDevice,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment