前提・実現したいこと
現在、以下の条件で作成していますが、上手くいかないのでアドバイスをいただきたいです。
・管理用ログイン画面と通常ログイン画面がある
・ログイン成功するとそれぞれ通常TOP画面・管理TOP画面に移動する。
・管理権限アカウントは両方の画面にログインできる。他権限は通常ログイン画面のみログイン可能
発生している問題・エラーメッセージ
管理画面側で非管理権限ログインすると、ログイン成功して通常TOP画面に移動してしまう。
これをログイン失敗するようにしたい。
(追加)管理画面側でログアウトすると通常のログイン画面に移動してしまう。
これも管理側ログイン画面に移動するようにしたい。
該当のソースコード
java
1//管理画面コンフィグ 2@EnableWebSecurity 3@Order(1) 4public class AdminSecurityConfig extends WebSecurityConfigurerAdapter { 5 6 @Override 7 protected void configure(HttpSecurity http) throws Exception { 8 9 http 10 .antMatcher("/admin/**") 11 .authorizeRequests() 12 .antMatchers("/admin/login").permitAll() 13 .antMatchers("/admin/**").hasAuthority("管理者") 14 .anyRequest().authenticated() 15 .and() 16 .formLogin() 17 .loginProcessingUrl("/admin/login") //ログイン処理のパス 18 .loginPage("/admin/login") //ログインページ 19 .failureUrl("/admin/login?error") //ログインエラー時の遷移先 ※パラメーターに「error」を付与 20 .defaultSuccessUrl("/admin/admin_top", true) //ログイン成功時の遷移先 21 .usernameParameter("roginID") //ログイン時のキー:名前 22 .passwordParameter("password") //ログイン時のパスワード 23 .and() 24 .logout() 25 .logoutSuccessUrl("/admin/login"); //ログアウト時の遷移先 POSTでアクセス 26 } 27 @Bean 28 PasswordEncoder passwordEncoder() { 29 //BCryptのエンコーダを返す 30 return ConstantClass.PASSWORD_ENCODER; 31 } 32} 33 34//通常ログインコンフィグ 35@EnableWebSecurity 36@Order(2) 37public class UserSecurityConfig extends WebSecurityConfigurerAdapter { 38 39 @Override 40 protected void configure(HttpSecurity http) throws Exception { 41 42 http 43 .authorizeRequests() 44 .antMatchers("/login").permitAll() //「login.html」はログイン不要でアクセス可能に設定 45 .anyRequest().authenticated() //上記以外は認証完了したユーザー 46 .and() 47 .formLogin() 48 .loginProcessingUrl("/login") //ログイン処理のパス 49 .loginPage("/login") //ログインページ(このページから、上記パスへ移動が発生した場合に判定 50 .failureUrl("/login?error") //ログインエラー時の遷移先 ※パラメーターに「error」を付与 51 .defaultSuccessUrl("/XXXXX/XXXXX_top", true) //ログイン成功時の遷移先 52 .usernameParameter("roginID") //ログイン時のキー:名前 53 .passwordParameter("password") //ログイン時のパスワード 54 .and() 55 .logout() 56 .logoutSuccessUrl("/login"); //ログアウト時の遷移先 POSTでアクセス 57 } 58} 59 60//UserDetailsService 61@Service 62public class LoginUserDetailsService implements UserDetailsService { 63 64 @Autowired 65 UserInfoMapper userInfoMapper; 66 67 @Override 68 public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException { 69 70 //ユーザー名が存在するか通常検索 71 UserEntity userEntity = userInfoMapper.selectByName(name); 72 73 //該当レコードが取得できなかった場合はエラーにする 74 if (userEntity == null) { 75 throw new UsernameNotFoundException(""); 76 } 77 78 //ログインユーザー権限を設定 79 String role = userEntity.XXXX; 80 return new LoginUserDetails(userEntity, role); 81 } 82}
thymeleaf
1// /admin/admin_top.html(管理側TOP画面) 2<form role="form" id="logout" th:action="@{/logout}" method="post"> 3 <button type="submit">ログアウト</button> 4</form>
試したこと
・管理側コンフィグで「管理者権限のみログイン成功」する設定を探したが、「ログイン後のアクセス権」に関する内容しか見つからなかった。
・UserDetailsServiceを複数用意して管理側は権限判定をつけようと思い、以下のサイト等を調べたが結局よくわからない状態。
https://qiita.com/5zm/items/f915245588cbe016f62c
(こちらの環境ではspring-security.xmlが無かったため実施不可)
補足情報(FW/ツールのバージョンなど)
Java 11
Eclipse 4.19.0
Spring Boot 2.5.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/04 05:52
2021/06/04 07:43
2021/06/07 01:34