Q:

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

Всем привет! Как можно получить авторизованного пользователя, т.е после авторизации извлечь обьект данного юзера из БД к примеру для того чтобы заполнить поля на его странице профиля, DAO у меня реализован с помощью hibernate и сама авторизация выполняется из БД. Заранее спасибо!

A:

Для этого сначала нужно получить имя юзера из spring-security
public String getCurrentUsername() {
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      return auth.getName();
  }

и передать его в hibernate
public User getUserByUsername(String username) {
    CriteriaQuery<User> criteriaQuery = em.getCriteriaBuilder().createQuery(User.class);
    Root<User> userRequest = criteriaQuery.from(User.class);

    Expression<String> exp = userRequest.get("username");
    Predicate predicate = exp.in(username);

    criteriaQuery.where(predicate);
    try {
        return em.createQuery(criteriaQuery).getSingleResult();
    } catch (NoResultException e) {
        return new User();
    }
}

A:

Начиная с Spring-Security 3.2 удобнее воспользоваться аннотацией @AuthenticationPrincipal на аргументе метода вашего контроллера.
ModelAndView someRequestHandler(@AuthenticationPrincipal User user) {
    // ...
}

User - это именно спринговый юзер, а не тот объект, который вы кладете в БД.
Чтобы это работало, нужно зарегистрировать бин AuthenticationPrincipalArgumentResolver:

при использовании Java-конфигурации - повесть аннотацию @EnableWebMvcSecurity на ваш @Configuration-бин;
при использовании xml-конфигурации - зарегистрировать его в <mvc:argument-resolvers>:    
<mvc:annotation-driven>
     <mvc:argument-resolvers>
          <bean class="AuthenticationPrincipalArgumentResolver"/>         
     </mvc:argument-resolvers>
</mvc:annotation-driven>

