私は、次のような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つのログインページがあることを意味します管理者。
管理セクションを除いて、コードは正常に機能しているようです。機能しませんが、アクセス拒否の例外を返します。
問題はルールの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")