generator-jhipster 7.3.0 → 7.5.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/import-jdl.js +3 -2
- package/cli/jhipster-command.js +2 -2
- package/cli/program.js +32 -29
- package/generators/app/index.js +46 -27
- package/generators/aws/index.js +8 -8
- package/generators/aws/lib/eb.js +1 -1
- package/generators/azure-app-service/index.js +16 -9
- package/generators/azure-app-service/templates/github/workflows/azure-app-service.yml.ejs +2 -2
- package/generators/azure-spring-cloud/index.js +16 -9
- package/generators/azure-spring-cloud/templates/github/workflows/azure-spring-cloud.yml.ejs +2 -2
- package/generators/bootstrap/index.js +57 -62
- package/generators/ci-cd/index.js +11 -8
- package/generators/ci-cd/templates/github-actions.yml.ejs +1 -1
- package/generators/ci-cd/templates/travis.yml.ejs +9 -4
- package/generators/cleanup.js +27 -171
- package/generators/client/files-angular.js +12 -1
- package/generators/client/files-common.js +6 -2
- package/generators/client/files-react.js +13 -2
- package/generators/client/files-vue.js +59 -7
- package/generators/client/index.js +46 -32
- package/generators/client/needle-api/needle-client-angular.js +1 -1
- package/generators/client/needle-api/needle-client-vue.js +57 -7
- package/generators/client/templates/angular/.eslintrc.json.ejs +1 -0
- package/generators/client/templates/angular/angular.json.ejs +5 -0
- package/generators/client/templates/angular/jest.conf.js.ejs +2 -0
- package/generators/client/templates/angular/package.json +29 -29
- package/generators/client/templates/angular/package.json.ejs +3 -1
- package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.spec.ts.ejs +52 -54
- package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.service.spec.ts.ejs +65 -0
- package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts.ejs +35 -37
- package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.spec.ts.ejs +78 -80
- package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/account/password/password.service.spec.ts.ejs +41 -0
- package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts.ejs +73 -75
- package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.spec.ts.ejs +62 -0
- package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts.ejs +44 -46
- package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.service.spec.ts.ejs +61 -0
- package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.spec.ts.ejs +122 -123
- package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/account/register/register.service.spec.ts.ejs +66 -0
- package/generators/client/templates/angular/src/main/webapp/app/account/sessions/sessions.component.spec.ts.ejs +75 -77
- package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.spec.ts.ejs +80 -80
- package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.component.spec.ts.ejs +48 -50
- package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.spec.ts.ejs +45 -47
- package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.spec.ts.ejs +66 -0
- package/generators/client/templates/angular/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts.ejs +99 -101
- package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.component.spec.ts.ejs +61 -63
- 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/angular/src/main/webapp/app/admin/metrics/metrics.component.spec.ts.ejs +28 -30
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts.ejs +35 -37
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts.ejs +40 -42
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts.ejs +89 -91
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts.ejs +81 -83
- package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +8 -8
- package/generators/client/templates/angular/src/main/webapp/app/app-routing.module.ts.ejs +14 -3
- package/generators/client/templates/angular/src/main/webapp/app/app.module.ts.ejs +8 -29
- package/generators/client/templates/angular/src/main/webapp/app/config/datepicker-adapter.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/config/dayjs.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/core/auth/account.service.spec.ts.ejs +14 -9
- package/generators/client/templates/angular/src/main/webapp/app/core/tracker/tracker.service.ts.ejs +6 -6
- package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/entities/entity-navbar-items.ts.ejs +29 -0
- package/generators/client/templates/angular/src/main/webapp/app/home/home.component.spec.ts.ejs +106 -98
- package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +166 -168
- package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +20 -0
- package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts.ejs +74 -70
- package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +41 -2
- package/generators/client/templates/angular/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts.ejs +27 -29
- package/generators/client/templates/angular/src/main/webapp/app/login/login.component.spec.ts.ejs +114 -115
- package/generators/client/templates/angular/src/main/webapp/app/login/login.component.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert-error.component.spec.ts.ejs +132 -134
- package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert.component.spec.ts.ejs +29 -31
- package/generators/client/templates/angular/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts.ejs +4 -4
- package/generators/client/templates/angular/src/main/webapp/app/shared/date/duration.pipe.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts.ejs +1 -1
- package/generators/client/templates/angular/src/main/webapp/app/shared/language/translate.directive.ts.ejs +6 -6
- package/generators/client/templates/angular/src/main/webapp/app/shared/language/translation.module.ts.ejs +83 -0
- package/generators/client/templates/angular/src/main/webapp/declarations.d.ts.ejs +16 -2
- package/generators/client/templates/angular/tsconfig.json.ejs +2 -0
- package/generators/client/templates/angular/tsconfig.spec.json.ejs +0 -1
- package/generators/client/templates/angular/webpack/proxy.conf.js.ejs +0 -2
- package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +0 -16
- package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +12 -5
- package/generators/client/templates/common/package.json +6 -6
- package/generators/client/templates/common/src/main/webapp/robots.txt.ejs +0 -1
- package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +86 -56
- 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 +54 -53
- package/generators/client/templates/react/package.json.ejs +6 -1
- package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +0 -3
- package/generators/client/templates/react/src/main/webapp/app/config/axios-interceptor.spec.ts.ejs +3 -2
- package/generators/client/templates/react/src/main/webapp/app/modules/account/password/password.tsx.ejs +2 -2
- 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.scss.ejs +9 -0
- package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.tsx.ejs +2 -2
- 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/src/main/webapp/app/shared/reducers/authentication.spec.ts.ejs +1 -1
- package/generators/client/templates/react/webpack/webpack.dev.js.ejs +17 -3
- 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 +40 -49
- package/generators/client/templates/vue/package.json.ejs +13 -17
- package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +23 -12
- 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/constants.ts.ejs +16 -6
- package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +27 -8
- 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 +20 -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/entities/user/{user.oauth2.service.ts.ejs → user.service.ts.ejs} +1 -1
- package/generators/client/templates/vue/{webpack/utils.js.ejs → src/main/webapp/app/index.ts.ejs} +1 -12
- package/generators/client/templates/vue/src/main/webapp/app/locale/translation.service.ts.ejs +26 -9
- package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +20 -18
- package/generators/client/templates/vue/src/main/webapp/app/router/entities.ts.ejs +45 -3
- package/generators/client/templates/vue/src/main/webapp/app/router/index.ts.ejs +19 -3
- package/generators/client/templates/vue/src/main/webapp/app/shared/config/axios-interceptor.ts.ejs +0 -2
- package/generators/client/templates/vue/src/main/webapp/app/shared/data/data-utils.service.ts.ejs +3 -1
- package/generators/client/templates/vue/src/main/webapp/app/shims-vue.d.ts.ejs +17 -3
- package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +25 -10
- package/generators/client/templates/vue/src/test/javascript/spec/app/account/login-form/login-form.component.spec.ts.ejs +2 -2
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management-edit.component.spec.ts.ejs +6 -4
- package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts.ejs +4 -2
- package/generators/client/templates/vue/src/test/javascript/spec/app/core/jhi-navbar/jhi-navbar.component.spec.ts.ejs +10 -4
- 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/src/test/javascript/spec/app/shared/config/axios-interceptor.spec.ts.ejs +0 -1
- package/generators/client/templates/vue/tsconfig.json.ejs +6 -10
- package/generators/client/templates/vue/tsconfig.spec.json.ejs +37 -0
- package/generators/client/templates/vue/webpack/config.js.ejs +50 -0
- package/generators/client/templates/vue/webpack/vue.utils.js.ejs +33 -32
- package/generators/client/templates/vue/webpack/webpack.common.js.ejs +150 -126
- package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +19 -76
- package/generators/client/templates/vue/webpack/webpack.microfrontend.js.jhi.vue.ejs +77 -0
- package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +5 -41
- package/generators/cloudfoundry/index.js +9 -9
- package/generators/common/index.js +12 -10
- package/generators/common/templates/.prettierrc.ejs +1 -1
- package/generators/common/templates/README.md.jhi.ejs +19 -0
- package/generators/common/templates/package.json +4 -4
- package/generators/cypress/index.js +12 -9
- package/generators/cypress/templates/cypress.json.ejs +16 -2
- package/generators/cypress/templates/src/test/javascript/cypress/integration/account/login-page.spec.ts.ejs +3 -14
- package/generators/cypress/templates/src/test/javascript/cypress/integration/account/password-page.spec.ts.ejs +33 -39
- package/generators/cypress/templates/src/test/javascript/cypress/integration/account/register-page.spec.ts.ejs +52 -62
- package/generators/cypress/templates/src/test/javascript/cypress/integration/account/reset-password-page.spec.ts.ejs +2 -10
- package/generators/cypress/templates/src/test/javascript/cypress/integration/account/settings-page.spec.ts.ejs +25 -34
- package/generators/cypress/templates/src/test/javascript/cypress/integration/administration/administration.spec.ts.ejs +1 -22
- package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +4 -4
- package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +67 -7
- package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +4 -4
- package/generators/cypress/templates/src/test/javascript/cypress/support/index.ts.ejs +1 -6
- package/generators/cypress/templates/src/test/javascript/cypress/support/management.ts.ejs +1 -1
- package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +8 -8
- package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +0 -9
- package/generators/database-changelog/index.js +33 -22
- package/generators/database-changelog-liquibase/index.js +12 -8
- package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_constraints.xml.ejs +1 -1
- package/generators/docker-compose/index.js +11 -12
- package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +1 -1
- package/generators/entities/index.js +35 -26
- package/generators/entities-client/index.js +10 -7
- package/generators/entity/index.js +81 -32
- package/generators/entity-client/files.js +7 -16
- package/generators/entity-client/index.js +22 -12
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.spec.ts.ejs +42 -44
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.spec.ts.ejs +58 -60
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +1 -35
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.model.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +4 -4
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +110 -112
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +9 -2
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/infinite-scroll-template.ejs +8 -8
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/no-pagination-template.ejs +8 -8
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/pagination-template.ejs +8 -8
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +15 -6
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing.module.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +1 -1
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.spec.ts.ejs +203 -198
- package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +5 -5
- package/generators/entity-client/templates/angular/src/test/javascript/e2e/entities/entity.spec.ts.ejs +1 -1
- package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +264 -127
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +17 -14
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.reducer.ts.ejs +5 -4
- package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +11 -13
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +32 -25
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.vue.ejs +6 -9
- 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.model.ts.ejs +1 -1
- package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.service.ts.ejs +2 -6
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity-update.component.spec.ts.ejs +10 -7
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.component.spec.ts.ejs +5 -1
- package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.service.spec.ts.ejs +1 -1
- package/generators/entity-i18n/index.js +7 -4
- package/generators/entity-server/files.js +14 -0
- package/generators/entity-server/index.js +12 -8
- package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +2 -2
- package/generators/entity-server/templates/src/main/java/package/common/search_template.ejs +1 -1
- package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +9 -8
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +16 -29
- package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +3 -3
- package/generators/entity-server/templates/src/main/java/package/repository/EntitySqlHelper_reactive.java.ejs +46 -0
- package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +1 -1
- package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +18 -2
- package/generators/entity-server/templates/src/main/java/package/repository/search/SortToFieldSortBuilderConverter.java.ejs +24 -0
- package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +8 -6
- package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +5 -1
- package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +41 -43
- package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +3 -3
- package/generators/gae/index.js +10 -10
- package/generators/generator-base-blueprint.js +14 -46
- package/generators/generator-base-private.js +44 -23
- package/generators/generator-base.js +58 -18
- package/generators/generator-constants.js +30 -23
- package/generators/generator-transforms.js +39 -27
- package/generators/heroku/index.js +14 -33
- package/generators/init/constants.cjs +1 -1
- package/generators/java/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/languages/templates/src/main/webapp/i18n/vi/login.json +1 -1
- 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 +28 -15
- package/generators/server/cleanup.js +151 -0
- package/generators/server/files-sql.js +52 -0
- package/generators/server/files.js +31 -14
- package/generators/server/index.js +86 -33
- package/generators/server/templates/build.gradle.ejs +231 -189
- package/generators/server/templates/gradle.properties.ejs +12 -12
- package/generators/server/templates/npmw +8 -6
- package/generators/server/templates/npmw.cmd +13 -8
- package/generators/server/templates/pom.xml.ejs +425 -217
- package/generators/server/templates/sql/reactive/src/main/java/package/repository/UserSqlHelper.java.ejs +48 -0
- package/generators/server/templates/src/main/docker/app.yml.ejs +1 -1
- package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +2 -2
- package/generators/server/templates/src/main/java/package/config/LocaleConfiguration.java.ejs +3 -2
- package/generators/server/templates/src/main/java/package/config/OpenApiConfiguration.java.ejs +17 -54
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +5 -5
- package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +4 -6
- package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +0 -3
- package/generators/server/templates/src/main/java/package/config/neo4j/Neo4jMigrations.java.ejs +19 -9
- package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs +68 -0
- package/generators/server/templates/src/main/java/package/repository/AuthorityRepository.java.ejs +2 -2
- package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs +0 -25
- package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +31 -4
- package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +23 -11
- package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +16 -8
- package/generators/server/templates/src/main/java/package/service/dto/UserDTO.java.ejs +6 -6
- package/generators/server/templates/src/main/java/package/web/filter/ModifyServersOpenApiFilter.java.ejs +3 -2
- package/generators/server/templates/src/main/java/package/web/filter/SpaWebFilter.java.ejs +1 -1
- package/generators/server/templates/src/main/java/package/web/rest/PublicUserResource.java.ejs +2 -2
- package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +2 -2
- package/generators/server/templates/src/main/resources/config/application.yml.ejs +22 -8
- package/generators/server/templates/src/main/resources/logback-spring.xml.ejs +1 -2
- package/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +1 -1
- package/generators/server/templates/src/test/java/package/cucumber/CucumberIT.java.ejs +2 -6
- package/generators/server/templates/src/test/java/package/cucumber/CucumberTestContextConfiguration.java.ejs +2 -3
- package/generators/server/templates/src/test/java/package/cucumber/stepdefs/UserStepDefs.java.ejs +41 -6
- 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 +17 -3
- package/generators/server/templates/src/test/java/package/security/oauth2/CustomClaimConverterIT.java.ejs +63 -0
- package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +1 -1
- package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +2 -3
- package/generators/server/templates/src/test/java/package/web/rest/ClientForwardControllerTest.java.ejs +9 -0
- package/generators/server/templates/src/test/resources/junit-platform.properties.ejs +2 -0
- package/generators/server/templates/src/test/resources/logback.xml.ejs +1 -1
- package/generators/server/templates/src/test/{features → resources/package/features}/gitkeep +0 -0
- package/generators/server/templates/src/test/{features → resources/package/features}/user/user.feature.ejs +0 -0
- package/generators/spring-controller/index.js +9 -7
- package/generators/spring-controller/templates/src/test/java/package/web/rest/ResourceIT.java.ejs +1 -1
- package/generators/spring-service/index.js +10 -7
- package/generators/upgrade/index.js +4 -5
- 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 +22 -22
- package/utils/entity.js +17 -4
- package/utils/field.js +11 -1
- package/utils/multi-step-transform/index.js +8 -8
- package/generators/client/templates/react/.npmrc.ejs +0 -1
- package/generators/client/templates/vue/webpack/dev.env.js.ejs +0 -17
- package/generators/client/templates/vue/webpack/env.js.ejs +0 -67
- package/generators/client/templates/vue/webpack/loader.conf.js.ejs +0 -20
- package/generators/client/templates/vue/webpack/prod.env.js.ejs +0 -15
- package/generators/server/templates/src/main/java/package/config/apidocs/GatewaySwaggerResourcesProvider.java.ejs +0 -91
- package/generators/server/templates/src/test/java/package/config/apidocs/GatewaySwaggerResourcesProviderTest.java.ejs +0 -79
- package/generators/server/templates/src/test/resources/cucumber.properties.ejs +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
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 %>.repository;
|
|
20
|
+
|
|
21
|
+
import java.util.ArrayList;
|
|
22
|
+
import java.util.List;
|
|
23
|
+
import org.springframework.data.relational.core.sql.Column;
|
|
24
|
+
import org.springframework.data.relational.core.sql.Expression;
|
|
25
|
+
import org.springframework.data.relational.core.sql.Table;
|
|
26
|
+
|
|
27
|
+
public class UserSqlHelper {
|
|
28
|
+
public static List<Expression> getColumns(Table table, String columnPrefix) {
|
|
29
|
+
List<Expression> columns = new ArrayList<>();
|
|
30
|
+
columns.add(Column.aliased("id", table, columnPrefix + "_id"));
|
|
31
|
+
columns.add(Column.aliased("login", table, columnPrefix + "_login"));
|
|
32
|
+
<%_ if (!authenticationTypeOauth2) { _%>
|
|
33
|
+
columns.add(Column.aliased("password_hash", table, columnPrefix + "_password"));
|
|
34
|
+
<%_ } _%>
|
|
35
|
+
columns.add(Column.aliased("first_name", table, columnPrefix + "_first_name"));
|
|
36
|
+
columns.add(Column.aliased("last_name", table, columnPrefix + "_last_name"));
|
|
37
|
+
columns.add(Column.aliased("email", table, columnPrefix + "_email"));
|
|
38
|
+
columns.add(Column.aliased("activated", table, columnPrefix + "_activated"));
|
|
39
|
+
columns.add(Column.aliased("lang_key", table, columnPrefix + "_lang_key"));
|
|
40
|
+
columns.add(Column.aliased("image_url", table, columnPrefix + "_image_url"));
|
|
41
|
+
<%_ if (!authenticationTypeOauth2) { _%>
|
|
42
|
+
columns.add(Column.aliased("activation_key", table, columnPrefix + "_activation_key"));
|
|
43
|
+
columns.add(Column.aliased("reset_key", table, columnPrefix + "_reset_key"));
|
|
44
|
+
columns.add(Column.aliased("reset_date", table, columnPrefix + "_reset_date"));
|
|
45
|
+
<%_ } _%>
|
|
46
|
+
return columns;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -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
|
package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs
CHANGED
|
@@ -321,7 +321,7 @@
|
|
|
321
321
|
"security-admin-console": [],
|
|
322
322
|
"web_app": [],
|
|
323
323
|
"admin-cli": [],
|
|
324
|
-
"account-console": [],<% if (
|
|
324
|
+
"account-console": [],<% if (serviceDiscoveryEureka) { %>
|
|
325
325
|
"jhipster-registry": [],<% } %>
|
|
326
326
|
"broker": [
|
|
327
327
|
{
|
|
@@ -2491,7 +2491,7 @@
|
|
|
2491
2491
|
"clientOfflineSessionIdleTimeout": "0",
|
|
2492
2492
|
"cibaInterval": "5"
|
|
2493
2493
|
},
|
|
2494
|
-
"keycloakVersion": "
|
|
2494
|
+
"keycloakVersion": "16.1.0",
|
|
2495
2495
|
"userManagedAccessAllowed": false,
|
|
2496
2496
|
"clientProfiles": {
|
|
2497
2497
|
"profiles": []
|
package/generators/server/templates/src/main/java/package/config/LocaleConfiguration.java.ejs
CHANGED
|
@@ -198,8 +198,9 @@ public class LocaleConfiguration {
|
|
|
198
198
|
"'" + (timeZone != null ? " and time zone '" + timeZone.getID() + "'" : ""));
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
|
-
|
|
202
|
-
|
|
201
|
+
if (locale != null) {
|
|
202
|
+
exchange.getAttributes().put(LOCALE_REQUEST_ATTRIBUTE_NAME, locale);
|
|
203
|
+
}
|
|
203
204
|
if (timeZone != null) {
|
|
204
205
|
exchange.getAttributes().put(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, timeZone);
|
|
205
206
|
} else {
|
package/generators/server/templates/src/main/java/package/config/OpenApiConfiguration.java.ejs
CHANGED
|
@@ -18,72 +18,35 @@
|
|
|
18
18
|
-%>
|
|
19
19
|
package <%= packageName %>.config;
|
|
20
20
|
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
|
|
21
|
+
import org.springdoc.core.GroupedOpenApi;
|
|
22
|
+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
|
23
|
+
|
|
24
24
|
import org.springframework.context.annotation.Bean;
|
|
25
25
|
import org.springframework.context.annotation.Configuration;
|
|
26
26
|
import org.springframework.context.annotation.Profile;
|
|
27
|
-
import org.springframework.data.domain.Pageable;
|
|
28
|
-
import org.springframework.http.ResponseEntity;
|
|
29
|
-
import springfox.documentation.builders.RequestHandlerSelectors;
|
|
30
|
-
import springfox.documentation.service.ApiInfo;
|
|
31
|
-
import springfox.documentation.service.Contact;
|
|
32
|
-
import springfox.documentation.spi.DocumentationType;
|
|
33
|
-
import springfox.documentation.spring.web.plugins.Docket;
|
|
34
27
|
|
|
35
|
-
import
|
|
36
|
-
import
|
|
37
|
-
import
|
|
38
|
-
import java.util.HashSet;
|
|
39
|
-
|
|
40
|
-
import static springfox.documentation.builders.PathSelectors.regex;
|
|
28
|
+
import tech.jhipster.config.JHipsterConstants;
|
|
29
|
+
import tech.jhipster.config.JHipsterProperties;
|
|
30
|
+
import tech.jhipster.config.apidoc.customizer.JHipsterOpenApiCustomizer;
|
|
41
31
|
|
|
42
32
|
@Configuration
|
|
43
33
|
@Profile(JHipsterConstants.SPRING_PROFILE_API_DOCS)
|
|
44
34
|
public class OpenApiConfiguration {
|
|
45
35
|
|
|
46
|
-
|
|
47
|
-
public SpringfoxCustomizer noApiFirstCustomizer() {
|
|
48
|
-
return docket -> docket.select()
|
|
49
|
-
.apis(RequestHandlerSelectors.basePackage("<%= packageName %>.web.api").negate());
|
|
50
|
-
}
|
|
36
|
+
public static final String API_FIRST_PACKAGE = "<%= packageName %>.web.api";
|
|
51
37
|
|
|
52
38
|
@Bean
|
|
53
|
-
|
|
39
|
+
@ConditionalOnMissingBean(name = "apiFirstGroupedOpenAPI")
|
|
40
|
+
public GroupedOpenApi apiFirstGroupedOpenAPI(
|
|
41
|
+
JHipsterOpenApiCustomizer jhipsterOpenApiCustomizer,
|
|
42
|
+
JHipsterProperties jHipsterProperties
|
|
43
|
+
) {
|
|
54
44
|
JHipsterProperties.ApiDocs properties = jHipsterProperties.getApiDocs();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
ApiInfo apiInfo = new ApiInfo(
|
|
62
|
-
"API First " + properties.getTitle(),
|
|
63
|
-
properties.getDescription(),
|
|
64
|
-
properties.getVersion(),
|
|
65
|
-
properties.getTermsOfServiceUrl(),
|
|
66
|
-
contact,
|
|
67
|
-
properties.getLicense(),
|
|
68
|
-
properties.getLicenseUrl(),
|
|
69
|
-
new ArrayList<>()
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
return new Docket(DocumentationType.OAS_30)
|
|
73
|
-
.groupName("openapi")
|
|
74
|
-
.host(properties.getHost())
|
|
75
|
-
.protocols(new HashSet<>(Arrays.asList(properties.getProtocols())))
|
|
76
|
-
.apiInfo(apiInfo)
|
|
77
|
-
.useDefaultResponseMessages(properties.isUseDefaultResponseMessages())
|
|
78
|
-
.forCodeGeneration(true)
|
|
79
|
-
.directModelSubstitute(ByteBuffer.class, String.class)
|
|
80
|
-
.genericModelSubstitutes(ResponseEntity.class)
|
|
81
|
-
.ignoredParameterTypes(Pageable.class)
|
|
82
|
-
.select()
|
|
83
|
-
.apis(RequestHandlerSelectors.basePackage("<%= packageName %>.web.api"))
|
|
84
|
-
.paths(regex(properties.getDefaultIncludePattern()))
|
|
45
|
+
return GroupedOpenApi.builder()
|
|
46
|
+
.group("openapi")
|
|
47
|
+
.addOpenApiCustomiser(jhipsterOpenApiCustomizer)
|
|
48
|
+
.packagesToScan(API_FIRST_PACKAGE)
|
|
49
|
+
.pathsToMatch(properties.getDefaultIncludePattern())
|
|
85
50
|
.build();
|
|
86
51
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
52
|
}
|
package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs
CHANGED
|
@@ -268,14 +268,14 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
|
|
|
268
268
|
<%_ if (applicationTypeMonolith) { _%>
|
|
269
269
|
.and()
|
|
270
270
|
.httpBasic()
|
|
271
|
-
|
|
271
|
+
<%_ } _%>
|
|
272
272
|
.and()
|
|
273
273
|
.apply(securityConfigurerAdapter());
|
|
274
|
-
|
|
275
|
-
|
|
274
|
+
<%_ } else if (authenticationTypeOauth2) { _%>
|
|
275
|
+
<%_ if (applicationTypeMonolith) { _%>
|
|
276
276
|
.and()
|
|
277
277
|
.oauth2Login()
|
|
278
|
-
|
|
278
|
+
<%_ } _%>
|
|
279
279
|
.and()
|
|
280
280
|
.oauth2ResourceServer()
|
|
281
281
|
.jwt()
|
|
@@ -283,7 +283,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
|
|
|
283
283
|
.and()
|
|
284
284
|
.and()
|
|
285
285
|
.oauth2Client();
|
|
286
|
-
|
|
286
|
+
<%_ } _%>
|
|
287
287
|
// @formatter:on
|
|
288
288
|
}
|
|
289
289
|
<%_ if (authenticationTypeJwt) { _%>
|
|
@@ -211,7 +211,7 @@ public class SecurityConfiguration {
|
|
|
211
211
|
// @formatter:off
|
|
212
212
|
http
|
|
213
213
|
.securityMatcher(new NegatedServerWebExchangeMatcher(new OrServerWebExchangeMatcher(
|
|
214
|
-
pathMatchers("/app/**", "/i18n/**", "/content/**", "/swagger-ui/**", "/
|
|
214
|
+
pathMatchers("/app/**", "/i18n/**", "/content/**", "/swagger-ui/**", "/v3/api-docs/**", "/test/**"),
|
|
215
215
|
pathMatchers(HttpMethod.OPTIONS, "/**")
|
|
216
216
|
)))
|
|
217
217
|
.csrf()
|
|
@@ -278,11 +278,9 @@ public class SecurityConfiguration {
|
|
|
278
278
|
.pathMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN)
|
|
279
279
|
.pathMatchers("/api/**").authenticated()
|
|
280
280
|
<%_ if (applicationTypeGateway) { _%>
|
|
281
|
-
|
|
282
|
-
// microfrontend resources are loaded by webpack without a bearer-token, they need to be public
|
|
281
|
+
// microfrontend resources are loaded by webpack without authentication, they need to be public
|
|
283
282
|
.pathMatchers("/services/*/*.js").permitAll()
|
|
284
283
|
.pathMatchers("/services/*/*.js.map").permitAll()
|
|
285
|
-
<%_ } _%>
|
|
286
284
|
.pathMatchers("/services/*/v3/api-docs").hasAuthority(AuthoritiesConstants.ADMIN)
|
|
287
285
|
<%_ } _%>
|
|
288
286
|
<%_ if (applicationTypeMonolith || applicationTypeGateway) { _%>
|
|
@@ -308,7 +306,7 @@ public class SecurityConfiguration {
|
|
|
308
306
|
}
|
|
309
307
|
<%_ if (authenticationTypeOauth2) { _%>
|
|
310
308
|
|
|
311
|
-
|
|
309
|
+
<%_ if (applicationTypeGateway) { _%>
|
|
312
310
|
private ServerOAuth2AuthorizationRequestResolver authorizationRequestResolver(
|
|
313
311
|
ReactiveClientRegistrationRepository clientRegistrationRepository) {
|
|
314
312
|
DefaultServerOAuth2AuthorizationRequestResolver authorizationRequestResolver =
|
|
@@ -325,7 +323,7 @@ public class SecurityConfiguration {
|
|
|
325
323
|
uriBuilder.queryParam("audience", jHipsterProperties.getSecurity().getOauth2().getAudience())
|
|
326
324
|
.build());
|
|
327
325
|
}
|
|
328
|
-
|
|
326
|
+
<%_ } _%>
|
|
329
327
|
|
|
330
328
|
Converter<Jwt, Mono<AbstractAuthenticationToken>> jwtAuthenticationConverter() {
|
|
331
329
|
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
|
|
@@ -79,7 +79,6 @@ import javax.servlet.*;
|
|
|
79
79
|
import java.io.File;
|
|
80
80
|
import java.nio.charset.StandardCharsets;
|
|
81
81
|
import java.nio.file.Paths;
|
|
82
|
-
import java.util.*;
|
|
83
82
|
|
|
84
83
|
import static java.net.URLDecoder.decode;
|
|
85
84
|
<%_ } _%>
|
|
@@ -184,9 +183,7 @@ public class WebConfigurer implements <% if (!reactive) { %>ServletContextInitia
|
|
|
184
183
|
log.debug("Registering CORS filter");
|
|
185
184
|
source.registerCorsConfiguration("/api/**", config);
|
|
186
185
|
source.registerCorsConfiguration("/management/**", config);
|
|
187
|
-
source.registerCorsConfiguration("/v2/api-docs", config);
|
|
188
186
|
source.registerCorsConfiguration("/v3/api-docs", config);
|
|
189
|
-
source.registerCorsConfiguration("/swagger-resources", config);
|
|
190
187
|
source.registerCorsConfiguration("/swagger-ui/**", config);
|
|
191
188
|
<%_ if (applicationTypeGateway) { _%>
|
|
192
189
|
source.registerCorsConfiguration("/*/api/**", config);
|
package/generators/server/templates/src/main/java/package/config/neo4j/Neo4jMigrations.java.ejs
CHANGED
|
@@ -20,6 +20,7 @@ package <%= packageName %>.config.neo4j;
|
|
|
20
20
|
|
|
21
21
|
import ac.simons.neo4j.migrations.core.JavaBasedMigration;
|
|
22
22
|
import ac.simons.neo4j.migrations.core.MigrationContext;
|
|
23
|
+
import ac.simons.neo4j.migrations.core.MigrationsException;
|
|
23
24
|
|
|
24
25
|
import java.io.IOException;
|
|
25
26
|
import java.util.List;
|
|
@@ -46,11 +47,16 @@ final class Neo4jMigrations {
|
|
|
46
47
|
static class V0001__CreateUsers implements JavaBasedMigration {
|
|
47
48
|
|
|
48
49
|
@Override
|
|
49
|
-
public void apply(MigrationContext context)
|
|
50
|
+
public void apply(MigrationContext context) {
|
|
50
51
|
|
|
51
52
|
ObjectMapper om = new ObjectMapper();
|
|
52
53
|
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
|
|
53
|
-
Resource[] resources
|
|
54
|
+
Resource[] resources;
|
|
55
|
+
try {
|
|
56
|
+
resources = resourcePatternResolver.getResources("classpath:config/neo4j/migrations/user__*.json");
|
|
57
|
+
} catch (IOException e) {
|
|
58
|
+
throw new MigrationsException("Could not load user definition resources.", e);
|
|
59
|
+
}
|
|
54
60
|
|
|
55
61
|
JavaType type = om.getTypeFactory().
|
|
56
62
|
constructMapType(Map.class, String.class, Object.class);
|
|
@@ -69,13 +75,17 @@ final class Neo4jMigrations {
|
|
|
69
75
|
try (Session session = context.getSession()) {
|
|
70
76
|
|
|
71
77
|
for (Resource resource : resources) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
try {
|
|
79
|
+
Map<String, Object> user = om.readValue(resource.getInputStream(), type);
|
|
80
|
+
user.put("user_id", UUID.randomUUID().toString());
|
|
81
|
+
List<String> authorities = (List<String>) user.remove("authorities");
|
|
82
|
+
user.remove("_class");
|
|
83
|
+
|
|
84
|
+
session.writeTransaction(
|
|
85
|
+
t -> t.run(query, Values.parameters("user", user, "authorities", authorities)).consume());
|
|
86
|
+
} catch (IOException e) {
|
|
87
|
+
throw new MigrationsException("Could not load resource " + resource.getDescription() + ".", e);
|
|
88
|
+
}
|
|
79
89
|
}
|
|
80
90
|
}
|
|
81
91
|
}
|
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/repository/AuthorityRepository.java.ejs
CHANGED
|
@@ -77,12 +77,12 @@ _%>
|
|
|
77
77
|
public interface AuthorityRepository extends <% if (databaseTypeSql) { %><% if (reactive) { %>R2dbc<% } else { %>Jpa<% } %>Repository<% } else { %><% if (reactive && !databaseTypeCouchbase) { %>Reactive<% } %><% if (databaseTypeMongodb) { %>MongoRepository<% } %><% if (databaseTypeNeo4j) { %>Neo4jRepository<% } %><% if (databaseTypeCouchbase) { %>JHipsterCouchbaseRepository<% } %><% } %><Authority, String> {
|
|
78
78
|
<%_ if (databaseTypeNeo4j) { _%>
|
|
79
79
|
<% if (!reactive) { %>// See https://github.com/neo4j/sdn-rx/issues/51<%_ } _%>
|
|
80
|
-
<% if (reactive) { %>Flux<% } else { %>List<% }
|
|
80
|
+
<% if (reactive) { %>Flux<% } else { %>List<% } %><Authority> findAll();
|
|
81
81
|
<%_ } _%>
|
|
82
82
|
<%_ if (databaseTypeCouchbase) { _%>
|
|
83
83
|
@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}")
|
|
84
84
|
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
|
|
85
|
-
<%= listOrFlux
|
|
85
|
+
<%= listOrFlux %><Authority> findAll();
|
|
86
86
|
<%_ } _%>
|
|
87
87
|
|
|
88
88
|
}
|
package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs
CHANGED
|
@@ -224,9 +224,7 @@ public interface UserRepository extends <% if (databaseTypeSql) { %>JpaRepositor
|
|
|
224
224
|
<%_ if (cacheManagerIsAvailable) { _%>
|
|
225
225
|
@Cacheable(cacheNames = USERS_BY_LOGIN_CACHE)
|
|
226
226
|
<%_ } _%>
|
|
227
|
-
<%_ if (databaseTypeCouchbase) { _%>
|
|
228
227
|
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
|
|
229
|
-
<%_ } _%>
|
|
230
228
|
default <%= optionalOrMono %><<%= asEntity('User') %>> findOneByLogin(String login) {
|
|
231
229
|
return findById(<%= asEntity('User') %>.PREFIX + ID_DELIMITER + login);
|
|
232
230
|
}
|
|
@@ -464,29 +462,6 @@ class UserRepositoryInternalImpl implements UserRepositoryInternal {
|
|
|
464
462
|
}
|
|
465
463
|
}
|
|
466
464
|
|
|
467
|
-
class UserSqlHelper {
|
|
468
|
-
static List<Expression> getColumns(Table table, String columnPrefix) {
|
|
469
|
-
List<Expression> columns = new ArrayList<>();
|
|
470
|
-
columns.add(Column.aliased("id", table, columnPrefix + "_id"));
|
|
471
|
-
columns.add(Column.aliased("login", table, columnPrefix + "_login"));
|
|
472
|
-
<%_ if (!authenticationTypeOauth2) { _%>
|
|
473
|
-
columns.add(Column.aliased("password_hash", table, columnPrefix + "_password"));
|
|
474
|
-
<%_ } _%>
|
|
475
|
-
columns.add(Column.aliased("first_name", table, columnPrefix + "_first_name"));
|
|
476
|
-
columns.add(Column.aliased("last_name", table, columnPrefix + "_last_name"));
|
|
477
|
-
columns.add(Column.aliased("email", table, columnPrefix + "_email"));
|
|
478
|
-
columns.add(Column.aliased("activated", table, columnPrefix + "_activated"));
|
|
479
|
-
columns.add(Column.aliased("lang_key", table, columnPrefix + "_lang_key"));
|
|
480
|
-
columns.add(Column.aliased("image_url", table, columnPrefix + "_image_url"));
|
|
481
|
-
<%_ if (!authenticationTypeOauth2) { _%>
|
|
482
|
-
columns.add(Column.aliased("activation_key", table, columnPrefix + "_activation_key"));
|
|
483
|
-
columns.add(Column.aliased("reset_key", table, columnPrefix + "_reset_key"));
|
|
484
|
-
columns.add(Column.aliased("reset_date", table, columnPrefix + "_reset_date"));
|
|
485
|
-
<%_ } _%>
|
|
486
|
-
return columns;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
465
|
<%_ } else if (databaseTypeCassandra) { _%>
|
|
491
466
|
@Repository
|
|
492
467
|
public class UserRepository {
|
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
|
|
|
@@ -48,6 +52,8 @@ public class TokenProvider {
|
|
|
48
52
|
|
|
49
53
|
private static final String AUTHORITIES_KEY = "auth";
|
|
50
54
|
|
|
55
|
+
private static final String INVALID_JWT_TOKEN = "Invalid JWT token.";
|
|
56
|
+
|
|
51
57
|
private final Key key;
|
|
52
58
|
|
|
53
59
|
private final JwtParser jwtParser;
|
|
@@ -56,7 +62,9 @@ public class TokenProvider {
|
|
|
56
62
|
|
|
57
63
|
private final long tokenValidityInMillisecondsForRememberMe;
|
|
58
64
|
|
|
59
|
-
|
|
65
|
+
private final SecurityMetersService securityMetersService;
|
|
66
|
+
|
|
67
|
+
public TokenProvider(JHipsterProperties jHipsterProperties, SecurityMetersService securityMetersService) {
|
|
60
68
|
byte[] keyBytes;
|
|
61
69
|
String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret();
|
|
62
70
|
if (!ObjectUtils.isEmpty(secret)) {
|
|
@@ -75,6 +83,8 @@ public class TokenProvider {
|
|
|
75
83
|
this.tokenValidityInMillisecondsForRememberMe =
|
|
76
84
|
1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
|
|
77
85
|
.getTokenValidityInSecondsForRememberMe();
|
|
86
|
+
|
|
87
|
+
this.securityMetersService = securityMetersService;
|
|
78
88
|
}
|
|
79
89
|
|
|
80
90
|
public String createToken(Authentication authentication, boolean rememberMe) {
|
|
@@ -118,11 +128,28 @@ public class TokenProvider {
|
|
|
118
128
|
public boolean validateToken(String authToken) {
|
|
119
129
|
try {
|
|
120
130
|
jwtParser.parseClaimsJws(authToken);
|
|
131
|
+
|
|
121
132
|
return true;
|
|
122
|
-
} catch (
|
|
123
|
-
|
|
124
|
-
|
|
133
|
+
} catch (ExpiredJwtException e) {
|
|
134
|
+
this.securityMetersService.trackTokenExpired();
|
|
135
|
+
|
|
136
|
+
log.trace(INVALID_JWT_TOKEN, e);
|
|
137
|
+
} catch (UnsupportedJwtException e) {
|
|
138
|
+
this.securityMetersService.trackTokenUnsupported();
|
|
139
|
+
|
|
140
|
+
log.trace(INVALID_JWT_TOKEN, e);
|
|
141
|
+
} catch (MalformedJwtException e) {
|
|
142
|
+
this.securityMetersService.trackTokenMalformed();
|
|
143
|
+
|
|
144
|
+
log.trace(INVALID_JWT_TOKEN, e);
|
|
145
|
+
} catch (SignatureException e) {
|
|
146
|
+
this.securityMetersService.trackTokenInvalidSignature();
|
|
147
|
+
|
|
148
|
+
log.trace(INVALID_JWT_TOKEN, e);
|
|
149
|
+
} catch (IllegalArgumentException e) { // TODO: should we let it bubble (no catch), to avoid defensive programming and follow the fail-fast principle?
|
|
150
|
+
log.error("Token validation error {}", e.getMessage());
|
|
125
151
|
}
|
|
152
|
+
|
|
126
153
|
return false;
|
|
127
154
|
}
|
|
128
155
|
}
|
|
@@ -34,10 +34,11 @@ 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
|
-
import java.util.HashMap;
|
|
39
39
|
import java.util.List;
|
|
40
40
|
import java.util.Map;
|
|
41
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
41
42
|
import java.util.stream.Collectors;
|
|
42
43
|
import java.util.stream.StreamSupport;
|
|
43
44
|
|
|
@@ -53,7 +54,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
|
|
|
53
54
|
|
|
54
55
|
private final ClientRegistration registration;
|
|
55
56
|
|
|
56
|
-
private final Map<String, ObjectNode> users = new
|
|
57
|
+
private final Map<String, ObjectNode> users = new ConcurrentHashMap<>();
|
|
57
58
|
|
|
58
59
|
public CustomClaimConverter(ClientRegistration registration, RestTemplate restTemplate) {
|
|
59
60
|
this.registration = registration;
|
|
@@ -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;
|