Spring Security - Active Directory Получить пользовательские данные пользователя - PullRequest
1 голос
/ 27 января 2020

У меня проблема с извлечением исходных данных пользователя из LdapUserDetailsImpl, таких как getUsername (), возвращает нуль

У меня есть следующие Java классы

  1. Пользовательский класс пользователя
public class AppUserDetails extends LdapUserDetailsImpl {
   public AppUserDetails() {
        super();
    }
   private String mail; //mail

}
Настраиваемые данные пользователя Mapper
    public class AppUserDetailsContextMapper extends LdapUserDetailsMapper {

        public AppUserDetailsContextMapper() {
            super();
        }


        @Override
        public AppUserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {

            UserDetails details = super.mapUserFromContext(ctx, username, authorities);


            String mail = ctx.getStringAttribute("mail");

            AppUserDetails appUserDetails = new AppUserDetails();
            appUserDetails.setMail(mail);

            return appUserDetails;
        }
    }
Конфигурация веб-безопасности
 @Configuration
   public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

       @Autowired
       Environment env;

       @Bean
       public UserDetailsContextMapper userDetailsContextMapper() {
           return new AppUserDetailsContextMapper();
       }

       @Bean
       public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
           ActiveDirectoryLdapAuthenticationProvider provider =
                   new ActiveDirectoryLdapAuthenticationProvider(
                           env.getRequiredProperty("spring.ldap.domain"),
                           env.getRequiredProperty("spring.ldap.urls")
                   );
           provider.setConvertSubErrorCodesToExceptions(true);
           provider.setUseAuthenticationRequestCredentials(true);
           provider.setUserDetailsContextMapper(userDetailsContextMapper());
           return provider;
       }

       @Override
       protected void configure(AuthenticationManagerBuilder auth) throws Exception {
           auth
                   .authenticationProvider(activeDirectoryLdapAuthenticationProvider())
                   .userDetailsService(userDetailsService());
       }

       @Bean
       public AuthenticationManager authenticationManager() {
           return new ProviderManager(
                   Collections
                           .singletonList(activeDirectoryLdapAuthenticationProvider())
           );
       }

   }

Однако у меня возникла серьезная проблема при попытке получить пользовательские данные пользователя в контроллере:

@Controller
public class HomeController {
    @GetMapping(value = {"/home"})
    public String home(Model model) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        System.out.println(authentication.getPrincipal()); 
        AppUserDetails appUserDetails = (AppUserDetails) authentication.getPrincipal();
        System.out.println(appUserDetails);
        return "home";
    }
}

Я получаю исключение NullPointer если я пытаюсь любое свойство из класса LdapUserDetailsImpl. Тем не менее, я точно получаю все свойства из AppUserDetails - который расширяет класс LdapUserDetailsImpl.

Где я могу его пропустить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...