Spring Security での無効なロール チェックの解決
Spring Security では、承認を構成すると予期しないロール チェックが発生する場合があります。提供されているコード スニペットで強調表示されている問題に対処しましょう:
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // ... auth .jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery("select username, password, 1 from users where username=?") .authoritiesByUsernameQuery("select users_username, roles_id from roles_users where users_username=?") .rolePrefix("ROLE_"); } @Override protected void configure(HttpSecurity http) throws Exception { // ... http .csrf().disable(); http .httpBasic(); http .authorizeRequests() .anyRequest().authenticated(); http .authorizeRequests() .antMatchers("/users/all").hasRole("admin") .and() .formLogin(); http .exceptionHandling().accessDeniedPage("/403"); }
問題:
「USER」ロールのみを持つユーザーがログインすると、 「管理者」ロールによって保護されているリソースにアクセスします。問題は、「users」テーブルのユーザー名列の主キー制約にあります。
解決策:
指定されたクエリ "select username,password , 1 from users where username=?" は、ユーザーのロールに関係なく常に 1 行を返すため、不適切です。これにより、データベースで付与されていない場合でも、ユーザーは希望する任意のロールを引き受けることができます。
これに対処するには、ユーザーのロールを返すようにクエリを更新する必要があります。
.usersByUsernameQuery("select username, password, role from users where username=?")
追加の注意:
認可設定内のマッチャーの順序は重要です。次のマッチャー "anyRequest().authenticated() は、認証されたユーザーのみがアプリケーションにアクセスできるようにするために、antMatchers("/users/all").hasRole("admin") の前に置く必要があります。
以上がデータベースロールの割り当てにもかかわらず、Spring Security のロールベースのアクセス制御が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。