登录时 JHipster 未收到来自 Keycloak 用户的角色

J. *_*ica 3 spring-security oauth-2.0 spring-boot jhipster keycloak

我有一个带有 oauth2 的 JHipster 单体应用程序,在本地运行 Keycloak。我不知道 jhipster 究竟应该如何与 oauth2 一起工作......首先我以为它会自动创建用户,但它没有,所以我配置了keycloak:我创建了jhipster领域、web_app客户端、客户端角色ROLE_ADMINROLE_USER,以及用户adminuser他们的正确角色。问题是当我以管理员身份登录时,它未被识别为ROLE_ADMIN,因此我无法访问管理员菜单。所以我开始查看代码,试图了解 Jhipster 如何从 Keycloak 接收凭据,并且我意识到OAuth2Authentication对象中AccountResource.java没有带ROLE_ADMIN,但ROLE_USER我不明白为什么。这OAuth2Authentication json 中的对象如下所示:

    {    
"authorities": [
        {
          "authority": "ROLE_USER"
        }
      ],
      "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": "rkkveY_Xa5zFFd0SKu9Of_FLGRnbdiTPHdnpj4gc",
        "tokenValue": "eyJhbGciOiJSUzI1...",
        "tokenType": "bearer",
        "decodedDetails": null
      },
      "authenticated": true,
      "userAuthentication": {
        "authorities": [
          {
            "authority": "ROLE_USER"
          }
        ],
        "details": {
          "sub": "f348bbbb-9441-4543-9940-9da31e50d877",
          "email _verified": true,
          "name": "Admin Administrator",
          "preferred_username": "admin",
          "given_name": "Admin",
          "family_name": "Administrator",
          "email": "admin@localhost"
        },
        "authenticated": true,
        "principal": "Admin Administrator",
        "credentials": "N/A",
        "name": "Admin Administrator"
      },
      "clientO nly": false,
      "principal": "Admin Administrator",
      "oauth2Request": {
        "clientId": "web_app",
        "scope": [

        ],
        "requestParameters": {

        },
        "resourceIds": [

        ],
        "authorities": [

        ],
        "approved": true,
        "refresh": false,
        "redirectUri": null,
        "responseTypes": [

        ],
        "extensions": {

        },
        "grantType": null,
        "refreshTok enRequest": null
      },
      "credentials": "",
      "name": "Admin Administrator"
    }
Run Code Online (Sandbox Code Playgroud)

这是 yo-rc.json:

{
    "generator-jhipster": {
        "promptValues": {
            "packageName": "xxxxxxxxxxx"
        },
        "jhipsterVersion": "5.7.2",
        "applicationType": "monolith",
        "baseName": "XXXXXXXXXX",
        "packageName": "xxxxxxxxxxxxxx",
        "packageFolder": "xxxxxxxxxxxxxx",
        "serverPort": "8080",
        "authenticationType": "oauth2",
        "cacheProvider": "ehcache",
        "enableHibernateCache": true,
        "websocket": false,
        "databaseType": "sql",
        "devDatabaseType": "h2Disk",
        "prodDatabaseType": "mysql",
        "searchEngine": false,
        "messageBroker": false,
        "serviceDiscoveryType": false,
        "buildTool": "maven",
        "enableSwaggerCodegen": false,
        "clientFramework": "angularX",
        "useSass": false,
        "clientPackageManager": "npm",
        "testFrameworks": [],
        "jhiPrefix": "jhi",
        "otherModules": [],
        "enableTranslation": false
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

小智 7

在 keycloak 管理中,转到 Clients >> YOUR_CLIENT >> Mappers -> Add new mapper -> 将 mapper type 设置为“User client Role”,将“Token claim name”设置为“authorities”,将 Claim JSON Type 设置为 string。