Получите больше информации от пользователя - Spring Security - PullRequest
8 голосов
/ 16 декабря 2011

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

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

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

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

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

Спасибо!

1 Ответ

14 голосов
/ 16 декабря 2011

Переопределение 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;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...