使用keydove仅用于身份验证,并使用自定义筛选器进行授权(spring boot)

ggazkfy8  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(322)

我正在尝试使用keydepeat进行身份验证,并使用自己的自定义过滤器进行授权。所以,理想的流程是:第一个keydape过滤器对请求进行身份验证,并在上下文中设置身份验证对象。然后,我的自定义过滤器应该运行,它应该获得现有的身份验证对象,在该身份验证对象中添加权限,并在上下文中设置回它。
我的securityconfig正在像这样扩展KeyDopperWebSecurity配置适配器

@Configuration
@EnableWebSecurity
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
   {
      super.configure(http);
        http
        .cors()
        .and()
        .csrf().ignoringAntMatchers("/","/auth","/auth/logout").csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
        .authorizeRequests()
        .antMatchers(
                "/",
                "/auth",
                "/password/**",
              "/register/**",
              "/v2/api-docs",
              "/actuator/**",
              "/configuration/ui",
              "/swagger-resources",
              "/configuration/security",
              "/swagger-ui.html",
              "/webjars/**",
              "/swagger-resources/configuration/ui",
              "/swagger-resources/configuration/security",
              "/browser/index.html#",
              "/browser/**").permitAll()
        .antMatchers(HttpMethod.POST, REGISTER).permitAll()
        .antMatchers(HttpMethod.POST, CONFIRM).permitAll()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JWTAuthorizationFilter(authenticationManager(),context))
//      .addFilterAfter(new JWTAuthorizationFilter(authenticationManager(),context), KeycloakAuthenticationProcessingFilter.class)
        .headers()
        .contentSecurityPolicy("script-src 'self'");
}

它首先运行keydepeauthenticationprocessingfilter,然后运行我的自定义筛选器(jwtauthorizationfilter),但随后再次调用keydepeauthenticationprocessingfilter,由于再次设置了身份验证对象并清除了权限(我试过两种方法。当前代码加上注解行和更多)
所以首先,在speing引导应用程序中使用KeyClope是正确的方法吗?如果是的话,那么如何使我的过滤器在过滤器链中最后运行?

hof1towb

hof1towb1#

Key斗篷是一个基于标准的解决方案,具有一些良好的令牌发布功能。然后,您可以在api中使用您喜欢的任何库。KeyClope适配器可能不是最佳选择。
你可能想要的主要东西是:
以标准方式验证jwts
控制授权和索赔
记录良好的解决方案
不久前,我编写了一些代码,展示了如何在需要的情况下更紧密地控制spring boot oauth处理,以防它为您自己的解决方案提供一些想法:
过滤器配置
海关授权人
我的代码使用nimbus sdk作为oauth库的一个示例,其中包含大量文档。

ukqbszuj

ukqbszuj2#

您似乎将两种模式混合在一起,1)使用keydove作为授权服务器,2)尝试将jwts用于一种或两种身份验证(诱惑| orization)。
查看spring security的josh cummings最近制作的关于何时使用jwts以及如何使用spring security 5的视频。此外,请查看jwt示例,它完全取代了您的 JWTAuthenticationFilter 不使用 keycloak-spring-security-adapter . 您还可以查看oauth2登录示例,获取关于使用SpringSecurity开始社交登录的指南。
至于具体使用Key斗篷,我建议使用SpringSecurity5的内置功能,它与Key斗篷的授权服务器完全集成,应该同时实现这两个目标。

如何

我正在使用docker通过以下命令运行KeyClope:

docker run --name keycloak -p 9000:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e DB_VENDOR=h2 -d jboss/keycloak

我还将以下内容添加到我的主机文件(例如。 /etc/hosts )对于测试:

127.0.0.1       auth-server

在使用 admin:admin ,我建立了一个叫做 myrealm 一个客户打电话来 test-client 具有有效的重定向uri http://localhost:8080/* ,增加了 resource:read ,生成了客户端密码,并最终创建了具有凭据的用户。
tldr:github示例
要开始,请确保类路径上存在以下依赖项:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

有两种方法可以将应用程序配置为使用KeyClope作为授权服务器(提供程序):

server:
  port: 8080

keycloak-server:
  uri: http://auth-server:9000/auth/realms/myrealm
  openid-uri: ${keycloak-server.uri}/protocol/openid-connect

spring:
  security:
    oauth2:
      client:
        registration:
          test-client:
            provider: keycloak
            client-id: test-client
            client-secret: ${TEST_CLIENT_SECRET:your-client-secret}
            client-authentication-method: client_secret_basic
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope: resource:read
        provider:
          keycloak:
            # Configure the provider with keycloak
            authorization-uri: ${keycloak-server.openid-uri}/auth
            token-uri: ${keycloak-server.openid-uri}/token
            user-info-uri: ${keycloak-server.openid-uri}/userinfo
            user-info-authentication-method: client_secret_basic
            jwk-set-uri: ${keycloak-server.openid-uri}/certs
            # Alternatively, set issuer-uri (replaces above settings) to use ${keycloak-server.uri}/.well-known/openid-configuration
            # to auto-configure OpenID Connect on startup.
            # issuer-uri: ${keycloak-server.uri}
            # This is required in either case to inform Spring Security about keycloak's username
            user-name-attribute: preferred_username

logging:
  level:
    org.springframework.security: trace

最简单的方法是设置 issuer-uri 属性,但这需要在应用程序启动时运行KeyClope服务器。在上面的示例中,显式配置未注解。
以下是一个示例控制器,以证明其工作正常:

@RestController
public class ExampleController {
    @GetMapping("/")
    public Map<String, String> home(@AuthenticationPrincipal DefaultOAuth2User user) {
        return Map.of("message", "You are logged in, " + user.getName() + "!");
    }

    @GetMapping("/token")
    public OAuth2AccessToken token(@RegisteredOAuth2AuthorizedClient("test-client") OAuth2AuthorizedClient testClient) {
        return testClient.getAccessToken();
    }
}

这通常足以通过keydove进行身份验证。如果希望对Spring Security 进行更细粒度的控制,请使用以下配置开始:

@EnableWebSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .authorizeRequests(authorizeRequests -> authorizeRequests
                .antMatchers("/token").hasAuthority("SCOPE_resource:read")
                .anyRequest().authenticated()
            )
            .oauth2Client(withDefaults())
            .oauth2Login(withDefaults());
        // @formatter:on

        return http.build();
    }

}

总结

本例使用SpringSecurity5ofthebox支持OAuth2.0和OpenIDConnect 1.0以及KeyClope。
请注意,您不需要自定义筛选器来从Key斗篷获取权限,我们只是请求 resource:read 范围是可用的,spring security与Key斗篷合作,以确保我们拥有此权限。我们也不使用jwts进行身份验证,而是使用标准会话管理,这是推荐的。

相关问题