@MoonMay

Как получить залогиненого пользователя в Spring Security?

При попытке получить залогиненого пользователя получаю ексепшн: : Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to com.security.service.UserDetailsServiceImpl. Как это пофиксить?

Пример попытки:
UserDetailsServiceImpl userDetailsService = (UserDetailsServiceImpl)org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Ссылка на гит: https://github.com/YuriyKlepka/website
  • Вопрос задан
  • 2864 просмотра
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
К примеру, как то так (кусок кода из контроллера):
// check if user is login
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if ((!(auth instanceof AnonymousAuthenticationToken)) && auth != null) {
	UserDetails userDetail = (UserDetails) auth.getPrincipal();

	if (userDetail != null) {
		model.addObject("username", userDetail.getUsername());
	} else {
		model.addObject("username", "");
	}
}
,

В конфиге безопасности есть такое:
<authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="usersManager">
            <password-encoder hash="bcrypt"/>
        </authentication-provider>
    </authentication-manager>


В конфиге контекста приложения объявлен usersManager:
<bean id="usersManager" class="org.whatever.impl.UsersServiceImpl">
        <property name="usersDAO" ref="usersDAO"/>
        <property name="languageDao" ref="languagesDAO"/>
        <property name="roleDAO" ref="roleDAO"/>
        <property name="usersViewDAO" ref="usersViewDAO"/>
</bean>

Ну и сам UsersServiceImpl имеет такой вид:
package org.whatever.impl;
/*импорты убрал */
/* интерфейс UsersService наследует org.springframework.security.core.userdetails.UserDetailsService */
public class UsersServiceImpl extends ServiceBase implements UsersService {

    @Autowired
    private UsersDAO usersDAO;

    public void setUsersViewDAO(UsersViewDAO usersViewDAO) {
        this.usersViewDAO = usersViewDAO;
    }

    public UsersDAO getUsersDAO() {
        return usersDAO;
    }

	/*сократил код*/

    /**
     * Детали по пользователю, полученному из базы
     */
    @Override
    @Transactional(readOnly = true)
    public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {
        User userFromDb = this.getUsersDAO().getUserByLogin(login);

        if (userFromDb != null) {
            return new org.whatever.UserView(userFromDb); /*применяет org.springframework.security.core.userdetails.UserDetails*/
        }

        String result = new Formatter().format("User with login %s not found", login).toString();
        throw new UsernameNotFoundException(result);
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@aol-nnov
> userdetails.User cannot be cast to com.security.service.UserDetailsServiceImpl
как пофиксить? не кастовать в несовместимые типы.

а пользователя получить (кстати, где?)

вот, в контроллере, например, можно так:
@RequestMapping(...)
public String someController(Model m, @Value("#{T(org.springframework.security.core.context.SecurityContextHolder).context.authentication}") Authentication auth) {
}


но у тебя же в коде есть
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
что, в принципе, одно и то же...

в чем тогда вопрос-то?!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы