Spring Boot + Keycloak:可选的授权端点



我正在尝试配置一个Spring Boot应用程序与Keycloak有一个端点是通过身份验证和未经身份验证的用户都可以访问。对于经过身份验证的用户,我希望返回一些额外的信息。下面是我想要实现的一个简单的例子:

@RestController
public class HelloController {
@GetMapping("/")
public String index(Principal principal) {
KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) principal;
if (keycloakPrincipal != null) {
return "Hello " + keycloakPrincipal.getKeycloakSecurityContext().getToken().getPreferredUsername();
} else {
return "Hello";
}
}
}

application.properties:

keycloak.securityConstraints[0].authRoles[0] = *
keycloak.securityConstraints[0].securityCollections[0].name = Hello
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /*
到目前为止,我只让它对两种情况中的一种起作用。如果我使用上面的安全约束来保护端点,则只有经过身份验证的用户才能访问该端点。如果我删除安全约束,端点对每个人都是可访问的,但主体将始终是null

是否有可能达到预期的行为?

您尝试过Principal principal = SecurityContextHolder.getContext().getAuthentication();之类的东西吗?

我相信Principal作为方法参数只在安全端点上填充,但我不确定它是否存在于SecurityContext中。如果没有,你需要添加一个过滤器来自己添加它。

我能够通过在HttpServletRequest对象上调用authenticate()方法来解决这个问题。这将触发身份验证过程,并尽可能填充用户主体。来自文档:

触发的身份验证过程与

请求是针对受安全约束保护的资源。

为了避免触发身份验证挑战,我将一个虚拟响应对象传递给authenticate()调用。

最新更新