Spring Bootアプリを開発し、ユーザーがメッセージを読めるようにするためのAPIを作成しています。URLの1つは次のとおりです。
/users/USER1/messages
さて、私は明らかに、認証されたユーザーだけがこのgetリクエストのコンテンツにアクセスできるようにしたいのです。しかし、認証されたすべてのユーザーだけでは不十分です。また、ユーザー名を持つユーザーのみがここで実際のコンテンツを表示できるようにし、残りは403ステータスを受け取る必要があります。Spring Security configなしでそれを行う方法を理解しました(私のサービスでは、ログインしたユーザー名をチェックし、URLのパラメーターと比較して、等しい場合にのみ続行します)が、もっと簡単な方法があるはずだと思いますSecurityConfigurationだけを使用していますか?私の現在の構成は次のようになります。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/users/**").authenticated()
.antMatchers("/h2-console/*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
http.csrf().disable();
http.headers().frameOptions().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("superman").password("superman").roles("USER")
.and()
.withUser("admin").password("admin").roles("ADMIN");
}
}
編集:メソッドセキュリティ式を提案する次の回答私はそれを使用しましたが、それでも機能しないようです(USER2として認証されている場合でも、USER1のメッセージを読むことができます)。これが、PreAuthorizeアノテーションを追加したコントローラーです。
@RequestMapping(method = RequestMethod.GET, value = "/messages", produces = {"application/json"})
@ResponseBody
@PreAuthorize("#userHandle == authentication.name")
public List<Message> getMessages(@PathVariable("userHandle") String userHandle,
@RequestParam(value="search", defaultValue="") String search) {
//todo: change to return DTO not model
return messageFacade.getMessages(userHandle, search);
}
EDIT2:承認された回答のコメントのように、@ EnableGlobalMethodSecurity(prePostEnabled = true)をセキュリティ構成に含める必要があります。それが含まれると、すべてが正常に機能しています。
Springメソッドセキュリティが必要だと思います。ドキュメントの例は、ほとんど文字通りあなたの場合です。
import org.springframework.data.repository.query.Param;
...
@PreAuthorize("#n == authentication.name")
Contact findContactByName(@Param("n") String name);
PS:忘れないでください@EnableGlobalMethodSecurity
!こちらのチュートリアルをご覧ください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加