Q&A
前提
Springsecurity5を使用していて、
mvcMatchers("/admin").hasAuthority("ROLE_ADMIN")を指定しましたが、
ROLE_ADMIN権限のついたユーザーのみ/adminに遷移させたい
(現在、どのユーザーも403に遷移する)
「ROLE_ADMINの権限の付与されていたら」
「"ROLE_ADMIN" のロールを持つユーザーに制限」
をかける方法としてmvcMatchers("/admin").hasAuthority("ROLE_ADMIN")記事が載っていたのですが、そもそもロールや権限の付与はどのように行うのでしょうか。
data.sqlのauthorityにROLE_ADMINがあれば、権限を付与されているのでは?と思っているのですが、遷移されません。この考え方が違うのでしょうか。
発生している問題・エラーメッセージ
エラー文は出ず、403に遷移する
該当のソースコード
@EnableWebSecurity public class SecurityConfig{ @Autowired UserDetailsService userDetailsService; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.formLogin(login -> login .loginProcessingUrl("/login").loginPage("/login") .defaultSuccessUrl("/") .failureUrl("/login").permitAll() .usernameParameter("username").passwordParameter("password") ).logout(logout -> logout .logoutSuccessUrl("/") ).authorizeHttpRequests(authorize -> authorize .requestMatchers(PathRequest.toStaticResources() .atCommonLocations()).permitAll() .mvcMatchers("/").permitAll() .mvcMatchers("/edit").permitAll() .mvcMatchers("/admin").hasAuthority("ROLE_ADMIN") .anyRequest() .authenticated() ); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
data.sql
1INSERT INTO user(username, password, authority) 2VALUES('admin', 'passが入ってます', 'ROLE_ADMIN'), 3('user', 'passが入ってます', 'ROLE_USER');
schema.sql
1DROP TABLE IF EXISTS user; 2 3CREATE TABLE user 4( 5 id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 6 username VARCHAR(100) NOT NULL UNIQUE, 7 password VARCHAR(100) NOT NULL, 8 authority VARCHAR(100) 9); 10
試したこと
「ROLE_ADMINの権限の付与されていたら」
「"ROLE_ADMIN" のロールを持つユーザーに制限」
で調べて、値をauthorityに変更
「ADMIN」を「ROLE_ADMIN」に変更
補足情報(FW/ツールのバージョンなど)
java11
Spring4
MyBatis
MySQL