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