spring-security 在Sping Boot 中无状态地使用Keycloak和JWT

dfuffjeb  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(206)

我需要使用Keycloak,并且更喜欢在我的Sping Boot 应用程序中使用无状态的JWT令牌。

  • 强制Sping Boot Security检查登录
  • 允许/logout URL(转到Keycloak)

我的代码“运行”了,但是当我点击初始页面时,我看到的日志消息似乎表明它没有检测到任何登录的迹象。当发生这种情况时,我希望强制Sping Boot 重定向到登录页面,就像这是一个有状态的应用程序一样。

org.springframework.web.servlet.FrameworkServlet: Failed to complete request: java.lang.NullPointerException: Cannot invoke "org.springframework.security.authentication.AbstractAuthenticationToken.getName()" because "authenticationToken" is null
org.springframework.security.web.context.HttpSessionSecurityContextRepository$SaveToSessionResponseWrapper: Did not store anonymous SecurityContext
org.springframework.security.web.context.SecurityContextPersistenceFilter: Cleared SecurityContextHolder to complete request
org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "org.springframework.security.authentication.AbstractAuthenticationToken.getName()" because "authenticationToken" is null] with root cause
java.lang.NullPointerException: Cannot invoke "org.springframework.security.authentication.AbstractAuthenticationToken.getName()" because "authenticationToken" is null

下面是我的HttpSecurity代码片段:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
        .csrf()
//      .disable().exceptionHandling().accessDeniedPage("/access-denied")
        .and()
        .authorizeRequests()
        .antMatchers("/sso/**").permitAll()
        .antMatchers("/error/**").permitAll()
        .antMatchers("/css/**","/contact-us","/actuator/**","/isalive/**").permitAll()
        .anyRequest().authenticated()
        .and()
        .oauth2Login()
        .defaultSuccessUrl("/myfirstpage",true)
        .and().exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
        .and()
        .oauth2ResourceServer().jwt();

    }

我知道我遗漏了一些东西,但我认为Keycloak提供了很多OOTB的东西。初始URL是/。我希望.authenticated()会强制它对所有不允许的模式进行身份验证,但我可能错了。我遗漏了什么?
请注意,互联网上充斥着Sping Boot + Keycloak的例子(有几个甚至很好)。它也有很多Spring Boot + OAuth + Stateless JWT的例子。它没有(我可以告诉)很多Spring Boot + Keycloak + Stateless JWT的例子。我从这个JHipster repo中找到了一点,但我觉得我错过了一些伟大的神奇步骤。

mfpqipee

mfpqipee1#

资源服务器应在身份验证缺失或无效(过期、颁发者错误等)时返回401(未授权),并且客户端应处理到授权服务器的重定向。

当您试图将不同的OAuth2参与者(客户端、资源服务器和授权服务器)合并到一个应用程序中时,事情会变得很混乱。
您确定要Spring客户端(而不是Angular / React / Vue / Flutter /任何客户端渲染框架)吗?
如果是的话,也许你应该从分离client(显示登录、注销和Thymeleaf或其他页面)和resource-server(REST API)应用程序开始。你会更好地理解你编写的spring-security conf(并且可以Assert它按预期单独工作)。

资源服务器配置(REST API)

请注意Keycloak adapters for spring are deprecated.
最简单的解决方案是spring-addons-webmvc-jwt-resource-server(支持多租户、默认无状态、通过属性进行CORS配置、轻松将Keycloak角色Map到Spring权限等)。
您也可以直接使用spring-boot-starter-oauth2-resource-server,但它需要more java conf

客户端配置(包括登录和注销的页面)

  • 如果保留Spring,请参阅Spring引导文档:它是清晰的,总是最新的(与大多数教程相反)
  • 如果使用的是“现代”客户端框架,请从certified list中找到一个库

我有一个完整的示例(带有springRESTfulAPI的Ionic-AngularUI)there,但是作为入门级可能有点复杂。

mo49yndu

mo49yndu2#

您将需要spring-security和keycloak-adapters这个guid有完整的解释如何设置和保护它
https://keepgrowing.in/java/springboot/keycloak-with-spring-boot-1-configure-spring-security-with-keycloak/

相关问题