我正在尝试使用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是正确的方法吗?如果是的话,那么如何使我的过滤器在过滤器链中最后运行?
2条答案
按热度按时间hof1towb1#
Key斗篷是一个基于标准的解决方案,具有一些良好的令牌发布功能。然后,您可以在api中使用您喜欢的任何库。KeyClope适配器可能不是最佳选择。
你可能想要的主要东西是:
以标准方式验证jwts
控制授权和索赔
记录良好的解决方案
不久前,我编写了一些代码,展示了如何在需要的情况下更紧密地控制spring boot oauth处理,以防它为您自己的解决方案提供一些想法:
过滤器配置
海关授权人
我的代码使用nimbus sdk作为oauth库的一个示例,其中包含大量文档。
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:
我还将以下内容添加到我的主机文件(例如。
/etc/hosts
)对于测试:在使用
admin:admin
,我建立了一个叫做myrealm
一个客户打电话来test-client
具有有效的重定向urihttp://localhost:8080/*
,增加了resource:read
,生成了客户端密码,并最终创建了具有凭据的用户。tldr:github示例
要开始,请确保类路径上存在以下依赖项:
有两种方法可以将应用程序配置为使用KeyClope作为授权服务器(提供程序):
最简单的方法是设置
issuer-uri
属性,但这需要在应用程序启动时运行KeyClope服务器。在上面的示例中,显式配置未注解。以下是一个示例控制器,以证明其工作正常:
这通常足以通过keydove进行身份验证。如果希望对Spring Security 进行更细粒度的控制,请使用以下配置开始:
总结
本例使用SpringSecurity5ofthebox支持OAuth2.0和OpenIDConnect 1.0以及KeyClope。
请注意,您不需要自定义筛选器来从Key斗篷获取权限,我们只是请求
resource:read
范围是可用的,spring security与Key斗篷合作,以确保我们拥有此权限。我们也不使用jwts进行身份验证,而是使用标准会话管理,这是推荐的。