5

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 Plugin 1.2.7.3

4

1 回答 1

5

您可以使用自定义来执行此操作UserDetailsService- 请参阅https://grails-plugins.github.io/grails-spring-security-core/v3/index.html#userDetailsS​​ervice

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)
}
于 2013-10-17T00:50:13.673 回答