Подтвердить что ты не робот

Spring Безопасность пользовательских UserDetailsService и пользовательский класс пользователя

Я пытаюсь сохранить дополнительные данные в главном объекте пользователя.

Что я сделал:

реализовать интерфейс UserDetails для моего существующего класса пользователя, где сохраняются мои дополнительные данные (например, адрес электронной почты и т.д.).

@Entity
public class User implements UserDetails {

Затем я создал реализацию UserDetailsService:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    UserDAO userDAO;

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        User user = userDAO.findOneByUsername(username);
        if (user == null)
            throw new UsernameNotFoundException("username " + username
                    + " not found");

        System.out.println("---------------------> FOUND ------------->"
                + user.getEmail());

        return user;
    }

}

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

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
UserDetailsService userDetailsService;



@Override
protected void configure(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.userDetailsService(userDetailsService());
// ...

}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.userDetailsService(userDetailsService());
// ...
}

@Override
protected UserDetailsService userDetailsService() {
    return userDetailsService;
}

В моей консоли видно, что "loadUserByName" вызывается дважды (из-за вывода "Found" ).

Когда я пытаюсь получить доступ к основному объекту в моем контроллере →

System.out.println(SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal());

Я не получаю дополнительные данные. Когда я пытаюсь передать его в свой объект User, я получаю, что он не может отличать исключение.

Есть ли что-то, чего я не вижу?

Спасибо заранее.

4b9b3361

Ответ 1

Ok. Моя проблема была скрыта в коде, который я не опубликовал.

Я думал, что эта информация предназначена только для получения дополнительной информации, но она используется для самого входа.

У меня была настройка "jdbcAuthentication" дополнительно, и spring, казалось, всегда использовал это.

Теперь, когда я получил только настройки detailsService, все работает нормально.

изменить:.

поэтому мне нужно было удалить этот код:

auth.jdbcAuthentication() .dataSource(dataSource)
     * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
//   ....

И теперь он также работает с моим кодом в вопросе выше.

Ответ 2

Создать класс расширения:

public class CustomUserDetails extends org.springframework.security.core.userdetails.User{

    private User user;

    public CustomUserDetails(User user, Collection<? extends GrantedAuthority> authorities) {
        super(user.getName(), user.getPassword(), authorities);
        this.user = user;
    }

    public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
        super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        this.user = user;
    }

    public User getUser() {
        return user;
    }
}

Затем добавьте его в UserDetailsService:

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
    UserDetails userDetails = null;
    User user = userService.getByLogin(login);
    userDetails = new CustomUserDetails(user,
                true, true, true, true,
                getAuthorities(user.getRole()));

    return userDetails;
}

Получите это!

 (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()