Webのガイドに従って、Springセキュリティを使用してWebサイトを保護しようとしています。サーバー側では、WebSecurityConfigurerAdapterとコントローラーは次のようになります
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
implements ApplicationContextAware {
@Override
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception {
authManagerBuilder.inMemoryAuthentication()
.withUser("user").password("password").roles("ADMI N");
}
}
@Controller
//@RequestMapping("/course")
public class CourseController implements ApplicationContextAware{
@RequestMapping(value="/course", method = RequestMethod.GET, produces="application/json")
public @ResponseBody List<Course> get(// The critirion used to find.
@RequestParam(value="what", required=true) String what,
@RequestParam(value="value", required=true) String value) {
//.....
}
@RequestMapping(value="/course", method = RequestMethod.POST, produces="application/json")
public List<Course> upload(@RequestBody Course[] cs) {
}
}
私が非常に混乱したのは、サーバーがPOST/DELETEメソッドに応答しない一方で、GETメソッドが正常に機能することです。ところで、私はクライアント側でRestTemplateを使用しています。例外は次のとおりです。
Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 403 Forbidden
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.Java:91)
at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.Java:574)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.Java:530)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.Java:487)
at org.springframework.web.client.RestTemplate.delete(RestTemplate.Java:385)
at hello.Application.createRestTemplate(Application.Java:149)
at hello.Application.main(Application.Java:99)
私は数日間インターネットを検索しました。まだ手がかりがありません。助けてください。本当にありがとう
この問題は、おそらく CSRF保護 が原因です。ユーザーがWebブラウザーでアプリケーションを使用しない場合は、 CSRFを無効にしても安全です 保護。それ以外の場合は、 要求にCSRFトークンを含める を確認する必要があります。
CSRF保護を無効にする には、次を使用できます。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig
extends WebSecurityConfigurerAdapter implements ApplicationContextAware {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.csrf().disable();
}
@Override
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception {
authManagerBuilder
.inMemoryAuthentication()
.withUser("user").password("password").roles("ADMIN");
}
}
「ヘッダー」を介して送信するトークンを確認し、そのトークンが存在するかどうかにかかわらず、データベースで同じトークンをクエリします。
注:上記は、Spring Bootトークン認証メカニズムを使用している場合にのみ適用されます。