Spring Security Blocking public rest service

泄露秘密 提交于 2019-12-25 05:04:13

问题


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.



来源:https://stackoverflow.com/questions/34702424/spring-security-blocking-public-rest-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!