9

この記事に従って、Spring Security でカスタム ステートレス認証を実装しようとしています。

私が直面している問題は、SecurityConfig が前のリンクとほとんど同じように見える場合でも、カスタム フィルターがフレームワークによって呼び出されていないことです (少し単純です)。

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

    @Autowired
    @Qualifier("appAuthenticationProvider")
    private AuthenticationProvider authenticationProvider;

    @Autowired
    @Qualifier("appAuthenticationFilter")
    private AppAuthenticationFilter appAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable().
        sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests().anyRequest().authenticated()
        .and()
        .anonymous().disable()
        .exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint());

        http.addFilterBefore(appAuthenticationFilter, BasicAuthenticationFilter.class);
    }

    @Bean
    public AuthenticationEntryPoint unauthorizedEntryPoint() {
        return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
    }
}

authenticationProviderappAuthenticationFilterのコードは投稿しません。前者は正常に動作しており (/login エンドポイントを使用してログインできます)、後者は GenericFilterBean を実装するだけ呼び出されていないからです。

どんな助けでも大歓迎です!

4

2 に答える 2

8

OK、Spring Boot アプリのデプロイ時にフィルターが実行されていて、テストの実行時にのみフィルターが呼び出されていないことに気付いた後、解決策を見つけました。次に、この投稿を見つけました。

https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

フィルターを使用するようにモック MVC を構成するのを忘れていました。最後に、認証用のテスト クラスは次のようになります。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = GasApplication.class)
@WebAppConfiguration
public class LoginControllerTest {

    @Autowired
    private WebApplicationContext context;

    @Autowired
    @Qualifier("appAuthenticationFilter")
    private Filter appAuthenticationFilter;

    private MockMvc mockMvc;

    @Before  
    public void init() throws Exception {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .addFilter(appAuthenticationFilter, "/resource")
                .build();
    }

    // Tests here...
}
于 2015-05-27T14:04:06.443 に答える
2

前の回答のように手動でフィルターを自動配線して設定しないようにするには、SecurityMockMvcConfigurers.springSecurity() を使用できます。

MockMvcBuilders
.webAppContextSetup(context)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
于 2017-03-15T11:23:55.903 に答える