2011-12-16 2 views
8

Я применил Spring Security в своем приложении. Я использовал реализацию по умолчанию, т. Е. Настроил ее с помощью моих собственных параметров (DataSource, Secured Areas и т. Д.), Но я не написал никакой пользовательской реализации.Получить дополнительную информацию от пользователя - Spring Security

Теперь я хочу получить больше данных от пользователя, то есть в той же таблице, что и имя пользователя и пароль, например название компании, идентификатор и т. Д. Однако я не хочу использовать эту информацию для входа.

Я не уверен, как это сделать. Из того, что я прочитал, это связано с UserDetailsService. Тем не менее, похоже, что создание пользовательского UserDetailsService было бы необходимо, если бы я хотел использовать эту информацию во время входа в систему, и это не то, что я хочу. Я просто хочу использовать эту информацию внутри приложения после входа пользователя.

Действительно ли это связано с UserDetailsServer? Это единственный файл, который я должен модифицировать?

Все примеры, которые я нашел на заказ UserDetailsService используется только имя пользователя и пароль, так что я не могу понять, где новые данные будут поступать в.

Спасибо!

ответ

14

Переопределение UserDetailsService что мы делали .. Вам нужно реализовать свой собственный UserDetailsService и собственные UserDetails объекта:

public class CustomService implements UserDetailsService { 
    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) { 

     Account account = accountDAO.findAccountByName(username); 

     if (account == null) { 
      throw new UsernameNotFoundException("account name not found"); 
     } 
     return buildUserFromAccount(account); 
    } 


    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true) 
    private User buildUserFromAccount(Account account) { 

     String username = account.getUsername(); 
     String password = account.getPassword(); 
     boolean enabled = account.getEnabled(); 
     boolean accountNonExpired = account.getAccountNonExpired(); 
     boolean credentialsNonExpired = account.getCredentialsNonExpired(); 
     boolean accountNonLocked = account.getAccountNonLocked(); 

     // additional information goes here 
     String companyName = companyDAO.getCompanyName(account); 


     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     for (Role role : account.getRoles()) { 
      authorities.add(new SimpleGrantedAuthority(role.getName())); 
     } 

     CustomUserDetails user = new CustomUserDetails (username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, 
       authorities, company); 

     return user; 
    } 


public class CustomUserDetails extends User{ 

    // ... 
    public CustomUserDetails(..., String company){ 
     super(...); 
     this.company = company; 
    } 

    private String company; 

    public String getCompany() { return company;} 

    public void setCompany(String company) { this.company = company;} 
} 
+0

'loadUserByUsername' возвращает UserDetails, но в коде, он возвращает' buildUserFromAccount' который возвращает пользователя. Итак, как CustomUserDetails участвует в коде? Класс DAO Account и все его методы должны быть реализованы мной, правильно? –

+0

Если бы у вас была небольшая опечатка и исправлена. Далее поясним: 'UserDetails' - это интерфейс,' User' - это реализация весенних ценных бумаг, включая все базовые поля. Если вы хотите добавить свои собственные поля, проще всего расширить «Пользователь». Вы все равно можете вернуть объект «Пользователь» в этом методе или объект «UserDetails» или объект «CustomUserDetails», поскольку весенняя безопасность просто ожидает объект, который реализует «UserDetails». – Pete

+0

А, Ок! Поэтому, используя это, я предоставляю все, чтобы Spring Security нуждалась в аутентификации. Однако объект User, который у него есть, имеет все мои пользовательские поля. Итак, как мне получить этот объект, так что я могу 'getCompany' например? –

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