Приложение My Grails использует плагин Spring Security. Мне нужно войти в систему пользователя программно, и у меня нет доступа к его паролю. Я попробовал следующее, которое предположительно работало при использовании плагина Acegi (предка плагина Spring Security):
// automatically login a user and assign them the USER role.
// In my app, the email address is also the username
GrantedAuthority[] auths = [new GrantedAuthorityImpl('USER')]
SecurityContextHolder.context.authentication
= new UsernamePasswordAuthenticationToken(email, 'unknown', auths)
Кажется, что это почти сработало, потому что если я позвоню springSecurityService.principal
после выполнения вышеизложенного, я получу обратно адрес электронной почты автоматически вошедшего в систему пользователя. Однако, если я звоню springSecurityService.currentUser
, я получаю сообщение об ошибке. Основная причина этой ошибки:
SpringSecurityUtils.securityConfig.userLookup.userDomainClassName
возвращает "Person", который не является именем моего пользовательского класса. Различные теги, такие как <sec:loggedInUser>
, также не работают, предположительно по той же причине.
Интересно, связана ли эта проблема с тем, что я использую существующие классы доменов для пользователя и роли (а не классы, созданные плагином)? Если пользователь входит в систему, вводя свое имя пользователя и пароль в форму (а не программно), кажется, что все работает нормально.
Обновление
Следуя Совету Берта , я заменил код выше:
springSecurityService.reauthenticate(email)
Но я все еще получаю сообщение об ошибке в этих строках в SpringSecurityService.getCurrentUser()
String className = SpringSecurityUtils.securityConfig.userLookup.userDomainClassName
grailsApplication.getClassForName(className).get(principal.id)
Потому что className
имеет значение «Персона», а не имя моего класса пользователя.