java - 在 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
呢?我已经寻找了几个小时的答案,但我能找到的只是登录或在控制器中完成。任何帮助表示赞赏。谢谢。
解决方案
推荐阅读
- javascript - 如何在Javascript中获取大浮点数的前两位
- python - 如何在Flask内部函数中重定向
- laravel - 如何自定义响应 JSON 对象验证器
- gitlab - 使用带有子键的 gpg 时 GitLab 中的未验证提交
- git - 拉取后本地标记为已删除的 Git 文件
- json - 使用 JMeter 中的正则表达式提取器从 JSON 中获取值
- javascript - 如何更改所有 TinyMCE 静态文件的基本根目录?
- ios - 深度链接二维码在 iOS 14 中打开 Safari 而不是 App
- python - Python 尝试返回致命错误,除非在 pyinstaller 中编译
- typescript - Jest & TypeScript:VS Code 找不到名称