Grails spring security userDetailService служба импорта - PullRequest
0 голосов
/ 20 сентября 2018

Привет, есть ли способ импортировать сервис на customUserDetailService?У меня была ошибка

org.springframework.security.authentication.InternalAuthenticationServiceException: Невозможно вызвать метод validatePin () для нулевого объекта

class CustomUserDetailsService implements GrailsUserDetailsService {

def apiService

/**
 * Some Spring Security classes (e.g. RoleHierarchyVoter) expect at least
 * one role, so we give a user with no granted roles this one which gets
 * past that restriction but doesn't grant anything.
 */
static final List NO_ROLES = [new SimpleGrantedAuthority(SpringSecurityUtils.NO_ROLE)]

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

@Transactional(readOnly=true, noRollbackFor=[IllegalArgumentException, UsernameNotFoundException])
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()
    def request = webUtils.getCurrentRequest()
    def countryCode = request.getParameter('country_code')
    def pin = request.getParameter('password')

    def apiUser = apiService.validatePin(countryCode, username, pin)
    println("\n\napiUser: ${apiUser}")

    User user = User.findByUsername(username)
    if (!user) throw new NoStackUsernameNotFoundException()

    def roles = user.authorities


    // or if you are using role groups:
    // def roles = user.authorities.collect { it.authorities }.flatten().unique()

    def authorities = roles.collect {
        new SimpleGrantedAuthority(it.authority)
    }

    return new CustomUserDetails(user.username, user.password, user.enabled,
            !user.accountExpired, !user.passwordExpired,
            !user.accountLocked, authorities ?: NO_ROLES, user.id,
            user.firstName + " " + user.lastName)
}
}

1 Ответ

0 голосов
/ 21 сентября 2018

Предположительно, вы регистрируете свой пользовательский детальный сервис в resources.groovy.В своем определении бина включите автопроводку и добавьте ссылку на службу, которую вы пытаетесь внедрить.

userDetailsService(CustomUserDetailsService) {
    it.autowire = true
    apiService = ref('apiService')
}
...