Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 对于一组受保护的资源,如何对Post请求使用一种身份验证,对GET请求使用另一种身份验证?_Spring_Spring Security - Fatal编程技术网

Spring 对于一组受保护的资源,如何对Post请求使用一种身份验证,对GET请求使用另一种身份验证?

Spring 对于一组受保护的资源,如何对Post请求使用一种身份验证,对GET请求使用另一种身份验证?,spring,spring-security,Spring,Spring Security,我试图通过OAuth或Basic Auth保护一组资源(/admin/**)。我已经成功地分别实现了这两个(2个带有@Order的diff.WebSecurityAdapter)或同时实现了这两个(一个WebSecurityAdapter)。但是,我需要使用或 我目前的策略是使用基本Auth向/admin/**发送帖子,使用OAuth访问同一URL。这可行吗?还是有其他方法来实现这一点 或者,是否有一种方法可以使所有对/admin/**的请求都需要OAuth,除非有人通过基本身份验证进行身份验证

我试图通过OAuth或Basic Auth保护一组资源(/admin/**)。我已经成功地分别实现了这两个(2个带有@Order的diff.WebSecurityAdapter)或同时实现了这两个(一个WebSecurityAdapter)。但是,我需要使用或

我目前的策略是使用基本Auth向/admin/**发送帖子,使用OAuth访问同一URL。这可行吗?还是有其他方法来实现这一点

或者,是否有一种方法可以使所有对/admin/**的请求都需要OAuth,除非有人通过基本身份验证进行身份验证?是否有一种方法可以对另一个URL进行基本身份验证,该URL将正确填充SecurityContext,以便在执行基本身份验证的情况下,对/admin/**的访问也不会使用OAuth

OAuth或Basic Auth的当前实现(取决于Order(1)中的哪一个):

@EnableWebSecurity(debug=true)
@配置
@订单(1)
公共类OAuth扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.addFilterAfter(this.oauthConsumerContextFilter(),SwitchUserFilter.class);
http.addFilterAfter(this.oauthConsumerProcessingFilter(),OAuthConsumerContextFilter.class);
}
//重要提示:这不能是一个Bean
OAuthConsumerContextFilter OAuthConsumerContextFilter(){
OAuthConsumerContextFilter=新的OAuthConsumerContextFilter();
filter.setConsumerSupport(this.consumerSupport());
回流过滤器;
}
//重要提示:这不能是一个Bean
OAuthConsumerProcessingFilter OAuthConsumerProcessingFilter(){
OAuthConsumerProcessingFilter=新的OAuthConsumerProcessingFilter();
filter.setProtectedResourceDetailsService(this.prds());
LinkedHashMap=新建LinkedHashMap();
//xml中每个oauth:url元素一个条目
地图放置(
//第一个arg相当于xml中的url:pattern
//第二个参数相当于xml中的url:httpMethod
新的AntPathRequestMatcher(“/admin/**”,null),
//arg相当于xml中的url:resources
//重要提示:这必须与下面prds()和prd()中的ID匹配
Collections.singletonList(新的SecurityConfig(“myResource”));
地图放置(
//第一个arg相当于xml中的url:pattern
//第二个参数相当于xml中的url:httpMethod
新的AntPathRequestMatcher(“/auth/setup”,null),
//arg相当于xml中的url:resources
//重要提示:这必须与下面prds()和prd()中的ID匹配
Collections.singletonList(新的SecurityConfig(“myResource”));
setObjectDefinitionSource(新的DefaultFilterInitiationSecurityMetaDataSource(map));
回流过滤器;
}
@Bean//可选,我在其他地方重复使用它,因此使用Bean
OAuthConsumerSupport consumerSupport(){
CoreAuthConsumerSupport consumerSupport=新CoreAuthConsumerSupport();
consumerSupport.setProtectedResourceDetailsService(prds());
回报消费者支持;
}
@Bean//可选,我在其他地方重复使用它,因此使用Bean
受保护的资源跟踪服务prds(){
返回(字符串id)->{
开关(id){
//这必须与下面prd()中的id匹配
案例“myResource”:
返回珠三角();
}
抛出新的RuntimeException(“无效id:+id”);
};
}
受保护的资源详细信息珠三角(){
BaseProtectedResourceDetails=新的BaseProtectedResourceDetails();
//这必须存在,并且与上面prds()和prd()中的id匹配
详细信息。setId(“我的资源”);
详细信息。setConsumerKey(“asdf”);
详情。setSharedSecret(新的SharedConsumerSecretImpl(“asdf”);
setRequestTokenURL(“/oauth请求令牌”);
setUserAuthorizationURL(“/oauth authorization”);
setAccessTokenURL(“/oauth访问令牌”);
//启用oauth 1.0a
详细信息。setUse10a(正确);
//任何其他特定于服务的设置
退货详情;
}
}

您可以如下定义安全适配器:

@EnableWebSecurity(debug = true)
@Configuration
@Order(1)
public class OAuth extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http.requestMatcher(new AntPathRequestMatcher("/admin/**", HttpMethod.GET.toString()));
         http.addFilterAfter(this.oauthConsumerContextFilter(), SwitchUserFilter.class);
         http.addFilterAfter(this.oauthConsumerProcessingFilter(), OAuthConsumerContextFilter.class);
}

@Configuration
@Order(2)
public class BasicAuth extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.requestMatcher(new AntPathRequestMatcher("/admin/**", HttpMethod.POST.toString())).headers().frameOptions().sameOrigin().and().cors().and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and().httpBasic().and().authorizeRequests()
            .antMatchers("/**/*.{js,html,css}", "/", "/api/user", "/static/css/**/*", "/static/css/*", "/static/js/*", "/static/js/**/*").permitAll()
            .anyRequest().authenticated();
    }
}

