如何禁用特定URL的弹簧安全性

时间:2015-05-21 06:45:05

标签: java spring spring-mvc spring-security

我正在使用无状态弹簧安全性,但是在注册的情况下我想禁用spring security.I禁用

setImmediate

但它不起作用,我收到以下错误:

process.nextTick

我认为这意味着Spring安全过滤器正在运行

我的网址订单总是" / api / v1"

我的春季配置是

antMatchers("/api/v1/signup").permitAll().

我的身份验证过滤器是

 message=An Authentication object was not found in the SecurityContext, type=org.springframework.security.authentication.AuthenticationCredentialsNotFoundException

我的控制器是

@Override
    protected void configure(HttpSecurity http) throws Exception {

         http.
         csrf().disable().
         sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
         and().
         authorizeRequests().
         antMatchers("/api/v1/signup").permitAll().
         anyRequest().authenticated().
         and().
         anonymous().disable();
        http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
    }

我是春天新手,请帮我怎么做?

7 个答案:

答案 0 :(得分:99)

使用permitAll时,它表示每个经过身份验证的用户,但是您禁用了匿名访问权限,因此无法使用。

您想要忽略某些网址,以覆盖采用configure对象和WebSecurity模式的ignore方法。

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/signup");
}

HttpSecurity部分删除该行。这将告诉Spring Security忽略此URL并且不对它们应用任何过滤器。

答案 1 :(得分:12)

我有更好的方法:

http
    .authorizeRequests()
    .antMatchers("/api/v1/signup/**").permitAll()
    .anyRequest().authenticated()

答案 2 :(得分:8)

<http pattern="/resources/**" security="none"/>

或者使用Java配置:

web.ignoring().antMatchers("/resources/**");

而不是旧的:

 <intercept-url pattern="/resources/**" filters="none"/>

表示exp。禁用登录页面的安全性:

  <intercept-url pattern="/login*" filters="none" />

答案 3 :(得分:5)

这可能不是您问题的完整答案,但是如果您正在寻找禁用csrf保护的方法,您可以这样做:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/web/admin/**").hasAnyRole(ADMIN.toString(), GUEST.toString())
                .anyRequest().permitAll()
                .and()
                .formLogin().loginPage("/web/login").permitAll()
                .and()
                .csrf().ignoringAntMatchers("/contact-email")
                .and()
                .logout().logoutUrl("/web/logout").logoutSuccessUrl("/web/").permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("admin").roles(ADMIN.toString())
                .and()
                .withUser("guest").password("guest").roles(GUEST.toString());
    }

}

我已包含完整配置,但关键行是:

.csrf().ignoringAntMatchers("/contact-email")

答案 4 :(得分:2)

如果要忽略多个API端点,可以按以下方式使用:

 @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable().authorizeRequests() 
            .antMatchers("/api/v1/**").authenticated()
            .antMatchers("api/v1/authenticate**").permitAll()
            .antMatchers("**").permitAll()
            .and().exceptionHandling().and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

答案 5 :(得分:0)

@ M.Deinum已经写下了答案。

我尝试使用api /api/v1/signup。它将绕过过滤器/自定义过滤器,但浏览器会为/favicon.ico调用一个附加请求,因此,我也在web.ignoring()中添加了它,并且对我有用。

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/signup", "/favicon.ico");
}

也许上述问题不是必需的。

答案 6 :(得分:0)

我遇到了同样的问题,这是解决方案:已解释

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers(HttpMethod.POST,"/form").hasRole("ADMIN")  // Specific api method request based on role.
            .antMatchers("/home","/basic").permitAll()  // permited urls to guest users(without login).
            .anyRequest().authenticated()
            .and()
        .formLogin()       // not specified form page to use default login page of spring security.
            .permitAll()
             .and()
        .logout().deleteCookies("JSESSIONID")  // delete memory of browser after logout.

        .and()
        .rememberMe().key("uniqueAndSecret"); // remember me check box enabled.

    http.csrf().disable();  **// ADD THIS CODE TO DISABLE CSRF IN PROJECT.**
}