Spring Security Blocking public rest service

2019-09-01 04:55发布

问题:

I have a little problem with Spring Security and my public Rest service (only I use POST)

My RestController is :

@RestController
@RequestMapping(value="/public/rest/status")
Public class DoSomeThing {
    @RequestMapping(method=RequestMethod.GET)
    public String getStatus(){
        return "OK";
    }

    @RequestMapping(method=RequestMethod.POST)
    public String setON(){
        return "Done";
    }
}

and my Spring Security is :

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

    @Autowired
    private LogoutHandler logoutHandler;

    @Autowired
    private AuthenticationSuccessHandler authenticationSuccessHandler;

    @Autowired
    private AccessDeniedHandler accessDeniedHandler;

    @Autowired
    private AuthenticationFailureHandler authenticationFailureHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .antMatchers("/error/**").permitAll()
            .and()
        .authorizeRequests()
            .antMatchers("/adm/**").hasAnyRole(Role.ROOT,Role.ADM)
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .successHandler(authenticationSuccessHandler)
            .failureHandler(authenticationFailureHandler)
            .defaultSuccessUrl("/home",true)
            .permitAll()
            .and()
        .logout()
            .logoutSuccessUrl("/login")
            .permitAll()
            .addLogoutHandler(logoutHandler)
            .and()
         .exceptionHandling()
            .accessDeniedHandler(accessDeniedHandler);

    }
}

When I try to access my Rest service by GET its all fine :

$curl -i -X GET localhost:8080/public/rest/status
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: text/plain;charset=UTF-8
Content-Length: 2
Date: Sun, 10 Jan 2016 05:23:10 GMT

But when I try using POST the rest is deny

$curl -i -X POST localhost:8080/public/rest/status
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Set-Cookie: JSESSIONID=57387564970B157C03310B6DAFE8E82B; Path=/; HttpOnly
Location: /error/denied
Content-Length: 0
Date: Sun, 10 Jan 2016 05:23:26 GMT

How can I grant access to all for my REST service (POST and GET)?

回答1:

By default CSRF protection is ON when you're using Java Config for spring security. You should either provide a CSRF token for POST requests or disable it by adding this piece of configuration:

http
                ...
                .and()
                    .csrf().disable();


回答2:

Thanks Ali your suggestion work fine.

After test this suggestion I was adapted my WebSecurityConfig class with code :

and().csrf().ignoringAntMatchers("/public/**") ...

With this instruction spring security will be disable only my public mapping.