generator-jhipster 7.3.1 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/jhipster-command.js +2 -2
- package/cli/program.js +31 -29
- package/generators/app/index.js +30 -25
- package/generators/aws/index.js +8 -8
- package/generators/aws/lib/eb.js +1 -1
- package/generators/azure-app-service/index.js +13 -9
- package/generators/azure-spring-cloud/index.js +13 -9
- package/generators/bootstrap/index.js +49 -59
- package/generators/ci-cd/index.js +10 -8
- package/generators/client/files-common.js +6 -2
- package/generators/client/files-react.js +10 -1
- package/generators/client/files-vue.js +40 -1
- package/generators/client/index.js +42 -31
- package/generators/client/needle-api/needle-client-vue.js +1 -1
- package/generators/client/templates/angular/.eslintrc.json.ejs +1 -0
- package/generators/client/templates/angular/package.json +14 -14
- package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +2 -2
- package/generators/client/templates/common/package.json +3 -3
- package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +56 -0
- package/generators/client/templates/react/.eslintrc.json.ejs +1 -0
- package/generators/client/templates/react/package.json +44 -43
- package/generators/client/templates/react/package.json.ejs +3 -0
- package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +0 -3
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/configuration/configuration.tsx.ejs +2 -2
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/gateway/gateway.tsx.ejs +2 -2
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +6 -6
- package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +8 -8
- package/generators/client/templates/react/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.tsx.ejs +1 -1
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.tsx.ejs +3 -3
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +7 -7
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-components.tsx.ejs +1 -1
- package/generators/client/templates/react/webpack/webpack.dev.js.ejs +17 -1
- package/generators/client/templates/react/webpack/webpack.prod.js.ejs +13 -1
- package/generators/client/templates/vue/.eslintrc.js.ejs +8 -5
- package/generators/client/templates/vue/package.json +31 -38
- package/generators/client/templates/vue/package.json.ejs +8 -10
- package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +1 -2
- package/generators/client/templates/vue/src/main/webapp/app/account/settings/settings.vue.ejs +7 -1
- package/generators/client/templates/vue/src/main/webapp/app/admin/configuration/configuration.vue.ejs +1 -1
- package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.component.ts.ejs +1 -1
- package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +12 -1
- package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +6 -0
- package/generators/client/templates/vue/src/main/webapp/app/declarations.d.ts.ejs +41 -0
- package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.component.ts.ejs +34 -0
- package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.vue.ejs +13 -0
- package/generators/client/templates/vue/src/main/webapp/app/entities/entities.component.ts.ejs +12 -0
- package/generators/client/templates/vue/src/main/webapp/app/entities/entities.vue.ejs +5 -0
- package/generators/client/templates/vue/src/main/webapp/app/index.ts.ejs +19 -0
- package/generators/client/templates/vue/src/main/webapp/app/locale/translation.service.ts.ejs +25 -8
- package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +9 -4
- package/generators/client/templates/vue/src/main/webapp/app/router/entities.ts.ejs +44 -1
- package/generators/client/templates/vue/src/main/webapp/app/router/index.ts.ejs +11 -0
- package/generators/client/templates/vue/src/main/webapp/app/shims-vue.d.ts.ejs +0 -10
- package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +19 -8
- package/generators/client/templates/vue/src/test/javascript/spec/app/entities/entities-menu.spec.ts.ejs +52 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.component.ts.ejs +4 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.vue.ejs +7 -0
- package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-router.ts.ejs +1 -0
- package/generators/client/templates/vue/tsconfig.json.ejs +5 -9
- package/generators/client/templates/vue/tsconfig.spec.json.ejs +37 -0
- package/generators/client/templates/vue/webpack/config.js.ejs +2 -0
- package/generators/client/templates/vue/webpack/vue.utils.js.ejs +13 -12
- package/generators/client/templates/vue/webpack/webpack.common.js.ejs +64 -50
- package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +17 -68
- package/generators/client/templates/vue/webpack/webpack.microfrontend.js.jhi.vue.ejs +77 -0
- package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +1 -30
- package/generators/cloudfoundry/index.js +9 -9
- package/generators/common/index.js +12 -10
- package/generators/common/templates/package.json +4 -4
- package/generators/cypress/index.js +12 -9
- package/generators/cypress/templates/cypress.json.ejs +3 -0
- package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +3 -3
- package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +2 -2
- package/generators/database-changelog/index.js +33 -22
- package/generators/database-changelog-liquibase/index.js +12 -8
- package/generators/docker-compose/index.js +11 -12
- package/generators/entities/index.js +35 -26
- package/generators/entities-client/index.js +10 -7
- package/generators/entity/index.js +25 -28
- package/generators/entity-client/files.js +6 -11
- package/generators/entity-client/index.js +9 -7
- package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +4 -4
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +1 -1
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +7 -7
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -1
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.service.ts.ejs +2 -6
- package/generators/entity-i18n/index.js +7 -4
- package/generators/entity-server/index.js +11 -8
- package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +39 -41
- package/generators/gae/index.js +10 -10
- package/generators/generator-base-blueprint.js +7 -44
- package/generators/generator-base.js +7 -0
- package/generators/generator-constants.js +20 -18
- package/generators/generator-transforms.js +27 -23
- package/generators/heroku/index.js +12 -10
- package/generators/init/constants.cjs +1 -1
- package/generators/kubernetes/files.js +3 -0
- package/generators/kubernetes/index.js +10 -10
- package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -1
- package/generators/kubernetes/templates/deployment.yml.ejs +8 -3
- package/generators/kubernetes/templates/istio/destination-rule.yml.ejs +1 -1
- package/generators/kubernetes/templates/istio/gateway/grafana-gateway.yml.ejs +5 -2
- package/generators/kubernetes/templates/istio/gateway/jhipster-grafana-gateway.yml.ejs +5 -2
- package/generators/kubernetes/templates/istio/gateway/kiali-gateway.yml.ejs +10 -8
- package/generators/kubernetes/templates/istio/gateway/zipkin-gateway.yml.ejs +5 -2
- package/generators/kubernetes/templates/istio/gateway.yml.ejs +7 -5
- package/generators/kubernetes/templates/secret/couchbase-secret.yml.ejs +9 -0
- package/generators/kubernetes-base.js +1 -0
- package/generators/kubernetes-helm/files.js +3 -8
- package/generators/kubernetes-helm/index.js +10 -10
- package/generators/kubernetes-helm/templates/README-KUBERNETES-HELM.md.ejs +0 -1
- package/generators/kubernetes-helm/templates/app/Chart.yml.ejs +5 -0
- package/generators/kubernetes-helm/templates/app/helpers.tpl.ejs +0 -11
- package/generators/kubernetes-helm/templates/app/requirements.yml.ejs +5 -0
- package/generators/kubernetes-helm/templates/app/values.yml.ejs +68 -5
- package/generators/kubernetes-helm/templates/csvc/Chart.yml.ejs +1 -1
- package/generators/kubernetes-helm/templates/csvc/requirements.yml.ejs +1 -1
- package/generators/kubernetes-knative/index.js +10 -10
- package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +6 -4
- package/generators/kubernetes-knative/templates/service.yml.ejs +1 -1
- package/generators/languages/index.js +13 -13
- package/generators/openapi-client/index.js +13 -10
- package/generators/openshift/index.js +10 -11
- package/generators/openshift/templates/deployment.yml.ejs +1 -1
- package/generators/page/index.js +12 -10
- package/generators/server/__snapshots__/generator.spec.mjs.snap +12 -0
- package/generators/server/files.js +12 -0
- package/generators/server/index.js +32 -18
- package/generators/server/templates/gradle.properties.ejs +10 -10
- package/generators/server/templates/pom.xml.ejs +6 -6
- package/generators/server/templates/src/main/docker/app.yml.ejs +1 -1
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +2 -2
- package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +0 -1
- package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs +68 -0
- package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +29 -4
- package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +21 -9
- package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +13 -5
- package/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +1 -1
- package/generators/server/templates/src/test/java/package/management/SecurityMetersServiceTests.java.ejs +113 -0
- package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +6 -1
- package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderSecurityMetersTests.java.ejs +198 -0
- package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderTest.java.ejs +13 -3
- package/generators/server/templates/src/test/java/package/security/oauth2/AuthorizationHeaderUtilTest.java.ejs +16 -2
- package/generators/server/templates/src/test/java/package/security/oauth2/CustomClaimConverterIT.java.ejs +63 -0
- package/generators/spring-controller/index.js +9 -7
- package/generators/spring-service/index.js +10 -7
- package/generators/upgrade/index.js +3 -4
- package/generators/utils.js +2 -2
- package/generators/workspaces/index.js +16 -7
- package/jdl/jhipster/default-application-options.js +9 -7
- package/package.json +15 -15
- package/utils/entity.js +14 -0
- package/utils/multi-step-transform/index.js +8 -8
|
@@ -190,7 +190,7 @@ objects:
|
|
|
190
190
|
<%_ if (app.databaseTypeCouchbase) { _%>
|
|
191
191
|
- name: SPRING_COUCHBASE_CONNECTION_STRING
|
|
192
192
|
value: ${APPLICATION_NAME}-couchbase
|
|
193
|
-
- name:
|
|
193
|
+
- name: JHIPSTER_DATABASE_COUCHBASE_BUCKET_NAME
|
|
194
194
|
value: ${APPLICATION_NAME}
|
|
195
195
|
<%_ } _%>
|
|
196
196
|
<%_ if (app.searchEngineElasticsearch) { _%>
|
package/generators/page/index.js
CHANGED
|
@@ -27,8 +27,6 @@ const { PROTRACTOR } = require('../../jdl/jhipster/test-framework-types');
|
|
|
27
27
|
|
|
28
28
|
const { VUE } = constants.SUPPORTED_CLIENT_FRAMEWORKS;
|
|
29
29
|
|
|
30
|
-
let useBlueprints;
|
|
31
|
-
|
|
32
30
|
module.exports = class extends BaseBlueprintGenerator {
|
|
33
31
|
constructor(args, options, features) {
|
|
34
32
|
super(args, options, features);
|
|
@@ -61,8 +59,12 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
61
59
|
this.loadRuntimeOptions();
|
|
62
60
|
|
|
63
61
|
this.rootGenerator = this.env.rootGenerator() === this;
|
|
62
|
+
}
|
|
64
63
|
|
|
65
|
-
|
|
64
|
+
async _postConstruct() {
|
|
65
|
+
if (!this.fromBlueprint) {
|
|
66
|
+
await this.composeWithBlueprints(GENERATOR_PAGE);
|
|
67
|
+
}
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
_initializing() {
|
|
@@ -81,7 +83,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
get initializing() {
|
|
84
|
-
if (
|
|
86
|
+
if (this.delegateToBlueprint) return {};
|
|
85
87
|
return this._initializing();
|
|
86
88
|
}
|
|
87
89
|
|
|
@@ -92,7 +94,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
get prompting() {
|
|
95
|
-
if (
|
|
97
|
+
if (this.delegateToBlueprint) return {};
|
|
96
98
|
return this._prompting();
|
|
97
99
|
}
|
|
98
100
|
|
|
@@ -110,7 +112,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
110
112
|
}
|
|
111
113
|
|
|
112
114
|
get configuring() {
|
|
113
|
-
if (
|
|
115
|
+
if (this.delegateToBlueprint) return {};
|
|
114
116
|
return this._configuring();
|
|
115
117
|
}
|
|
116
118
|
|
|
@@ -130,7 +132,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
get default() {
|
|
133
|
-
if (
|
|
135
|
+
if (this.delegateToBlueprint) return {};
|
|
134
136
|
return this._default();
|
|
135
137
|
}
|
|
136
138
|
|
|
@@ -147,7 +149,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
147
149
|
}
|
|
148
150
|
|
|
149
151
|
get writing() {
|
|
150
|
-
if (
|
|
152
|
+
if (this.delegateToBlueprint) return {};
|
|
151
153
|
return this._writing();
|
|
152
154
|
}
|
|
153
155
|
|
|
@@ -165,7 +167,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
165
167
|
}
|
|
166
168
|
|
|
167
169
|
get postWriting() {
|
|
168
|
-
if (
|
|
170
|
+
if (this.delegateToBlueprint) return {};
|
|
169
171
|
return this._postWriting();
|
|
170
172
|
}
|
|
171
173
|
|
|
@@ -183,7 +185,7 @@ module.exports = class extends BaseBlueprintGenerator {
|
|
|
183
185
|
}
|
|
184
186
|
|
|
185
187
|
get end() {
|
|
186
|
-
if (
|
|
188
|
+
if (this.delegateToBlueprint) return {};
|
|
187
189
|
return this._end();
|
|
188
190
|
}
|
|
189
191
|
};
|
|
@@ -378,6 +378,10 @@ Object {
|
|
|
378
378
|
"file": "package/security/jwt/JWTFilter.java",
|
|
379
379
|
"renameTo": [Function],
|
|
380
380
|
},
|
|
381
|
+
Object {
|
|
382
|
+
"file": "package/management/SecurityMetersService.java",
|
|
383
|
+
"renameTo": [Function],
|
|
384
|
+
},
|
|
381
385
|
],
|
|
382
386
|
},
|
|
383
387
|
Object {
|
|
@@ -1130,10 +1134,18 @@ Object {
|
|
|
1130
1134
|
"condition": [Function],
|
|
1131
1135
|
"path": "src/test/java/",
|
|
1132
1136
|
"templates": Array [
|
|
1137
|
+
Object {
|
|
1138
|
+
"file": "package/management/SecurityMetersServiceTests.java",
|
|
1139
|
+
"renameTo": [Function],
|
|
1140
|
+
},
|
|
1133
1141
|
Object {
|
|
1134
1142
|
"file": "package/security/jwt/TokenProviderTest.java",
|
|
1135
1143
|
"renameTo": [Function],
|
|
1136
1144
|
},
|
|
1145
|
+
Object {
|
|
1146
|
+
"file": "package/security/jwt/TokenProviderSecurityMetersTests.java",
|
|
1147
|
+
"renameTo": [Function],
|
|
1148
|
+
},
|
|
1137
1149
|
Object {
|
|
1138
1150
|
"file": "package/security/jwt/JWTFilterTest.java",
|
|
1139
1151
|
"renameTo": [Function],
|
|
@@ -452,6 +452,10 @@ const baseServerFiles = {
|
|
|
452
452
|
file: 'package/security/jwt/JWTFilter.java',
|
|
453
453
|
renameTo: generator => `${generator.javaDir}security/jwt/JWTFilter.java`,
|
|
454
454
|
},
|
|
455
|
+
{
|
|
456
|
+
file: 'package/management/SecurityMetersService.java',
|
|
457
|
+
renameTo: generator => `${generator.javaDir}management/SecurityMetersService.java`,
|
|
458
|
+
},
|
|
455
459
|
],
|
|
456
460
|
},
|
|
457
461
|
{
|
|
@@ -1598,10 +1602,18 @@ const baseServerFiles = {
|
|
|
1598
1602
|
condition: generator => generator.authenticationType === JWT,
|
|
1599
1603
|
path: SERVER_TEST_SRC_DIR,
|
|
1600
1604
|
templates: [
|
|
1605
|
+
{
|
|
1606
|
+
file: 'package/management/SecurityMetersServiceTests.java',
|
|
1607
|
+
renameTo: generator => `${generator.testDir}management/SecurityMetersServiceTests.java`,
|
|
1608
|
+
},
|
|
1601
1609
|
{
|
|
1602
1610
|
file: 'package/security/jwt/TokenProviderTest.java',
|
|
1603
1611
|
renameTo: generator => `${generator.testDir}security/jwt/TokenProviderTest.java`,
|
|
1604
1612
|
},
|
|
1613
|
+
{
|
|
1614
|
+
file: 'package/security/jwt/TokenProviderSecurityMetersTests.java',
|
|
1615
|
+
renameTo: generator => `${generator.testDir}security/jwt/TokenProviderSecurityMetersTests.java`,
|
|
1616
|
+
},
|
|
1605
1617
|
{
|
|
1606
1618
|
file: 'package/security/jwt/JWTFilterTest.java',
|
|
1607
1619
|
renameTo: generator => `${generator.testDir}security/jwt/JWTFilterTest.java`,
|
|
@@ -54,8 +54,6 @@ const NO_CACHE = cacheTypes.NO;
|
|
|
54
54
|
const NO_DATABASE = databaseTypes.NO;
|
|
55
55
|
const NO_WEBSOCKET = websocketTypes.FALSE;
|
|
56
56
|
|
|
57
|
-
let useBlueprints;
|
|
58
|
-
|
|
59
57
|
module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
60
58
|
constructor(args, options, features) {
|
|
61
59
|
super(args, options, { unique: 'namespace', ...features });
|
|
@@ -75,11 +73,15 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
75
73
|
|
|
76
74
|
// preserve old jhipsterVersion value for cleanup which occurs after new config is written into disk
|
|
77
75
|
this.jhipsterOldVersion = this.jhipsterConfig.jhipsterVersion;
|
|
76
|
+
}
|
|
78
77
|
|
|
79
|
-
|
|
78
|
+
async _postConstruct() {
|
|
79
|
+
if (!this.fromBlueprint) {
|
|
80
|
+
await this.composeWithBlueprints(GENERATOR_SERVER);
|
|
81
|
+
}
|
|
80
82
|
|
|
81
83
|
// Not using normal blueprints or this is a normal blueprint.
|
|
82
|
-
if (!
|
|
84
|
+
if ((!this.fromBlueprint && !this.delegateToBlueprint) || (this.fromBlueprint && this.sbsBlueprint)) {
|
|
83
85
|
this.setFeatures({
|
|
84
86
|
customInstallTask: async function customInstallTask(preferredPm, defaultInstallTask) {
|
|
85
87
|
const buildTool = this.jhipsterConfig.buildTool;
|
|
@@ -231,7 +233,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
231
233
|
}
|
|
232
234
|
|
|
233
235
|
get initializing() {
|
|
234
|
-
if (
|
|
236
|
+
if (this.delegateToBlueprint) return {};
|
|
235
237
|
return this._initializing();
|
|
236
238
|
}
|
|
237
239
|
|
|
@@ -251,7 +253,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
251
253
|
}
|
|
252
254
|
|
|
253
255
|
get prompting() {
|
|
254
|
-
if (
|
|
256
|
+
if (this.delegateToBlueprint) return {};
|
|
255
257
|
return this._prompting();
|
|
256
258
|
}
|
|
257
259
|
|
|
@@ -270,27 +272,27 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
270
272
|
}
|
|
271
273
|
|
|
272
274
|
get configuring() {
|
|
273
|
-
if (
|
|
275
|
+
if (this.delegateToBlueprint) return {};
|
|
274
276
|
return this._configuring();
|
|
275
277
|
}
|
|
276
278
|
|
|
277
279
|
// Public API method used by the getter and also by Blueprints
|
|
278
280
|
_composing() {
|
|
279
281
|
return {
|
|
280
|
-
composeCommon() {
|
|
281
|
-
this.composeWithJHipster(GENERATOR_COMMON, true);
|
|
282
|
+
async composeCommon() {
|
|
283
|
+
await this.composeWithJHipster(GENERATOR_COMMON, true);
|
|
282
284
|
},
|
|
283
285
|
|
|
284
|
-
composeLanguages() {
|
|
286
|
+
async composeLanguages() {
|
|
285
287
|
// We don't expose client/server to cli, composing with languages is used for test purposes.
|
|
286
288
|
if (this.jhipsterConfig.enableTranslation === false) return;
|
|
287
|
-
this.composeWithJHipster(GENERATOR_LANGUAGES, true);
|
|
289
|
+
await this.composeWithJHipster(GENERATOR_LANGUAGES, true);
|
|
288
290
|
},
|
|
289
291
|
};
|
|
290
292
|
}
|
|
291
293
|
|
|
292
294
|
get composing() {
|
|
293
|
-
if (
|
|
295
|
+
if (this.delegateToBlueprint) return {};
|
|
294
296
|
return this._composing();
|
|
295
297
|
}
|
|
296
298
|
|
|
@@ -310,7 +312,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
310
312
|
}
|
|
311
313
|
|
|
312
314
|
get loading() {
|
|
313
|
-
if (
|
|
315
|
+
if (this.delegateToBlueprint) return {};
|
|
314
316
|
return this._loading();
|
|
315
317
|
}
|
|
316
318
|
|
|
@@ -357,7 +359,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
357
359
|
}
|
|
358
360
|
|
|
359
361
|
get preparing() {
|
|
360
|
-
if (
|
|
362
|
+
if (this.delegateToBlueprint) return {};
|
|
361
363
|
return this._preparing();
|
|
362
364
|
}
|
|
363
365
|
|
|
@@ -415,7 +417,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
415
417
|
}
|
|
416
418
|
|
|
417
419
|
get default() {
|
|
418
|
-
if (
|
|
420
|
+
if (this.delegateToBlueprint) return {};
|
|
419
421
|
return this._default();
|
|
420
422
|
}
|
|
421
423
|
|
|
@@ -428,7 +430,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
428
430
|
}
|
|
429
431
|
|
|
430
432
|
get writing() {
|
|
431
|
-
if (
|
|
433
|
+
if (this.delegateToBlueprint) return {};
|
|
432
434
|
return this._writing();
|
|
433
435
|
}
|
|
434
436
|
|
|
@@ -595,12 +597,24 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
595
597
|
'concurrently -k -s first "npm run backend:start" "npm start" "wait-on http-get://localhost:9000 && npm run e2e:headless -- -c baseUrl=http://localhost:9000"',
|
|
596
598
|
});
|
|
597
599
|
}
|
|
600
|
+
// Vue eagerly loads remotes, wait for it.
|
|
601
|
+
if (this.microfrontend && this.applicationTypeGateway && this.clientFrameworkVue) {
|
|
602
|
+
const remotesScript = this.remotes
|
|
603
|
+
.map(
|
|
604
|
+
app =>
|
|
605
|
+
`echo "Waiting for microfrontend ${app.baseName} to start" && wait-on http-get://localhost:$npm_package_config_backend_port/${app.endpointPrefix}/remoteEntry.js && echo "Microfrontend ${app.baseName} started"`
|
|
606
|
+
)
|
|
607
|
+
.join(' && ');
|
|
608
|
+
scriptsStorage.set({
|
|
609
|
+
'ci:server:await': `${scriptsStorage.get('ci:server:await')} && ${remotesScript}`,
|
|
610
|
+
});
|
|
611
|
+
}
|
|
598
612
|
},
|
|
599
613
|
};
|
|
600
614
|
}
|
|
601
615
|
|
|
602
616
|
get postWriting() {
|
|
603
|
-
if (
|
|
617
|
+
if (this.delegateToBlueprint) return {};
|
|
604
618
|
return this._postWriting();
|
|
605
619
|
}
|
|
606
620
|
|
|
@@ -632,7 +646,7 @@ module.exports = class JHipsterServerGenerator extends BaseBlueprintGenerator {
|
|
|
632
646
|
}
|
|
633
647
|
|
|
634
648
|
get end() {
|
|
635
|
-
if (
|
|
649
|
+
if (this.delegateToBlueprint) return {};
|
|
636
650
|
return this._end();
|
|
637
651
|
}
|
|
638
652
|
|
|
@@ -28,12 +28,12 @@ springBootVersion=<%= SPRING_BOOT_VERSION %>
|
|
|
28
28
|
# https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/<%= SPRING_BOOT_VERSION %> -->
|
|
29
29
|
hibernateVersion=<%= HIBERNATE_VERSION %>
|
|
30
30
|
mapstructVersion=1.4.2.Final
|
|
31
|
-
archunitJunit5Version=0.
|
|
31
|
+
archunitJunit5Version=0.22.0
|
|
32
32
|
<%_ if (enableSwaggerCodegen) { _%>
|
|
33
33
|
jacksonDatabindNullableVersion=<%= JACKSON_DATABIND_NULLABLE_VERSION %>
|
|
34
34
|
<%_ } _%>
|
|
35
35
|
<%_ if (cacheProviderCaffeine) { _%>
|
|
36
|
-
caffeineVersion=3.0.
|
|
36
|
+
caffeineVersion=3.0.4
|
|
37
37
|
typesafeConfigVersion=1.4.1
|
|
38
38
|
<%_ } _%>
|
|
39
39
|
<%_ if (databaseTypeSql && !reactive) { _%>
|
|
@@ -47,7 +47,7 @@ commonsBeanutilsVersion=1.9.4
|
|
|
47
47
|
|
|
48
48
|
<%_ if (reactive) { _%>
|
|
49
49
|
blockhoundJunitPlatformVersion=1.0.6.RELEASE
|
|
50
|
-
junitPlatformLauncherVersion=1.
|
|
50
|
+
junitPlatformLauncherVersion=1.8.1
|
|
51
51
|
<%_ } _%>
|
|
52
52
|
|
|
53
53
|
<%_ if (databaseTypeSql) { _%>
|
|
@@ -63,21 +63,21 @@ cassandraDriverVersion=4.11.3
|
|
|
63
63
|
jibPluginVersion=<%= JIB_VERSION %>
|
|
64
64
|
gitPropertiesPluginVersion=2.3.1
|
|
65
65
|
<%_ if (!skipClient) { _%>
|
|
66
|
-
gradleNodePluginVersion=3.1.
|
|
66
|
+
gradleNodePluginVersion=3.1.1
|
|
67
67
|
<%_ } _%>
|
|
68
68
|
<%_ if (databaseTypeSql && !reactive) { _%>
|
|
69
|
-
liquibasePluginVersion=2.0
|
|
69
|
+
liquibasePluginVersion=2.1.0
|
|
70
70
|
<%_ } _%>
|
|
71
71
|
sonarqubePluginVersion=3.3
|
|
72
72
|
<%_ if (enableSwaggerCodegen) { _%>
|
|
73
73
|
openapiPluginVersion=5.2.1
|
|
74
74
|
<%_ } _%>
|
|
75
|
-
noHttpCheckstyleVersion=0.0.
|
|
76
|
-
checkstyleVersion=9.
|
|
77
|
-
modernizerPluginVersion=1.6.
|
|
75
|
+
noHttpCheckstyleVersion=0.0.10
|
|
76
|
+
checkstyleVersion=9.1
|
|
77
|
+
modernizerPluginVersion=1.6.1
|
|
78
78
|
<%_ if (enableGradleEnterprise) { _%>
|
|
79
|
-
gradleEnterprisePluginVersion=3.
|
|
80
|
-
gradleCommonCustomUserDataPluginVersion=1.
|
|
79
|
+
gradleEnterprisePluginVersion=3.7.1
|
|
80
|
+
gradleCommonCustomUserDataPluginVersion=1.5
|
|
81
81
|
<%_ } _%>
|
|
82
82
|
# jhipster-needle-gradle-property - JHipster will add additional properties here
|
|
83
83
|
|
|
@@ -126,13 +126,13 @@
|
|
|
126
126
|
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} -->
|
|
127
127
|
<cassandra-driver.version>4.11.3</cassandra-driver.version>
|
|
128
128
|
<%_ } _%>
|
|
129
|
-
<archunit-junit5.version>0.
|
|
129
|
+
<archunit-junit5.version>0.22.0</archunit-junit5.version>
|
|
130
130
|
<mapstruct.version>1.4.2.Final</mapstruct.version>
|
|
131
131
|
<%_ if (enableSwaggerCodegen) { _%>
|
|
132
132
|
<jackson-databind-nullable.version><%= JACKSON_DATABIND_NULLABLE_VERSION %></jackson-databind-nullable.version>
|
|
133
133
|
<%_ } _%>
|
|
134
134
|
<%_ if (cacheProviderCaffeine) { _%>
|
|
135
|
-
<caffeine.version>3.0.
|
|
135
|
+
<caffeine.version>3.0.4</caffeine.version>
|
|
136
136
|
<typesafe.version>1.4.1</typesafe.version>
|
|
137
137
|
<%_ } _%>
|
|
138
138
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
@@ -151,10 +151,10 @@
|
|
|
151
151
|
<maven-idea-plugin.version>2.2.1</maven-idea-plugin.version>
|
|
152
152
|
<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
|
|
153
153
|
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
|
|
154
|
-
<maven-war-plugin.version>3.3.
|
|
154
|
+
<maven-war-plugin.version>3.3.2</maven-war-plugin.version>
|
|
155
155
|
<maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
|
|
156
|
-
<checkstyle.version>9.
|
|
157
|
-
<nohttp-checkstyle.version>0.0.
|
|
156
|
+
<checkstyle.version>9.1</checkstyle.version>
|
|
157
|
+
<nohttp-checkstyle.version>0.0.10</nohttp-checkstyle.version>
|
|
158
158
|
<%_ if (!skipClient) { _%>
|
|
159
159
|
<frontend-maven-plugin.version>1.12.0</frontend-maven-plugin.version>
|
|
160
160
|
<checksum-maven-plugin.version>1.11</checksum-maven-plugin.version>
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
<openapi-generator-maven-plugin.version>5.2.1</openapi-generator-maven-plugin.version>
|
|
172
172
|
<%_ } _%>
|
|
173
173
|
<properties-maven-plugin.version>1.0.0</properties-maven-plugin.version>
|
|
174
|
-
<sonar-maven-plugin.version>3.9.
|
|
174
|
+
<sonar-maven-plugin.version>3.9.1.2184</sonar-maven-plugin.version>
|
|
175
175
|
<!-- jhipster-needle-maven-property -->
|
|
176
176
|
</properties>
|
|
177
177
|
|
|
@@ -52,7 +52,7 @@ _%>
|
|
|
52
52
|
<%_ } _%>
|
|
53
53
|
<%_ if (databaseTypeCouchbase) { _%>
|
|
54
54
|
- SPRING_COUCHBASE_CONNECTION_STRING=<%= baseName.toLowerCase() %>-couchbase
|
|
55
|
-
-
|
|
55
|
+
- JHIPSTER_DATABASE_COUCHBASE_BUCKET_NAME=<%= baseName %>
|
|
56
56
|
<%_ } _%>
|
|
57
57
|
<%_ if (cacheProviderMemcached) { _%>
|
|
58
58
|
- JHIPSTER_CACHE_MEMCACHED_SERVERS=<%= baseName.toLowerCase() %>-memcached:11211
|
|
@@ -278,8 +278,8 @@ public class SecurityConfiguration {
|
|
|
278
278
|
.pathMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN)
|
|
279
279
|
.pathMatchers("/api/**").authenticated()
|
|
280
280
|
<%_ if (applicationTypeGateway) { _%>
|
|
281
|
-
<%_ if (microfrontend && authenticationTypeJwt) { _%>
|
|
282
|
-
// microfrontend resources are loaded by webpack without
|
|
281
|
+
<%_ if (microfrontend && (authenticationTypeJwt || clientFrameworkVue)) { _%>
|
|
282
|
+
// microfrontend resources are loaded by webpack without authentication, they need to be public
|
|
283
283
|
.pathMatchers("/services/*/*.js").permitAll()
|
|
284
284
|
.pathMatchers("/services/*/*.js.map").permitAll()
|
|
285
285
|
<%_ } _%>
|
package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Copyright 2013-2021 the original author or authors from the JHipster project.
|
|
3
|
+
|
|
4
|
+
This file is part of the JHipster project, see https://www.jhipster.tech/
|
|
5
|
+
for more information.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
-%>
|
|
19
|
+
package <%= packageName %>.management;
|
|
20
|
+
|
|
21
|
+
import org.springframework.stereotype.Service;
|
|
22
|
+
|
|
23
|
+
import io.micrometer.core.instrument.Counter;
|
|
24
|
+
import io.micrometer.core.instrument.MeterRegistry;
|
|
25
|
+
|
|
26
|
+
@Service
|
|
27
|
+
public class SecurityMetersService {
|
|
28
|
+
|
|
29
|
+
public static final String INVALID_TOKENS_METER_NAME = "security.authentication.invalid-tokens";
|
|
30
|
+
public static final String INVALID_TOKENS_METER_DESCRIPTION = "Indicates validation error count of the tokens presented by the clients.";
|
|
31
|
+
public static final String INVALID_TOKENS_METER_BASE_UNIT = "errors";
|
|
32
|
+
public static final String INVALID_TOKENS_METER_CAUSE_DIMENSION = "cause";
|
|
33
|
+
|
|
34
|
+
private final Counter tokenInvalidSignatureCounter;
|
|
35
|
+
private final Counter tokenExpiredCounter;
|
|
36
|
+
private final Counter tokenUnsupportedCounter;
|
|
37
|
+
private final Counter tokenMalformedCounter;
|
|
38
|
+
|
|
39
|
+
public SecurityMetersService(MeterRegistry registry) {
|
|
40
|
+
this.tokenInvalidSignatureCounter = invalidTokensCounterForCauseBuilder("invalid-signature").register(registry);
|
|
41
|
+
this.tokenExpiredCounter = invalidTokensCounterForCauseBuilder("expired").register(registry);
|
|
42
|
+
this.tokenUnsupportedCounter = invalidTokensCounterForCauseBuilder("unsupported").register(registry);
|
|
43
|
+
this.tokenMalformedCounter = invalidTokensCounterForCauseBuilder("malformed").register(registry);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private Counter.Builder invalidTokensCounterForCauseBuilder(String cause) {
|
|
47
|
+
return Counter.builder(INVALID_TOKENS_METER_NAME)
|
|
48
|
+
.baseUnit(INVALID_TOKENS_METER_BASE_UNIT)
|
|
49
|
+
.description(INVALID_TOKENS_METER_DESCRIPTION)
|
|
50
|
+
.tag(INVALID_TOKENS_METER_CAUSE_DIMENSION, cause);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public void trackTokenInvalidSignature() {
|
|
54
|
+
this.tokenInvalidSignatureCounter.increment();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public void trackTokenExpired() {
|
|
58
|
+
this.tokenExpiredCounter.increment();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public void trackTokenUnsupported() {
|
|
62
|
+
this.tokenUnsupportedCounter.increment();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public void trackTokenMalformed() {
|
|
66
|
+
this.tokenMalformedCounter.increment();
|
|
67
|
+
}
|
|
68
|
+
}
|
package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs
CHANGED
|
@@ -34,13 +34,17 @@ import org.springframework.stereotype.Component;
|
|
|
34
34
|
import org.springframework.util.ObjectUtils;
|
|
35
35
|
|
|
36
36
|
import tech.jhipster.config.JHipsterProperties;
|
|
37
|
+
|
|
37
38
|
import io.jsonwebtoken.*;
|
|
38
39
|
import io.jsonwebtoken.io.Decoders;
|
|
40
|
+
import io.jsonwebtoken.security.SignatureException;
|
|
39
41
|
<%_ if (reactive) { _%>
|
|
40
42
|
import io.jsonwebtoken.jackson.io.JacksonSerializer;
|
|
41
43
|
<%_ } _%>
|
|
42
44
|
import io.jsonwebtoken.security.Keys;
|
|
43
45
|
|
|
46
|
+
import <%= packageName %>.management.SecurityMetersService;
|
|
47
|
+
|
|
44
48
|
@Component
|
|
45
49
|
public class TokenProvider {
|
|
46
50
|
|
|
@@ -56,7 +60,9 @@ public class TokenProvider {
|
|
|
56
60
|
|
|
57
61
|
private final long tokenValidityInMillisecondsForRememberMe;
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
private final SecurityMetersService securityMetersService;
|
|
64
|
+
|
|
65
|
+
public TokenProvider(JHipsterProperties jHipsterProperties, SecurityMetersService securityMetersService) {
|
|
60
66
|
byte[] keyBytes;
|
|
61
67
|
String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret();
|
|
62
68
|
if (!ObjectUtils.isEmpty(secret)) {
|
|
@@ -75,6 +81,8 @@ public class TokenProvider {
|
|
|
75
81
|
this.tokenValidityInMillisecondsForRememberMe =
|
|
76
82
|
1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
|
|
77
83
|
.getTokenValidityInSecondsForRememberMe();
|
|
84
|
+
|
|
85
|
+
this.securityMetersService = securityMetersService;
|
|
78
86
|
}
|
|
79
87
|
|
|
80
88
|
public String createToken(Authentication authentication, boolean rememberMe) {
|
|
@@ -118,11 +126,28 @@ public class TokenProvider {
|
|
|
118
126
|
public boolean validateToken(String authToken) {
|
|
119
127
|
try {
|
|
120
128
|
jwtParser.parseClaimsJws(authToken);
|
|
129
|
+
|
|
121
130
|
return true;
|
|
122
|
-
} catch (
|
|
123
|
-
|
|
124
|
-
|
|
131
|
+
} catch (ExpiredJwtException e) {
|
|
132
|
+
this.securityMetersService.trackTokenExpired();
|
|
133
|
+
|
|
134
|
+
log.trace("Invalid JWT token.", e);
|
|
135
|
+
} catch (UnsupportedJwtException e) {
|
|
136
|
+
this.securityMetersService.trackTokenUnsupported();
|
|
137
|
+
|
|
138
|
+
log.trace("Invalid JWT token.", e);
|
|
139
|
+
} catch (MalformedJwtException e) {
|
|
140
|
+
this.securityMetersService.trackTokenMalformed();
|
|
141
|
+
|
|
142
|
+
log.trace("Invalid JWT token.", e);
|
|
143
|
+
} catch (SignatureException e) {
|
|
144
|
+
this.securityMetersService.trackTokenInvalidSignature();
|
|
145
|
+
|
|
146
|
+
log.trace("Invalid JWT token.", e);
|
|
147
|
+
} catch (IllegalArgumentException e) { // TODO: should we let it bubble (no catch), to avoid defensive programming and follow the fail-fast principle?
|
|
148
|
+
log.error("Token validation error {}", e.getMessage());
|
|
125
149
|
}
|
|
150
|
+
|
|
126
151
|
return false;
|
|
127
152
|
}
|
|
128
153
|
}
|
|
@@ -34,6 +34,7 @@ import org.springframework.web.client.RestTemplate;
|
|
|
34
34
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
35
35
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
36
36
|
|
|
37
|
+
import java.util.Arrays;
|
|
37
38
|
import java.util.Collections;
|
|
38
39
|
import java.util.HashMap;
|
|
39
40
|
import java.util.List;
|
|
@@ -62,7 +63,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
62
63
|
|
|
63
64
|
public Map<String, Object> convert(Map<String, Object> claims) {
|
|
64
65
|
Map<String, Object> convertedClaims = this.delegate.convert(claims);
|
|
65
|
-
if (RequestContextHolder.getRequestAttributes() != null) {
|
|
66
|
+
if (RequestContextHolder.getRequestAttributes() != null && ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) != null) {
|
|
66
67
|
// Retrieve and set the token
|
|
67
68
|
String token = bearerTokenResolver.resolve(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
|
|
68
69
|
HttpHeaders headers = new HttpHeaders();
|
|
@@ -83,20 +84,31 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
83
84
|
if (user.has("family_name")) {
|
|
84
85
|
convertedClaims.put("family_name", user.get("family_name").asText());
|
|
85
86
|
}
|
|
87
|
+
if (user.has("email")) {
|
|
88
|
+
convertedClaims.put("email", user.get("email").asText());
|
|
89
|
+
}
|
|
90
|
+
// Allow full name in a name claim - happens with Auth0
|
|
91
|
+
if (user.has("name")) {
|
|
92
|
+
String[] name = user.get("name").asText().split("\\s+");
|
|
93
|
+
if (name.length > 0) {
|
|
94
|
+
convertedClaims.put("given_name", name[0]);
|
|
95
|
+
convertedClaims.put("family_name",
|
|
96
|
+
String.join(" ", Arrays.copyOfRange(name, 1, name.length)));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
86
99
|
if (user.has("groups")) {
|
|
87
100
|
List<String> groups = StreamSupport.stream(user.get("groups").spliterator(), false)
|
|
88
101
|
.map(JsonNode::asText)
|
|
89
102
|
.collect(Collectors.toList());
|
|
90
103
|
convertedClaims.put("groups", groups);
|
|
91
104
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.
|
|
98
|
-
|
|
99
|
-
convertedClaims.put("roles", roles);
|
|
105
|
+
if (user.has(SecurityUtils.CLAIMS_NAMESPACE + "roles")) {
|
|
106
|
+
List<String> roles = StreamSupport
|
|
107
|
+
.stream(user.get(SecurityUtils.CLAIMS_NAMESPACE + "roles").spliterator(), false)
|
|
108
|
+
.map(JsonNode::asText)
|
|
109
|
+
.collect(Collectors.toList());
|
|
110
|
+
convertedClaims.put("roles", roles);
|
|
111
|
+
}
|
|
100
112
|
}
|
|
101
113
|
}
|
|
102
114
|
return convertedClaims;
|
|
@@ -1017,15 +1017,20 @@ public class UserService {
|
|
|
1017
1017
|
private static <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> getUser(Map<String, Object> details) {
|
|
1018
1018
|
<%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %> user = new <%= databaseTypeNo ? asDto('AdminUser') : asEntity('User') %>();
|
|
1019
1019
|
Boolean activated = Boolean.TRUE;
|
|
1020
|
+
String sub = String.valueOf(details.get("sub"));
|
|
1021
|
+
String username = null;
|
|
1022
|
+
if (details.get("preferred_username") != null) {
|
|
1023
|
+
username = ((String) details.get("preferred_username")).toLowerCase();
|
|
1024
|
+
}
|
|
1020
1025
|
// handle resource server JWT, where sub claim is email and uid is ID
|
|
1021
1026
|
if (details.get("uid") != null) {
|
|
1022
1027
|
user.setId((String) details.get("uid"));
|
|
1023
|
-
user.setLogin(
|
|
1028
|
+
user.setLogin(sub);
|
|
1024
1029
|
} else {
|
|
1025
|
-
user.setId(
|
|
1030
|
+
user.setId(sub);
|
|
1026
1031
|
}
|
|
1027
|
-
if (
|
|
1028
|
-
user.setLogin(
|
|
1032
|
+
if (username != null) {
|
|
1033
|
+
user.setLogin(username);
|
|
1029
1034
|
} else if (user.getLogin() == null) {
|
|
1030
1035
|
user.setLogin(user.getId());
|
|
1031
1036
|
}
|
|
@@ -1042,8 +1047,11 @@ public class UserService {
|
|
|
1042
1047
|
}
|
|
1043
1048
|
if (details.get("email") != null) {
|
|
1044
1049
|
user.setEmail(((String) details.get("email")).toLowerCase());
|
|
1050
|
+
} else if (sub.contains("|") && (username != null && username.contains("@"))) {
|
|
1051
|
+
// special handling for Auth0
|
|
1052
|
+
user.setEmail(username);
|
|
1045
1053
|
} else {
|
|
1046
|
-
user.setEmail(
|
|
1054
|
+
user.setEmail(sub);
|
|
1047
1055
|
}
|
|
1048
1056
|
if (details.get("langKey") != null) {
|
|
1049
1057
|
user.setLangKey((String) details.get("langKey"));
|