web-dev-qa-db-ja.com

Springセキュリティの複数のantMatcher

私は、次のような5つのantMatchersを持つコンテンツ管理システムに取り組んでいます。

http.authorizeRequests()
        .antMatchers("/", "/*.html").permitAll()
        .antMatchers("/user/**").hasRole("USER")
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/admin/login").permitAll()
        .antMatchers("/user/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .csrf().disable();

これは、訪問者はルートパス(/ *)のすべてのサイトを表示でき、ユーザーは(/ user)のみを表示でき、管理者は(/ admin)のみを表示でき、ユーザー用とログイン用の2つのログインページがあることを意味します管理者。

管理セクションを除いて、コードは正常に機能しているようです。機能しませんが、アクセス拒否の例外を返します。

33

問題はルールのorderにあると思います:

.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()

ルールの順序が重要であり、より具体的なルールが最初に行く必要があります。 /adminで始まるすべてのものは、/admin/loginパスであっても(/admin/loginはすでに/admin/**ルールと一致しているため、2番目のルールは無視されます)。

したがって、ログインページのルールは/admin/**ルールの前に配置する必要があります。例えば。

.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
62