我试图用两个不同的过滤器来配置spring security。我想要的是有一些将由一个过滤器处理的网址,和一些将由其他过滤器处理的网址。这是我想到的设置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true)
public class SecurityConfigurationContext {
@Order(1)
@Configuration
public static class ConfigurerAdapter1 extends WebSecurityConfigurerAdapter{
...
@Override
protected void configure(final HttpSecurity http) throws Exception {
// Handlers and entry points
http.exceptionHandling()
.authenticationEntryPoint(MyCustomAuthenticationEntryPoint);
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER");
http.addFilterBefore(myCustomFilter1, ChannelProcessingFilter.class);
http.csrf().disable();
http.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myCustomAuthenticationService)
.passwordEncoder(new BCryptPasswordEncoder());
}
}
@Order(2)
@Configuration
public static class ConfigurerAdapter2 extends WebSecurityConfigurerAdapter{
...
@Override
protected void configure(final HttpSecurity http) throws Exception {
// Handlers and entry points
http.exceptionHandling()
.authenticationEntryPoint(MyCustomAuthenticationEntryPoint);
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER");
http.addFilterBefore(myCustomFilter2, ChannelProcessingFilter.class);
http.csrf().disable();
http.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myCustomAuthenticationService)
.passwordEncoder(new BCryptPasswordEncoder());
}
}
}
过滤器看起来像这样:
过滤器1 :
@Component
@Order(1)
public final class MyCustomFilter1 implements Filter{
public MyCustomFilter1() {
super();
}
@Override
public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
// logic for processing filter1-urls
}
}
过滤器2 :
@Component
@Order(2)
public final class MyCustomFilter2 implements Filter{
public MyCustomFilter2() {
super();
}
@Override
public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
// logic for processing filter2-urls
}
}
问题是这两个过滤器都是在一个链中为每个请求调用的。我提出的任何请求,它首先通过一个过滤器,然后通过另一个,而不是仅仅通过一个。
我该怎么解决这个问题?
提前感谢。
您应该只有一个< code>ConfigurerAdapter。您可以将它组合成一个配置:
http.exceptionHandling()
.authenticationEntryPoint(MyCustomAuthenticationEntryPoint);
http
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/filter1-urls/*").hasRole("USER")
.antMatchers(HttpMethod.GET, "/filter2-urls/*").hasRole("SUPER_USER");
http.addFilterBefore(myCustomFilter, ChannelProcessingFilter.class);
这两个过滤器都将被调用,因为您设置了这样的行为。您应该留下唯一的一个过滤器来实现您想要的结果。
@Component
public final class MyCustomFilter implements Filter {
public MyCustomFilter() {
super();
}
@Override
public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
// logic for processing filter2-urls and filter1-urls
}
}
无论如何,您的过滤器将在链中调用。如果您想拆分过滤器,您应该在过滤器中添加if
语句以过滤只需要的url(您可以从ServletRequest
获取请求url
@Component
public final class MyCustomFilter2 implements Filter {
public MyCustomFilter2() {
super();
}
@Override
public final void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException {
if (/*is filter2 urls*/) {
// logic for processing filter2-urls
}
}
}
我正在使用这个环境: Spring 4.0.5 Spring security 3.2.4 在我的环境中,我有一个SSO系统,我需要在这个系统中集成我的web应用程序。这个系统是私人产品。SSO机制的最终结果是在请求头中放置一个参数。所以我在申请中应该做的是: null 此场景类似于CAS集成场景;所以我从CAS集成着手;我写了我的自定义过滤器,我写了我的自定义入口点和处理请求所需的所有其他类,但
问题内容: 我的问题很简单。我想在Elastica的一个查询中组合两个过滤器,一个filter_bool和一个filter_range。该代码是 我不能在$ elasticaQuery中将两个过滤器放在一起。请给我任何帮助! 谢谢! 问题答案: 为什么不将范围过滤器添加为过滤器中的另一个术语: 您需要在布尔过滤器中使用过滤器,而不是查询。注意我已经使用而不是您正在使用的范围查询。 另外,您知道您使
在内部,如果出现任何异常,将被重定向&这不需要通过,可以跳过此请求。 我已经实现了OncePerRequestFilter&任何请求都不会调用它。这必须在OAuth过滤器之前调用。 让我知道这个安全配置出了什么问题。
我有一个带有OAuth2授权和资源服务器的Spring引导设置。用户可以通过向发出POST请求来获取令牌。到目前为止,一切都很好。 但是,我不想通过基本auth保护,而是通过自定义安全过滤器。 一些简单的例子如何实现这一点将是非常有帮助的。谢谢!
如何在链顶部的Spring Security链中插入多个自定义过滤器? 我可以通过在="FIRST"之后使用和之后尝试多个
我已将过滤器配置如下,但在Spring Security Filter链之前不会调用它。我已将顺序设置为零 我使用的是Spring Boot 1.3,它支持在过滤器上设置顺序