【问题标题】:Spring Security integration test for session authentication strategy会话认证策略的 Spring Security 集成测试
【发布时间】:2019-05-08 09:00:25
【问题描述】:

我有一个 Spring MVC + Spring Security Web 应用程序。 应用程序在配置中设置了自定义会话身份验证策略

http.sessionManagement()
                .sessionAuthenticationStrategy( ... )

由于策略包含复杂的逻辑,因此通过集成测试来测试其行为非常重要。

当我们使用 spring-security-test @WithMockUser 时,控制器方法在测试中被调用,但是我们的身份验证策略不被调用

在 Spring Security 测试中强制执行完整身份验证过程以确保确实调用会话身份验证策略的正确方法是什么?

或者换个说法:如何调用整个spring安全过滤器链?

感谢您的想法。

【问题讨论】:

    标签: spring-security integration-testing spring-security-test


    【解决方案1】:

    在您的集成测试中,提供static WebSecurityConfigurerAdapter,它应该会被选中。

    例如:

    @EnableWebSecurity
    static class CustomSessionAuthenticationStrategyConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                .sessionManagement()
                    .sessionAuthenticationStrategy(customSessionAuthenticationStrategy);
        }
    }
    

    更新:

    这是 Spring Security 4.x 中的 MockMvc 测试。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration
    @WebAppConfiguration
    public class SessionAuthenticationStrategyTest {
    
        @Autowired
        private WebApplicationContext context;
    
        private MockMvc mvc;
    
        @Before
        public void setup() {
            mvc = MockMvcBuilders
                    .webAppContextSetup(context)
                    .apply(springSecurity())
                    .build();
        }
    
        @Test
        public void requestWhenCustomSessionAuthenticationStrategyProvidedThenCalled() throws Exception {
            this.mvc.perform(formLogin().user("user").password("password"));
            verify(CustomSessionAuthenticationStrategyConfig.customSessionAuthenticationStrategy)
                    .onAuthentication(any(Authentication.class), any(HttpServletRequest.class), any(HttpServletResponse.class));
        }
    
        @EnableWebSecurity
        static class CustomSessionAuthenticationStrategyConfig extends WebSecurityConfigurerAdapter {
            static SessionAuthenticationStrategy customSessionAuthenticationStrategy = mock(SessionAuthenticationStrategy.class);
    
            @Override
            public void configure(HttpSecurity http) throws Exception {
                http
                    .formLogin()
                        .and()
                    .sessionManagement()
                        .sessionAuthenticationStrategy(customSessionAuthenticationStrategy);
            }
    
            @Override
            protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth
                    .inMemoryAuthentication()
                        .withUser("user").password("password").authorities("ROLE_USER");
            }
        }
    }
    

    【讨论】:

    • 不幸的是它没有被接收。我的意思是:没有调用 SessionAuthenticationStrategy 的 onAuthentication 方法。看起来 WithMockUser 阻止调用身份验证链。也许 WithMockUser 在这里是个坏主意,我必须以某种方式更手动地强制执行身份验证过程?
    • 重要细节:项目中使用了Spring Security 4
    • 你能提供一个你的测试样本,这样我就可以知道为什么它没有被选中。
    • 谢谢,我会尝试您的建议,如果它不起作用,请发布示例 - 星期一我可以访问代码时
    • 您的代码确实运行良好! (假设我们将“{noop}password”替换为“password”)。我的代码依赖于很多配置继承仍然不起作用。我将尝试将我的代码尽可能地融合到您的工作示例中,并在任何情况下提供更多详细信息。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多