当前位置: 首页 > 知识库问答 >
问题:

无法访问受KeyCloak-Quarkus保护的资源

阳德润
2023-03-14
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy</artifactId>
    <version>1.13.6.Final</version>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-jackson</artifactId>
    <version>1.13.6.Final</version>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-oidc</artifactId>
    <version>1.13.6.Final</version>
</dependency>
# CORS configuration
quarkus.http.cors=true
quarkus.http.cors.access-control-allow-credentials=true
quarkus.http.cors.headers=accept, origin, authorization, content-type, x-requested-with

# OpenId Connect configuration
quarkus.oidc.auth-server-url=http://keycloak-myproject.192.168.1.110.nip.io/auth/realms/secured-realm
quarkus.oidc.tls.verification=none
quarkus.oidc.tenant-enabled=false

# Logging configuration
quarkus.log.level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".min-level=TRACE
quarkus.log.category."io.quarkus.oidc.runtime.OidcProvider".level=TRACE

# resteasy security configuration
resteasy.role.based.security=true
import io.quarkus.security.identity.SecurityIdentity;
import javax.annotation.security.RolesAllowed;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.jboss.resteasy.annotations.cache.NoCache;

@Path("/api")
public class SecuredResource {

  @Inject
  SecurityIdentity identity;

  @Inject
  JsonWebToken jwt;

  @GET
  @RolesAllowed("USERS")
  @NoCache
  @Path("/secured")
  @Produces(MediaType.TEXT_PLAIN)
  public String secured() {
    String userName = identity.getPrincipal().getName();
    return userName;
  }

}

从quarkus集装箱码头,我可以使用以下命令访问keycloak服务器

curl -v -X GET $keycloak_url -H "Authorization: Bearer "$access_token

返回200状态;但无法访问受保护的资源。

我在这里做错了什么?

共有1个答案

呼延河
2023-03-14
http://keycloak-myproject.192.168.1.110.nip.io/auth/realms/secured-realm

您确定该url存在吗?

你试着进入它了吗?成功了吗?

因为,当我尝试访问服务器上类似的url时:

https://users.skycomposer.net/auth/realms/secured-realm
#Keycloak Configuration
keycloak.auth-server-url=https://users.skycomposer.net/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true

附言。如果此配置没有帮助,那么,请为您的Quarkus应用程序提供安全配置。

我对Spring Boot应用程序的安全配置如下所示:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    // Submits the KeycloakAuthenticationProvider to the AuthenticationManager
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    // Specifies the session authentication strategy
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
            .antMatchers("/customers*", "/users*")
            .hasRole("user")
            .anyRequest()
            .permitAll();
    }
}

但对Quarkus来说,当然应该有所不同。在任何情况下,您的Quarkus安全配置都可能有助于找到问题的原因。

 类似资料:
  • 通过向资源服务器出示访问令牌,客户端访问受保护资源。资源服务器必须验证访问令牌,并确保它没有过期且其范围涵盖了请求的资源。资源服务器用于验证访问令牌的方法(以及任何错误响应)超出了本规范的范围,但一般包括资源服务器和授权服务器之间的互动或协调。 客户端使用访问令牌与资源服务器进行证认的方法依赖于授权服务器颁发的访问令牌的类型。通常,它涉及到使用具有所采用的访问令牌类型的规范定义的身份验证方案(如R

  • 客户端向资源服务器提供访问令牌以访问受保护资源。 资源服务器必须验证并验证访问令牌是否有效且未过期。 发送凭据有两种标准方式 - Bearer Token - 访问令牌只能作为授权HTTP头中的后备选项放在POST请求正文或GET URL参数中。 它们包含在授权标题中,如下所示 - Authorization: Bearer [token-value] 例如 - GET/resource/1 H

  • 问题内容: 我有两节课。 类具有受保护的方法,是的实例。 Class 与class在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加

  • 问题内容: 通读“用Java思考”,我陷入了《内部类》一章的ex:6。 练习6:(2)在自己的程序包中使用至少一种方法创建一个接口。在单独的程序包中创建一个类。添加一个实现该接口的受保护的内部类。在第三个包中,从您的类继承,并在方法内部,返回受保护的内部类的对象,并在返回期间向上转换到接口。 这是我的代码: IOne.java 接口 COne.java 具有实现接口的受保护内部类的类 CTwo.j

  • 问题内容: 在下面的代码中,Consumer类可以访问Parent类的受保护方法。由于Parent和Consumer类之间没有关系,这怎么可能。 谢谢 问题答案: 表示:相同的包或通过继承。由于您的课程都在(实际上不建议使用),因此可以进行访问。顺便说一句:如果您尝试测试Java访问控制,则会忘记(= no修饰符= )。 另一方面,访问是指:从该特定类(以及仍然是主机类成员的非静态内部类)之外的任

  • 我有一个非常简单的Spring Boot应用程序,其资源位于和。 下面是我的文件。 下面是我的文件。 下面是我的文件。 这是我的政策。 这里是资源。 这是许可书。 PEP负责执行来自Keycloak服务器的访问决策,这些决策是通过评估与受保护资源相关联的策略来做出的。它在应用程序中充当筛选器或拦截器,以便根据这些决定授予的权限检查对受保护资源的特定请求是否可以实现。 这听起来和我想做的一模一样。不