Nano Hash - криптовалюты, майнинг, программирование

org.springframework.security.core.userdetails.User не может быть приведен к MyUserDetails (июнь 5)

Я тестирую веб-приложение с помощью Junit 5, все работает нормально, кроме

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

строка в классе контроллера при выполнении тестового примера над кодом строки возвращаемого объекта

org.springframework.security.core.userdetails.User вместо MyUserDetails (при запуске приложения в весенней загрузке возвращаемый объект — MyUserDetails, и код работает хорошо)

Мой класс тестового примера

@ExtendWith(SpringExtension.class)
@WebMvcTest(VendorController.class)
@AutoConfigureMockMvc
class VendorControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    void test() throws Exception {
    mvc.perform(MockMvcRequestBuilders.post("/vendor/user/getVendorList").with(csrf().asHeader())
            .param("iDisplayStart","0")
            .param("iDisplayLength", "10")
            .param("iSortCol_0", "0")
            .param("sSortDir_0", "asc")
            .param("sSearch","")
            .with(user("username").password("password").roles("2"))).andExpect(status().isOk());
     }
}

Какой код мне не хватает, чтобы он возвращал объект org.springframework.security.core.userdetails.User при выполнении тестового примера с использованием Junit 5, но работает правильно, если я запускаю проект через весеннюю загрузку.

Добавление кода реализации UserDetailsService

@Service("userDetailsService")

public class MyUserDetailsService implements UserDetailsService {

@Autowired

private UserSvc userSvc;

@Transactional(readOnly=true)

@Override

public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {

    com.esociety.entity.UserEntity userEntity = userSvc.findByUserName(username);

    List<GrantedAuthority> authorities = buildUserAuthority(userEntity.getUserType());

    return buildUserForAuthentication(userEntity, authorities);

}

private User buildUserForAuthentication(com.esociety.entity.UserEntity userEntity, List<GrantedAuthority> authorities) {

     MyUserDetails myUserDetails = new MyUserDetails (userEntity.getUsername(), userEntity.getPassword(), userEntity.isEnabled(), userEntity.isAccountNonExpired(), userEntity.isCredentialsNonExpired(),userEntity.isAccountNonLocked(),authorities,userEntity.getUserId(),userEntity.getSocietyId(),userEntity.getUserType(),userEntity.getFirstName(),userEntity.getMiddleName(),userEntity.getLastName());

     return myUserDetails;

}

private List<GrantedAuthority> buildUserAuthority(String userType) {

    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

    // Build user's authorities

    setAuths.add(new SimpleGrantedAuthority(userType));

    List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

    return Result;

}

}

Класс MyUserDetails

public class MyUserDetails extends User {
 public MyUserDetails(String username, String password, boolean enabled,
        boolean accountNonExpired, boolean credentialsNonExpired,
        boolean accountNonLocked,
        Collection<? extends GrantedAuthority> authorities, Long userId,
        Long societyId, String userType, String firstName,
        String middleName, String lastName) {
    super(username, password, enabled, accountNonExpired,
            credentialsNonExpired, accountNonLocked, authorities);
    this.userId = userId;
    this.societyId = societyId;
    this.userType = userType;
    this.firstName = firstName;
    this.middleName = middleName;
    this.lastName = lastName;
 }
// getter setter goes here

}

  • Используете ли вы реализацию UserDetailsService для возврата MyUserDetails? Если да, то как сделать эту службу доступной для теста (поскольку вы не загружаете весь контекст SpringApplication)? 10.07.2018
  • @AndreiDamian-Fekete Я добавил код реализации userDetailsService. Когда я вхожу в приложение, вызывается метод buildUserForAuthentication, и он создает объект MyUserDetails, который расширяет пользователя, но я считаю, что если какой-то метод buildUserForAuthentication должен вызываться во время теста Junit, тогда я не буду получать исключение исключения класса. 10.07.2018

Ответы:


1

Проблема в том, что вы используете SecurityMockMvcRequestPostProcessors.user(String username) RequestPostProcessor, который создаст и вернет org.springframework.security.core.userdetails.User, который является реализацией UserDetails, но не MyUserDetails, который вы хотите.

Вместо этого вы можете использовать SecurityMockMvcRequestPostProcessors.user(UserDetails user), который позволяет представить собственную реализацию UserDetails, в данном случае MyUserDetails, которую вы хотите.

Измените свой тест следующим образом:

@Test
void test() throws Exception {
mvc.perform(MockMvcRequestBuilders.post("/vendor/user/getVendorList").with(csrf().asHeader())
        .param("iDisplayStart","0")
        .param("iDisplayLength", "10")
        .param("iSortCol_0", "0")
        .param("sSortDir_0", "asc")
        .param("sSearch","")
        .with(user(new MyUserDetails ("username", "password", true, true, true,true, Arrays.asList(new SimpleGrantedAuthority("2")),1,1,USER_TYPE,"FirstName","MiddleName","LastName")))).andExpect(status().isOk());
 }

Ссылка на Spring Security Исходный код

10.07.2018
  • он говорит, что приводит аргумент 1 к RequestPostProcessor или позволяет MyUserDetails реализовать RequestPostProcessor .with( (RequestPostProcessor) new MyUserDetails ("username", "password", true, true, true,true, Arrays.asList(new SimpleGrantedAuthority("2")),2L,1L,"ROLE_2","Firstname","middlename","Lastname"))).andExpect(status().isOk());, и я все еще получаю ту же ошибку 11.07.2018
  • Вы не можете привести MyUserDetails к RequestPostProcessor. Ваше изменение кода вообще работает? 11.07.2018
  • Это дает ошибку компиляции, если я не бросаю, да, код работает правильно 11.07.2018
  • несколько изменений в коде, и все заработало with-a-requestpostprocessor" rel="nofollow noreferrer">custom_UserDetails 15.07.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..