JDBC service, который вы определили в конфигурации Spring Security, будет извлекать только имя пользователя, пароль и статус с помощью запроса users-by-username-query
и имени пользователя с использованием запроса authorities-by-username-query
. Это означает, что любые дополнительные атрибуты не будут сопоставлены главному объекту пользователя, который будет создан для заполнения контекста безопасности.
Один из способов получить всю информацию вашего пользователя - создать пользовательскую реализацию UserDetailsService
, которая сможет извлекать пользовательские данные, включая все свои пользовательские атрибуты. Вот пример такого подхода (предполагается, что вы используете JPA/Hibernate для слоя данных):
Entity
@Entity
@Table(name="users")
public class User implements UserDetails {
private BigDecimal balance;
// Other properties omitted ...
// Getters and setters omitted ...
// Implementation of UserDetails methods omitted ...
}
UserService
служба, ответственная за загрузку информации о пользователе. Обратите внимание, что в реальном мире вы, вероятно, должны иметь отдельных пользователей запросов DAO, программу против интерфейсов и т. Д. Этот пример намеренно хранится как можно короче.
@Service
public class UserService implements UserDetailsService {
@Autowired
private SessionFactory sessionFactory;
@Override
public User loadUserByUsername(String username) throws UsernameNotFoundException {
Query query = sessionFactory.getCurrentSession().createQuery("FROM User u WHERE u.username = :username");
query.setParameter("username", username);
User user = (User) query.uniqueResult();
if (user == null) {
throw new UsernameNotFoundException("User with username '" + username + "' does not exist.");
}
return user;
}
}
Конфигурация
Создать AuthenticationProvider
фасоль и поставить свой собственный сервис пользователя, как его собственность.
<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userService" />
<!-- Other required properties ... -->
</bean>
Контроллер
Вы можете получить доступ к текущему пользователю и его свойства в контроллере с помощью:
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BigDecimal balance = user.getBalance();
В качестве последнего замечания, пожалуйста, обратите внимание, что это не 100% рабочей копии и пасты решение вашей проблемы, а скорее демонстрация подхода, который вы можете предпринять для достижения желаемого результата. Я рекомендую ознакомиться с документацией основных классов/интерфейсов, таких как AuthenticationProvider
, UserDetailsService
, UserDetails
и руководствами по безопасности Spring для более подробной информации.
Вы можете реализовать пользовательский 'UserDetailsService', где вы можете получить данные пользователя и сопоставить их с каким-то объектом модели, реализующим' UserDetails', который также будет содержать дополнительные поля, такие как баланс и т. Д. Затем вы можете получить объект пользователя в контроллере из 'SecurityContextHolder' и получить доступ к его свойствам. –
Спасибо, я попробую! Не могли бы вы написать примерный код? –