Приложение 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
возвращает «Человек», который не является именем моего класса пользователя. Различные теги, такие как
, также не работают, предположительно по той же причине.
Интересно, связана ли эта проблема как-то с тем, что я использую существующие классы домена для пользователя и роли (а не классы, созданные плагином)? Если пользователь входит в систему, вводя свое имя пользователя и пароль в форму (а не программно), все вроде работает нормально.
Следуя совету Берта , я заменил приведенный выше код на:
springSecurityService.reauthenticate(email)
Но я все еще получаю сообщение об ошибке в этих строках в SpringSecurityService.getCurrentUser ()
String className = SpringSecurityUtils.securityConfig.userLookup.userDomainClassName
grailsApplication.getClassForName(className).get(principal.id)
Потому что для className
установлено значение «Person», а не имя моего класса User.