gpt4 book ai didi

java - 我们可以根据路径变量将 httpbasic 和 OAuth2 都用于 API 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 20:25:19 24 4
gpt4 key购买 nike

在我的应用程序中,我只想为某些特定的 API 调用提供 OAuth2 安全性。我的问题是我可以根据路径变量提供 HttpBasic 或 Oauth2 身份验证吗?

以下是我将考虑的两种情况。

1) 假设用户(其名称在路径变量中提供)xyz,如果 xyz 没有 OAuth 的功能,我想使用 httpBasic 对其进行身份验证

2) 如果另一个用户 abc 具有 OAuth 功能,我想使用 Oauth/OpenId connect 对其进行身份验证。

我有一个为用户分配特征的表格,下面是表格的一瞥。

名称,特征

xyz, HttpBasic

abc, Oauth

最佳答案

好的,我自己做了一些研究并找到了解决方案。这是我所做的,

-使用 WebSecurityConfigurerAdapter 创建了一个 httpbasic 配置,现在在任何拦截器开始它的任务之前,我已经创建了一个请求匹配器,它将检查授权 header 是 Basic 还是 Bearer。

      //By default this filter order is 100 and OAuth has filter order 3
@Order(2)
public class MicroserviceSecurityConfigurationHttpBasic extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().exceptionHandling()
.authenticationEntryPoint(customAccessDeniedHandler())
.and().headers().frameOptions().disable()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.requestMatcher(new BasicRequestMatcher())
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and().httpBasic();

}
private class BasicRequestMatcher implements RequestMatcher {
@Override
public boolean matches(HttpServletRequest httpRequest) {
String auth = httpRequest.getHeader("Authorization");
String requestUri = httpRequest.getRequestURI();
//Fetching Identifier to provide OAuth Security to only specific urls
String identifier= requestUri.substring(requestUri.lastIndexOf("/") + 1, requestUri.length());

//Lets say for identifier ABC only, I want to secure it using OAuth2.0
if (auth != null && auth.startsWith("Basic") && identifier.equalsIgnoreCase("ABC")) {
auth=null;
}
//For ABC identifier this method will return null so then the authentication will be redirected to OAuth2.0 config.
return (auth != null && auth.startsWith("Basic"));
}
}
}

-在此之后我使用 ResourceServerConfigurerAdapter 创建了 OAuth2.0 配置,这里是它的一瞥。

    //Default filter order=3 so this will be executed after WebSecurityConfigurerAdapter 
public class MicroserviceSecurityConfiguration extends ResourceServerConfigurerAdapter {
...
//Here I am intercepting the same url but the config will look for bearer token only
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().exceptionHandling()
.and().headers().frameOptions().disable()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().authorizeRequests()
.antMatchers("/api/**").authenticated();
}
}

引用文献:https://github.com/spring-projects/spring-security-oauth/issues/1024

Spring security with Oauth2 or Http-Basic authentication for the same resource

关于java - 我们可以根据路径变量将 httpbasic 和 OAuth2 都用于 API 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com