使用Spring Security

时间:2016-04-30 09:45:25

标签: spring authentication spring-security token basic-authentication

我想保护REST API。规则很简单。

  • 用户必须致电/api/authenticate以获取令牌
  • 用户可以使用令牌(从/api/authenticate收到)来访问API /api/**
  • 端点/api/authenticate仅接受HTTP基本身份验证(无令牌身份验证)
  • 端点/api/**(不包括/api/authenticate)仅接受令牌身份验证(无基本身份验证)
  • 所有剩余的端点都是公开的,不需要身份验证。

我实际上是用这个:

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Autowired
        private TokenAuthenticationProvider tokenAuthenticationProvider;

        @Override
        protected void configure(final HttpSecurity httpSecurity) throws Exception {
            httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            httpSecurity.headers().disable();
            httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
            httpSecurity.antMatcher("/api/authenticate").httpBasic();
            httpSecurity.antMatcher("/api/**").apply(new TokenAuthenticationConfigurer());
            httpSecurity.authorizeRequests()
                    .antMatchers("/api/**").authenticated()
                    .anyRequest().permitAll();
        }
    }

实际上,如果我向/api/authenticate发送带有令牌的请求,我的配置会接受请求。我认为这是因为/api/authenticate/api/**的一部分。所以我需要排除这个路径进行令牌认证。

我该怎么做?

编辑1

如果我使用.and()流畅的风格,结果完全相同。

    @Override
    protected void configure(final HttpSecurity httpSecurity) throws Exception {
        httpSecurity.setSharedObject(TokenAuthenticationProvider.class, this.tokenAuthenticationProvider);
        httpSecurity
                .headers().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .antMatcher("/api/authenticate").httpBasic()
                .and()
                .antMatcher("/api/**").apply(new TokenAuthenticationConfigurer())
                .and()
                .authorizeRequests().antMatchers("/api/**").authenticated().anyRequest().permitAll();
    }

编辑2

据我了解SecurityBuilderHttpSecurity),antMatcher(...)方法中configure(...)的每次调用都会覆盖之前的调用。在调试日志中,我可以看到,Spring Security始终尝试将请求路径与/api/**匹配,但永远不会再次/api/authenticate。如果我切换订单,我再也无法访问API,只有/api/authenticate,因为Spring Security现在总是尝试再次匹配/api/authenticate

所以问题是:我如何注册多个规则:

  • /api/authenticate - > HttpBasicConfigurer.http()
  • /api/** - > TokenAuthenticationConfigurer(已配置我的令牌身份验证,.apply(...)

1 个答案:

答案 0 :(得分:0)

也许是因为你总是覆盖父级的配置而你不使用and()方法:

  

使用and()方法表示关闭XML标记的Java配置,它允许我们继续配置父标记。如果您阅读代码,它也是有道理的。我想配置授权请求并配置表单登录并配置HTTP基本身份验证。

http://docs.spring.io/spring-security/site/docs/current/reference/html/jc.html#jc-httpsecurity