Проблема при настройке ролей для приложения Spring Boot: Keycloak

Я использую keycloak для защиты приложения с весенней загрузкой. Есть API: /system/doccheck, который я хочу защитить.

Функция Thuis выглядит следующим образом:

@GetMapping("/doccheck")
    public String docCheck() {
        return "Successfully hit the Doc Test API ...";
    }

Я настраиваю область "cccrealm" и клиент "cccapp". Я настраиваю пользователя user1 с ролью "доктор". Я хочу, чтобы только эта роль имела доступ к API:/system/doccheck.

Вот как я настроил application.properties:

keycloak.realm = cccrealm
keycloak.auth-server-url = http://127.0.0.1:8080/auth
keycloak.ssl-required = none
keycloak.resource = cccapp
keycloak.use-resource-role-mappings = true
keycloak.public-client=true

keycloak.securityConstraints[0].authRoles[0] = doctor
keycloak.securityConstraints[0].securityCollections[0].name = doconly
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /system/doccheck

Я вхожу в систему пользователя: user1, используя:

/auth/realms/cccrealm/protocol/openid-connect/token

--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=cccapp' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=user1' \
--data-urlencode 'password=password'

В ответ я получаю токен доступа (но ответ не содержит ожидаемых ролей пользователей)

В любом случае, я затем вызываю API: /system/doccheck из Postman.

Я настраиваю заголовок авторизации для отправки токена-носителя. Вот как это выглядит:

curl --location --request GET 'http://localhost:8888/system/doccheck' \
--header 'Authorization: Bearer <token string>'

Но я получаю следующую ошибку в приведенном выше коде функции:

2020-07-24 18:53:26.379 ERROR 17024 --- [nio-8888-exec-1] o.a.c.c.C.[Tomcat].[localhost]           : Exception Processing /system/doccheck

java.lang.NullPointerException: null
    at java.net.URI$Parser.parse(URI.java:3041) ~[na:1.8.0_251]
    at java.net.URI.<init>(URI.java:588) ~[na:1.8.0_251]
    at java.net.URI.create(URI.java:850) ~[na:1.8.0_251]
    at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:66) ~[httpclient-4.5.12.jar:4.5.12]
    at org.keycloak.adapters.rotation.JWKPublicKeyLocator.sendRequest(JWKPublicKeyLocator.java:97) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.rotation.JWKPublicKeyLocator.getPublicKey(JWKPublicKeyLocator.java:63) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.rotation.AdapterTokenVerifier.getPublicKey(AdapterTokenVerifier.java:121) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.rotation.AdapterTokenVerifier.createVerifier(AdapterTokenVerifier.java:111) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.rotation.AdapterTokenVerifier.verifyToken(AdapterTokenVerifier.java:47) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.BearerTokenRequestAuthenticator.authenticateToken(BearerTokenRequestAuthenticator.java:103) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.BearerTokenRequestAuthenticator.authenticate(BearerTokenRequestAuthenticator.java:88) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.RequestAuthenticator.authenticate(RequestAuthenticator.java:67) ~[keycloak-adapter-core-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.authenticateInternal(AbstractKeycloakAuthenticatorValve.java:203) ~[spring-boot-container-bundle-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve.authenticate(KeycloakAuthenticatorValve.java:50) ~[spring-boot-container-bundle-10.0.2.jar:10.0.2]
    at org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve.doAuthenticate(KeycloakAuthenticatorValve.java:57) ~[spring-boot-container-bundle-10.0.2.jar:10.0.2]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:631) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.invoke(AbstractKeycloakAuthenticatorValve.java:181) ~[spring-boot-container-bundle-10.0.2.jar:10.0.2]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.31.jar:9.0.31]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]

Пожалуйста, предложите, в чем может быть возможная проблема. Ранее я упоминал, что я не получаю роли пользователей из конечной точки токена. Может ли это быть проблемой? Это из-за неправильной конфигурации?

Кроме того, в самой функции API мне нужно добавить аннотацию, чтобы она была защищена?

0 ответов

Другие вопросы по тегам