Spring Security-Active Directory获取自定义用户详细信息

时间:2020-01-27 10:05:32

标签: java spring spring-security spring-security-ldap

我在从LdapUserDetailsImpl中提取原始用户详细信息方面遇到了挑战,例如getUsername()返回null

我有以下Java类

  1. 自定义用户类别
public class AppUserDetails extends LdapUserDetailsImpl {
   public AppUserDetails() {
        super();
    }
   private String mail; //mail

}
  1. 自定义用户详细信息映射器
    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;
        }
    }
  1. 网络安全配置
 @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";
    }
}

如果我尝试使用LdapUserDetailsImpl类的任何属性,都会收到NullPointer异常。但是,我准确地从AppUserDetails获取了所有属性,该属性扩展了LdapUserDetailsImpl类。

我在哪里可能会想念它?

0 个答案:

没有答案