Grails、Spring Security 和 Keycloak:表单以 ISO-8859-1 而不是 UTF-8 提交

Posted

技术标签:

【中文标题】Grails、Spring Security 和 Keycloak:表单以 ISO-8859-1 而不是 UTF-8 提交【英文标题】:Grails, Spring Security & Keycloak: Forms are submitted as ISO-8859-1 instead of UTF-8 【发布时间】:2021-09-30 08:51:26 【问题描述】:

我在 Grails 4.0.9 中使用 Keycloak 和 Spring Security。具有以下依赖项

compile group: 'org.keycloak', name: 'keycloak-spring-security-adapter', version: '12.0.2'
compile "org.springframework.security:spring-security-config:4.2.13.RELEASE"
compile "org.springframework.security:spring-security-web:4.2.13.RELEASE"  

我提交的任何带有特殊字符的表格,即。 ä,当我在 html 页面上打印出来时,将导致 'ö'。帖子参数看起来正确。我还检查了 application.yml (view/gsp/encoding = utf-8) 中的 Grails 设置。

我的 securityConfig 如下所示:

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        super.configure(http)
        http
            .authorizeRequests()
            .anyRequest().permitAll()
        http.csrf().disable() // disable CSRF since g:forms wouldnt work
    

如果我删除依赖项,表单提交将按预期工作。因此,我认为 spring-security 存在问题。

PS:我检查了https://github.com/spring-projects/spring-boot/issues/3912 - 但问题似乎已解决。

【问题讨论】:

你能否让你的样本尽可能少,以确认它是 Spring Security?另外,您是否能够使用受支持的 Spring Security 版本(在本文发布时为 5.2+)并查看它是否仍在发生? 我完全删除了 Keycloak 库并原生实现了 Spring Security "5.3.10.RELEASE"。我提交的每个带有“ö”的表格都会产生“ö”。 即使我建立一个war文件并在本地运行它,问题仍然存在。 【参考方案1】:

我从https://***.com/a/23051264/2027053 找到了解决方案,它有效。因此,我在 configure 方法中添加了 CharacterEncodingFilter:

import org.springframework.web.filter.CharacterEncodingFilter
import org.springframework.security.web.csrf.CsrfFilter

@Override
protected void configure(HttpSecurity http) throws Exception 
    super.configure(http)

    CharacterEncodingFilter filter = new CharacterEncodingFilter()
    filter.setEncoding("UTF-8")
    filter.setForceEncoding(true)
    http.addFilterBefore(filter,CsrfFilter.class)

【讨论】:

以上是关于Grails、Spring Security 和 Keycloak:表单以 ISO-8859-1 而不是 UTF-8 提交的主要内容,如果未能解决你的问题,请参考以下文章

Grails + spring-security-core:用户登录后如何分配角色?

Grails 3 和 Spring Security:当用户未登录时返回 401

Grails - Spring Security / Social - Facebook 插件 setAccessToken 和 getAccessToken

ClassNotFoundException: SimpleGrantedAuthority - Grails 2.4.2 和 Spring Security

Spring Security UI 和 grails 2.0

Grails 3 Spring Security 覆盖登录表单