2015-05-10 4 views
3

У меня есть таблица в моей базе данных, которая содержит информацию о пользователе.Spring Security - получить текущие поля пользователя из базы данных

CREATE TABLE users 
(
    id_user serial NOT NULL, 
    phone text, 
    password text, 
    balance numeric, 
    email text, 
    CONSTRAINT users_pkey PRIMARY KEY (id_user), 
    CONSTRAINT users_login_key UNIQUE (phone) 
) 

Я использую Spring Security. Часть конфигурации:

<security:jdbc-user-service id="userService" 
     data-source-ref="dataSource" 
     users-by-username-query="select phone, password, true from users where phone=?" 
     authorities-by-username-query="select phone,'ROLE_USER' from users where phone=?" /> 

Как получить, например, текущий баланс пользователя в контроллере Spring MVC?

+0

Вы можете реализовать пользовательский 'UserDetailsService', где вы можете получить данные пользователя и сопоставить их с каким-то объектом модели, реализующим' UserDetails', который также будет содержать дополнительные поля, такие как баланс и т. Д. Затем вы можете получить объект пользователя в контроллере из 'SecurityContextHolder' и получить доступ к его свойствам. –

+0

Спасибо, я попробую! Не могли бы вы написать примерный код? –

ответ

3

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 для более подробной информации.

+0

Спасибо, это помогло! –

+0

@Bohuslav как пользователю Пользователь user = (Пользователь) SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal(); BigDecimal balance = user.getBalance(); в jsp-файлах любые sugessions –

+1

@BOSS Проверьте этот ответ: http://stackoverflow.com/a/26208602/1291150 –

Смежные вопросы