带有 Keycloak 的 Spring 应用程序返回 401 错误

Dan*_*Dan 4 java spring spring-security keycloak

我试图通过 Keycloak 访问 Spring 应用程序,但总是收到 401 未经授权的错误。基本上,我有一个单独运行良好的聊天模块,但是一旦添加 Keycloak,由于 401 错误,我将无法访问该应用程序。我已经遵循了大约 3 个教程,这些教程显示了与我所做的类似的事情,但我仍然不知道我做错了什么。

这是我的应用程序的配置:

keycloak: 
    enabled: true
    realm: myReal
    resource: myReal-api
    public-client: true
    bearer-only: true
    auth-server-url: http://localhost:8080/auth
    credentials:
      secret: 82eXXXXX-3XXX-4XXX-XXX7-287aXXXXXXXX
    principal-attribute: preferred_username
    cors: true
Run Code Online (Sandbox Code Playgroud)

我有localhost:port/一个第一个界面(没有 Keycloak 安全性),它有一个到我的服务的链接,即localhost:port/index/{topicName}. 现在,当我单击该链接时,我应该会看到 Keycloak 身份验证屏幕,但我却收到了 401 错误。

我检查了请求的标头,将 HttpServletRequest 作为参数添加到我的displayMessage方法中,实际上我可以在 IDE 的控制台中显示 access_token 和 X-Auth-Token。但似乎当我点击该链接时,它发送的请求没有令牌。

这是我的控制器方法(我的控制器类注释为@Controller

keycloak: 
    enabled: true
    realm: myReal
    resource: myReal-api
    public-client: true
    bearer-only: true
    auth-server-url: http://localhost:8080/auth
    credentials:
      secret: 82eXXXXX-3XXX-4XXX-XXX7-287aXXXXXXXX
    principal-attribute: preferred_username
    cors: true
Run Code Online (Sandbox Code Playgroud)

我的 Keycloak 配置文件的灵感来自我读过的教程,因此其中可能存在我不知道的错误(不确定方法access和方法之间有什么区别hasRole):

@GetMapping(path = "/")
    public String index() {
        return "external";
    }

    @GetMapping(path = "/index/{topicName}",
            produces = MediaType.APPLICATION_JSON_VALUE)
    public String displayMessages(Model model, 
            @PathVariable String topicName) {       

            //HttpHeaders headers = new HttpHeaders();

            //headers.set("Authorization", request.getHeader("Authorization"));
            //header = request.getHeader("Authorization");
            //System.out.println(" T O K E N "+request.getHeader("X-Auth-Token"));

            projectServiceImpl.findByName(topicName);
            List<Message> messages = messageServiceImpl.findAllMessagesByProjectName(topicName);
            model.addAttribute("topic", topicName);
            model.addAttribute("message",messages);

            return "index";
    }
Run Code Online (Sandbox Code Playgroud)

我真的不知道我还应该改变什么才能让它发挥作用,但我相信其中肯定有问题。但我想如果我在尝试访问我的服务时可以有 Keycloak 身份验证屏幕,那就没问题了。

man*_*ays 7

我收到了同样的错误,需要仔细检查的一件事是auth-server-url服务器和获取令牌的客户端是否相同。

即如果一个是dns名称,一个是IP地址,则不会授权。(在我的例子中,我有 localhost 和 127.0.0.1,所以授权失败)

服务器,src/main/resources/application.yml

在此输入图像描述

邮递员/客户:

在此输入图像描述