使用keycloak的带oauth2的Sping Boot

bxpogfeg  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(162)

我使用spring Boot 作为后端,除了thymeleaf作为模板引擎。Atm,我试图在我的项目中实现oauth2(带keycloak)。
我创建了一个新的领域,添加了一个redirect-uri(“http://172.31.52.123:8000/*“)+创建了用户,并将id、secret等放在我的application.properties文件中。
当我调用http://172.31.52.123:8000/时,我从下面的ViewController得到“hi”消息。当我调用http://172.31.52.123:8000/greeting时,我将被重定向到http://172.31.52.123:8080/oauth2/authorization/appliance,然后到keycloak登录。从那里,我得到这些参数:

response_type: code
client_id: myClientId
state: hpcfsknjW6QCfMSQWS-k...
redirect_uri: http://172.31.52.123:8080/*

然后是keycloak的这些:

state: hpcfsknjW6QCfMSQWS-k...
session_state: f6ca95e5-a117-...
code: 298f32f-f283f ...

登录后,我得到的结果是:

172.31.52.123,您经常会收到该邮件。-〉错误_重定向太多

控制台里什么都没有,我做错了什么?本来应该重定向到http://172.31.52.123:8000/*的。

应用程序.属性

appliance-base-url: https://authServerBlaBla/auth/realms/myRealmName

spring:
  security:
    oauth2:
      client:
        registration:
          appliance:
            authorizationGrantType: authorization_code
            redirectUri: http://172.31.52.123:8080/*
            clientId: myClientId
            clientSecret: myClientSecret
        provider:
          appliance:
            authorization-uri: ${appliance-base-url}/protocol/openid-connect/auth
            token-uri: ${appliance-base-url}/protocol/openid-connect/token
            user-info-uri: ${appliance-base-url}/protocol/openid-connect/userinfo

安全配置

@EnableWebSecurity
public class SecurityConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests(authorizeRequests -> authorizeRequests
                    .mvcMatchers("/").permitAll()
                    .anyRequest().authenticated()
            )
            .oauth2Login(withDefaults());

        return http.build();
    }
}

视图控制器

@Controller
public class ViewController {

    @GetMapping(value = {"/"})
    @ResponseBody
    public String index() {
        return "hi";
    }

    @GetMapping("/greeting")
    @ResponseBody
    public String greet() {
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
        return "Welcome, " + username;
    }
}
0kjbasz6

0kjbasz61#

您返回@ResponseBody =〉您的应用应配置为resource-server(而不是client)。
如果您的应用还提供UI元素(使用Thymeleaf、JSF或任何服务器端呈现框架),则必须提供两个不同的过滤器链,使用securityMatcher模式指定在何处应用resource-server安全性以及在何处应用client安全性。
我已经在这个答案中详细说明:将KeycloakSpring适配器与Sping Boot 3配合使用

相关问题