gpt4 book ai didi

Grails 安全 : how to preprocess username (to make it case-insensitive)?

转载 作者:行者123 更新时间:2023-12-04 19:08:09 29 4
gpt4 key购买 nike

Spring Security 的默认实现将用户名视为区分大小写,出于可用性原因,我需要使其不区分大小写(一个主要原因是使用移动设备的用户的默认行为是将输入文本的第一个字母大写)。这是业务需求。

当控制传递给插件生成的 LoginController 时,已经太晚了:Spring Security 已经确定登录失败。使用调试器,我可以看到流通过 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication但我不知道如何从 Grails 进行干预。事实上,该插件使用了一个子类,org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter ,但那是在插件源里面,不是我的应用程序,所以我不知道在哪里干预。

任何指针表示赞赏。
谢谢你。

环境:Grails 2.3,Spring Security 插件 1.2.7.3

最佳答案

您可以使用自定义 UserDetailsService 来做到这一点。 - 见 https://grails-plugins.github.io/grails-spring-security-core/v3/index.html#userDetailsService

package com.yourcompany.yourapp

import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserDetailsService
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
import org.springframework.security.core.authority.GrantedAuthorityImpl
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UsernameNotFoundException

class MyUserDetailsService implements GrailsUserDetailsService {

static final List NO_ROLES = [new GrantedAuthorityImpl(SpringSecurityUtils.NO_ROLE)]

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User.withTransaction { status ->
User user = User.findByUsernameIlike(username)
if (!user) throw new UsernameNotFoundException('User not found', username)

def authorities = user.authorities.collect { new GrantedAuthorityImpl(it.authority) }

new GrailsUser(user.username, user.password, user.enabled, !user.accountExpired, !user.passwordExpired,
!user.accountLocked, authorities ?: NO_ROLES, user.id)
}
}

UserDetails loadUserByUsername(String username, boolean loadRoles) throws UsernameNotFoundException {
loadUserByUsername username
}
}

在 grails-app/conf/spring/resources.groovy 中注册它以覆盖插件的实现:
beans = {
userDetailsService(com.yourcompany.yourapp.MyUserDetailsService)
}

关于Grails 安全 : how to preprocess username (to make it case-insensitive)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19416238/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com