Spring REST security - 以不同的方式保护不同的 URL

Posted

技术标签:

【中文标题】Spring REST security - 以不同的方式保护不同的 URL【英文标题】:Spring REST security - Secure different URLs differently 【发布时间】:2016-01-07 08:39:19 【问题描述】:

我在 Spring 4 下使用基本身份验证工作 REST API。这些 REST 服务位于 /api/v1/** URL 下。但是,我想在不同的 url /api/v2/** 下添加另一组 REST 端点,但受基于令牌的身份验证保护。

是否可以用一个 servlet 做到这一点?如何配置 Spring Security 以对不同的 URL 使用不同形式的身份验证?

谢谢。

【问题讨论】:

你应该能够在你的 spring security applicationContext 中拥有不止一个入口点,你可以在其中指定你的拦截 url 模式。 您的意思是更多受保护的 void configure(HttpSecurity http) 方法,每个方法都适用于每个 URL 模式?你能给我一个例子来说明你的意思吗?谢谢。 我只使用过基于 xml 的 spring security 设置,据我所知,它可以设置多个 标签,具有不同的入口点和它自己的一组拦截 URL。如果你愿意,我可以试着把一些基本的东西放在一起。 当然,我愿意。 IT 没关系,我可能能够将其转化为程序化配置。谢谢。 请查看此链接***.com/questions/4783063/…您可以为您的应用程序配置多个入口点。 【参考方案1】:

下面是 Java 配置中的代码示例,它使用 UserDetailsService 并且针对不同的 URL 端点具有不同的安全配置:

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    UserDetailsService userDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(userDetailsService);
    

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                    .antMatcher("/api/v1/**")
                    .httpBasic()
                        .realmName("API")
                        .and()
                    .csrf().disable()
                    .authorizeRequests()
                    .antMatchers("/api/v1/**").authenticated();
        
    

    @Configuration
    @Order(2)
    public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                    .antMatcher("/api/v2/**")
                    /* other config options go here... */
        

    

【讨论】:

我的用例略有不同。是否可以配置/api/** 使用基本身份验证和剩余应用程序使用表单登录? 是的。在 API 安全配置的第一行中使用 http.antMatcher("/api/**"),在应用程序的其余部分的配置中使用 http.requestMatcher(new NegatedRequestMatcher(new AntPathRequestMatcher("/api/**"))) 如果我想为每个端点使用不同的 userDetailsS​​ervice 怎么办?

以上是关于Spring REST security - 以不同的方式保护不同的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Spring(Websockets / REST / Security)、JWT 和 Sockjs(Stomp)集成

Spring Security:测试和理解 REST 身份验证

REST Security with JWT using Java and Spring Security

Spring MVC REST + Spring Security + 基本身份验证

Spring MVC 和 Spring REST 的 Spring Security

使用 Spring 和 Spring Security 进行 REST 身份验证