質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

5958閲覧

SpringBootでログイン画面を二つ作りたい。

nakamaro

総合スコア8

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/06/03 07:29

編集2021/06/04 06:15

前提・実現したいこと

現在、以下の条件で作成していますが、上手くいかないのでアドバイスをいただきたいです。
・管理用ログイン画面と通常ログイン画面がある
・ログイン成功するとそれぞれ通常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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考にされたサイトにある通り、管理画面用のアプリと通常用のアプリを別のアプリとして作製し、
認証に使用するテーブルを共通で参照するのが早そうな気がします。

UserDetailsServiceを設定する方法は、以下のサイトに記載されていたので参考になるかと思います。

https://b1tblog.com/2020/02/17/spring-security-3/

UserDetailsServiceを複数用意する以外にも、AuthenticationProviderを複数用意する方法も考えられます。

Java

1 @Override 2 protected void configure(final AuthenticationManagerBuilder auth) throws Exception { 3 auth.authenticationProvider(this.adminAuthenticationProvider()); 4 } 5 6 @Bean 7 protected AuthenticationProvider adminAuthenticationProvider() { 8 return new AdminAuthenticationProvider(); 9 } 10

Java

1 public class AdminAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { 2 @Override 3 protected void additionalAuthenticationChecks(UserDetails userDetails, 4 UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 5 } 6 7 @Override 8 protected UserDetails retrieveUser(String username, 9 UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 10 } 11 } 12

投稿2021/06/03 08:23

Luice

総合スコア771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamaro

2021/06/04 05:52

ありがとうございます。 参考サイトを見て各コンフィグクラスにconfigreメソッドを追加してそれぞれに合わせたUserDetailsServiceを指定するとできました。 ```java @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //引数はそれぞれに合わせて改造したUserDetailsService auth.userDetailsService(adminUserDetailsService); } ``` しかし今度は管理側でログアウトすると管理ログイン画面でなく通常ログイン画面に移動してしまいます。 こちらも何か解決法を知っていれば教えてくれませんか。
Luice

2021/06/04 07:43

当然ですが、ログアウトのURLも2つ(管理画面側、通常側)用意していますよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問