首页 > 解决方案 > 在 Spring Boot 过滤器中检索 AD 用户信息

问题描述

在我的 Spring Boot 应用程序中,我试图在通过 AD 页面登录后检索用户的 AD 信息(即姓名、电子邮件等)。我遇到的问题是我无法弄清楚如何在身份验证过滤器中从 AD 获取用户信息。

这些是我的 pom 依赖项:

    ...
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-active-directory-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
    ....

这是我的SecurityConfig

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS).permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/login/oauth2/azure**").authenticated() // called when AD returns
                .and().csrf().disable()
            .exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint())
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilterBefore(corsFilter(), SecurityContextPersistenceFilter.class)
            .addFilterAfter(exceptionFilter(), SecurityContextPersistenceFilter.class)
            .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class)
                .addFilterBefore(azureAuthenticationFilter(), BasicAuthenticationFilter.class)

            .addFilterBefore(tokenAuthenticationFilter(), BasicAuthenticationFilter.class)
            .oauth2Login()
            .userInfoEndpoint()
            .oidcUserService(oidcUserService);
    }

这是我的过滤器:

public class AzureAuthenticationFilter extends BasicAuthenticationFilter {

    public AzureAuthenticationFilter(AuthenticationManager authenticationManager) {
        super(authenticationManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String code = request.getParameter("code");
        String state = request.getParameter("state");
        String sessionSate = request.getParameter("session_state");

        // This is null
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();


        chain.doFilter(request, response);
    }
}

我想我可以用 来完成OidcUserService,但看起来我需要自己构建所有对象,但我真的需要吗?那有什么意义azure-active-directory-spring-boot-starter呢?我已经寻找了几个小时的答案,但我能找到的只是登录或在控制器中完成。任何帮助表示赞赏。谢谢。

标签: javaspring-bootazure-active-directory

解决方案


推荐阅读