ams-spring-boot-shopping: `/products` always returns 403
Mantenedores costumam responder em até 1 dia
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 72/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- java, spring-boot
- Domínio
- api, authentication, backend, security
Direção de pesquisa
Comece em ams-spring-boot-shopping/src/main/java/com/sap/cloud/security/ams/samples/config/SecurityConfiguration.java, em SecurityConfiguration#filterChain. Reproduza a requisição com um token IAS válido e, em seguida, inspecione como o resource server converte o Jwt antes da execução da autorização AMS. Está concluído quando o principal AMS estiver estabelecido e GET /products e GET /privileges retornarem as respostas autorizadas esperadas em vez de 403.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
In ams-spring-boot-shopping, calling GET /products (and GET /privileges) with a valid IAS token is rejected with HTTP 403, even though the app is bound, token is valid, policies are pushed.
Steps to reproduce
- Deploy the sample as single-tenant IAS app on CF. Bind the app to a IAS app, create app2app trust, create client credentials for the consumer app.
- Obtain a valid IAS token for the consumer app. Make sure to hit the right dependency. Should look like [1]
curl -H "Authorization: Bearer <token>" https://<app>/products
Expected: 200 with the product list (the GetProducts API maps to internal.GetProducts → shopping.ReadProducts → GRANT read ON products).
Actual: 403.
Root cause
The request is authenticated but no AMS principal is ever established, so the AMS authorization check runs against empty authorizations and denies.
SecurityConfiguration#filterChain wires the resource server with:
With the default converter, Spring produces a plain org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken whose principal is a plain org.springframework.security.oauth2.jwt.Jwt, not a SAP com.sap.cloud.security.spring.token.authentication.AuthenticationToken.
The cloud-security JavaSecurityContextHolderStrategy only copies the SAP Token into com.sap.cloud.security.token.SecurityContext when the Spring Authentication's principal is a SAP Token. Because it isn't, SecurityContext.getToken() stays null, so com.sap.cloud.security.ams.api.Principal.fromSecurityContext() returns null, and SciAuthorizationsProvider short-circuits to empty authorizations. Every @CheckPrivilege then evaluates granted=false → 403. Logs here [2].
Direction for a fix
The app needs a jwtAuthenticationConverter that turns the validated IAS Jwt into a SAP AuthenticationToken, so the AMS principal is established. Worked for me afterwards.
[1]
{
"ias_apis": [
"GetProducts"
],
"sub": "consumer",
"aud": "ams-secured-app",
"app_tid": "app-tid",
"sap_id_type": "app",
"azp": "consumer",
"iss": "https://iasid.ondemand.com",
"azpacr": "1",
"exp": 1787302610,
"iat": 1787299010,
"jti": "096f3ac5-adf2-4516-845b-dd295afbfab0"
}
[2]
IasJwtDecoder : The token of service IAS was successfully validated.
BearerTokenAuthenticationFilter : Set SecurityContextHolder to JwtAuthenticationToken
[Principal=org.springframework.security.oauth2.jwt.Jwt@..., Granted Authorities=[]]
SciAuthorizationsProvider : No principal provided. Using empty authorizations.
...
horizationManagerBeforeMethodInterceptor : Failed to authorize ... ProductsService.getProducts()
... result AuthorizationDecision [granted=false]
- Linguagem predominante
- Java
- Estrelas
- 0
- Forks
- 0
- Merge médio
- 4h 34min
- PRs com merge (30d)
- 10
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de SAP-samples/ams-samples-java
-
docs: Javalin sample README claims AMS authorization is an unimplemented TODO, but it is fully implementedTalvez já em andamento @finkmanAtSap assumiu há 22 dias. Aberta
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 78/100
SAP-samples/ams-samples-java#98 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de SAP-samples/ams-samples-java
Issues semelhantes
-
Flight SQL JDBC parses boolean properties case-sensitively, silently disabling TLS for useEncryption=TRUETalvez já em andamento @Arawoof06 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 79/100
apache/arrow-java#1357 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 77/100
apache/rocketmq-dashboard#6610 ·
Mantenedores costumam responder em até 3 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
MetricsHub/metricshub-community#1396 ·
Mantenedores costumam responder em até 1 dia
-
L: java:gradle L: java:maven L: ruby:bundler T: bug 🐞
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
dependabot/dependabot-core#16547 ·
Mantenedores costumam responder em até 1 dia
-
Citationcount column sorts alphabetically instead of numericallyTalvez já em andamento @kpunia306 assumiu hoje. Abertastatus: needs-triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
JabRef/jabref#17459 · 4 comentários ·
Mantenedores costumam responder em até 1 dia