Java Togglz返回403 on功能切换
我已经在我的spring boot应用程序中实现了togglz。我甚至可以访问Togglz控制台,我已经用FeatureManager测试了这些限制。但是,如果我转到togglz控制台并尝试更改激活策略或启用/禁用某个功能,我会得到一个403禁止错误页面 换句话说,我可以访问/togglz/index,但不能访问/call/togglz/edit 在我的WebMVCConfiguer类中:Java Togglz返回403 on功能切换,java,spring-boot,togglz,Java,Spring Boot,Togglz,我已经在我的spring boot应用程序中实现了togglz。我甚至可以访问Togglz控制台,我已经用FeatureManager测试了这些限制。但是,如果我转到togglz控制台并尝试更改激活策略或启用/禁用某个功能,我会得到一个403禁止错误页面 换句话说,我可以访问/togglz/index,但不能访问/call/togglz/edit 在我的WebMVCConfiguer类中: @Bean public FilterRegistrationBean<TogglzFilter&g
@Bean
public FilterRegistrationBean<TogglzFilter> togglzRegistration() {
FilterRegistrationBean<TogglzFilter> reg = new FilterRegistrationBean<>();
reg.setFilter(new TogglzFilter());
reg.addUrlPatterns("/*");
reg.setName("TogglzFilter");
return reg;
}
@Bean
public ServletRegistrationBean<TogglzConsoleServlet> togglzConsoleServlet() {
ServletRegistrationBean<TogglzConsoleServlet> reg = new ServletRegistrationBean<>();
reg.setServlet(new TogglzConsoleServlet());
reg.setName("TogglzConsoleServlet");
reg.addUrlMappings("/togglz/*");
return reg;
}
您在
application.yml
中对togglz有哪些配置?最有可能的情况是您缺少secure:false
此处:
togglz:
enabled: true
console:
enabled: true
secured: false
看起来您在应用程序中使用了某种CSRF保护。至少这可以解释为什么只有POST请求被破坏 TOGLZ控制台提供了一个SPI,用于获取需要嵌入表单中的CSRF令牌: Togglz附带对弹簧安全CSRF保护的支持: Togglz使用JDK的ServiceLoader工具查找提供者。因此,对于Spring安全性,只有一个引用实现类的文件: 因此,如果您想将某些第三方CSRF保护框架与Togglz集成,您必须:
- 实施
CSRFTokenProvider
- 向类路径添加一个文件
,并向其中添加实现类的完全限定类名META-INF/services/org.togglz.servlet.spi.CSRFTokenProvider
- 这里也一样。因为我是Java和Spring的新手,所以在尝试从@chkal解决方案实现CSRFTokenProvider时,我遇到了麻烦
所以我点击了togglzapi来启用/禁用一个特性。两者都返回200 OK和HTML内容(类似于togglz控制台的索引页面)
使能
curl --location --request POST '{host}/{context_path}/togglz-console/edit?f=FEATURE_ONE&enabled=enabled'
禁用
curl --location --request POST '{host}/{context_path}/togglz-console/edit?f=FEATURE_ONE'
application.yml
...
togglz:
console:
enabled: true
path: /togglz-console
secured: false
use-management-port: false
features:
FEATURE_ONE:
enabled: true
格雷德尔先生
...
implementation "org.togglz:togglz-spring-boot-starter:2.6.1.Final"
implementation "org.togglz:togglz-console:2.6.1.Final"
implementation "org.togglz:togglz-spring-security:2.6.1.Final"
注意:这不是回答上述问题,但可以作为替代方案
更新:我经历过这种情况,因为我的InputStream已被(过滤器bean)读取,并且只读取一次我已通过属性文件禁用了togglz中的csrf保护:
togglz.console.validate-c-s-r-f-token=false
如果使用yaml而不是属性文件,则该文件应如下所示:
...
togglz:
console:
validate-c-s-r-f-token: false
您应该注意,不建议禁用csrf令牌验证,因为它会降低应用程序的安全性。不,它不会改变任何东西。我应该注意,导致403的url不是/togglz/index,而是/togglz/edit您没有使用togglz-spring-boot-starter,这就是为什么配置不起作用。我强烈建议您使用togglz spring boot starter:您是对的,我不是。但这是因为togglz spring boot starter依赖于spring security类,而我的服务不使用spring security,而是使用OAuth2在所有服务上进行单点登录。SpringSecurityUserProvider类是一个togglz类,如果可能的话,我将研究实现它,该模块是@ConditionalOnMissingClass org.springframework.security.config.annotation.web.configuration.EnableWebSecurity,我拥有该模块。Togglz控制台支持Spring security和friends提供的CSRF令牌。我可以想象这会给你带来一些问题。看:所以我想如果你有一些CSRF保护,而不是与Togglz集成,这可能会发生……我们确实有!这将解释为什么控制台是可访问的,但编辑请求(如果是REST或其他)不会触发。您是否有使用togglz实现的示例或文档?谢谢你的回复,这意味着非常抱歉耽搁了。请看下面我的答案。我让spring security打开了csrf,并且遇到了同样的问题。我只需要添加依赖项
org.togglz:togglz-spring-security
,这很有帮助。
togglz.console.validate-c-s-r-f-token=false
...
togglz:
console:
validate-c-s-r-f-token: false