上述配置应允许POST请求使用基本身份验证,GET请求使用OAUTH。

您可以如下定义安全适配器:

@EnableWebSecurity(debug = true)
@Configuration
@Order(1)
public class OAuth extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http.requestMatcher(new AntPathRequestMatcher("/admin/**", HttpMethod.GET.toString()));
         http.addFilterAfter(this.oauthConsumerContextFilter(), SwitchUserFilter.class);
         http.addFilterAfter(this.oauthConsumerProcessingFilter(), OAuthConsumerContextFilter.class);
}

@Configuration
@Order(2)
public class BasicAuth extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http.requestMatcher(new AntPathRequestMatcher("/admin/**", HttpMethod.POST.toString())).headers().frameOptions().sameOrigin().and().cors().and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and().httpBasic().and().authorizeRequests()
            .antMatchers("/**/*.{js,html,css}", "/", "/api/user", "/static/css/**/*", "/static/css/*", "/static/js/*", "/static/js/**/*").permitAll()
            .anyRequest().authenticated();
    }
}

上述配置应允许POST请求使用基本身份验证,GET请求使用OAUTH。

您可以定义自定义请求匹配器来检查基本身份验证:

public class BasicUrlAntPathRequestMatcher implements RequestMatcher {
private final String pattern;
public BasicUrlAntPathRequestMatcher(String pattern) {
 this.pattern = pattern;
}

@Override
public boolean matches(HttpServletRequest request) {
    String auth = request.getHeader(HttpHeaders.AUTHORIZATION);
    boolean hasBasicToken = (auth != null) &&  auth.startsWith("Basic");
    return !(new AntPathRequestMatcher(this.pattern).matches(request) || hasBasicToken);
}}
在OAuth配置类中,您可以在http配置中添加这一行

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http.requestMatcher(new BasicUrlAntPathRequestMatcher("your/basic/login"));

    http.addFilterAfter(this.oauthConsumerContextFilter(), SwitchUserFilter.class);
    http.addFilterAfter(this.oauthConsumerProcessingFilter(), OAuthConsumerContextFilter.class);
}

您可以定义自定义请求匹配器来检查基本身份验证:

public class BasicUrlAntPathRequestMatcher implements RequestMatcher {
private final String pattern;
public BasicUrlAntPathRequestMatcher(String pattern) {
 this.pattern = pattern;
}

@Override
public boolean matches(HttpServletRequest request) {
    String auth = request.getHeader(HttpHeaders.AUTHORIZATION);
    boolean hasBasicToken = (auth != null) &&  auth.startsWith("Basic");
    return !(new AntPathRequestMatcher(this.pattern).matches(request) || hasBasicToken);
}}
在OAuth配置类中,您可以在http配置中添加这一行

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http.requestMatcher(new BasicUrlAntPathRequestMatcher("your/basic/login"));

    http.addFilterAfter(this.oauthConsumerContextFilter(), SwitchUserFilter.class);
    http.addFilterAfter(this.oauthConsumerProcessingFilter(), OAuthConsumerContextFilter.class);
}