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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

6783閲覧

【spring boot】Spring Securityで権限チェックがしたい

k499778

総合スコア599

Java

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2018/01/29 09:01

編集2018/01/29 13:02

現在spring bootでwebアプリの開発を行っています。spring securityによる権限チェックを行いたくて以下のサイトを参考にしています。
http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/web/role.html

先に結論から言うと、

LoginUserServiceクラスのloadUserByUsernameメソッドの戻り値UserDetailオブジェクトはどのように取得するのでしょうか?

UserControllerクラスでAuthenticationオブジェクトとして受け取っているような記述はあるのですが、肝心の受け渡しがどこで行われているのか説明がありません。

・暗黙的に行われているのか
・明示的に書く必要があるのか
・LoginUserService.loadUserByUsername()をログイン画面表示時のコントローラーで明示的に呼び出す必要があるのか
・WebSecurityConfigクラス内で特別な記述をするのか

色々と試してみましたが、
UserControllerクラスに値を受け渡すことができませんでした。Authenticationオブジェクトは常にnullでした。

もしわかる方がいらっしゃれば、
UserControllerクラスへの値を受け渡し方をお教えください。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

java

1SecurityContext context = SecurityContextHolder.getContext(); 2Authentication authentication = context.getAuthentication(); 3Object principal = authentication.getPrincipal();

取得ってこっちのこと?

投稿2018/01/29 12:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

k499778

2018/01/29 13:06

回答ありがとうございます。 この記述は上に書いた参考にしているサイトには見当たりませんでしたが、 このような記述がいるということなのでしょうか?その場合どこに書くのでしょうか? 一応取得といっていたのは、UserControllerクラスの String userId = authentication.getName(); でidが取れてくるようにしたいという意味です。 authenticationが現状nullなので。
退会済みユーザー

退会済みユーザー

2018/01/29 14:20

ああこれは認証済みのユーザー情報の取得ですよ
k499778

2018/01/29 16:28

返答ありがとうございます。 認証に成功したらとくにLoginUserService.loadUserByUsername()を明示的に呼び出さなくても 暗黙的に呼び出されるのでしょうか? なおその値は画面遷移が何度か行われても保持し続けられるのでしょうか?
k499778

2018/01/29 16:31

現状hichonさんの方でも書かせていただいた通り、WebSecurityConfigクラスでthymeleafのname属性とひも付けています。 私としては認証成功しているつもりなのですが、loadUserByUsername()が呼ばれることはありません。デバッグで確かめました。 何が足らないと考えられるでしょうか?
退会済みユーザー

退会済みユーザー

2018/01/29 22:08

私が記述している2行目は、 public String user2(Authentication authentication) で設定されているものと同じ立ったりしますけどね。 (引数で多くとられるがうじゃったいw) 一度ログインしたらセッションに保存されますよ・
退会済みユーザー

退会済みユーザー

2018/01/29 22:10

ちなみに「Object principal 」に入る値が認証した UserDetails を継承したオブジェクトになります
k499778

2018/01/29 22:58

回答ありがとうございます。 asahina1979さんが記述してくださった3行は、リンク先のコードでは特に記述する必要はなく、本来ならpublic String user2(Authentication authentication) の部分で行われるはずだという解釈で合っていますでしょうか。 じゃあ何が足りないんだろ> <
退会済みユーザー

退会済みユーザー

2018/01/29 23:03

引数を無尽蔵に増やしていくのに抵抗がなければ Spring側が自動的に設定してくれるんですけどね。(引数が・・・)
退会済みユーザー

退会済みユーザー

2018/01/29 23:21

ちなみに、 principal(ユーザー情報)がnullなのが未認証なので Authentication が nullならセキュリティの設定がうまくされてないキがする。
退会済みユーザー

退会済みユーザー

2018/01/29 23:22

1.5.9 で実装しているなら 1.5.8でためしてみるのもいいよ。
k499778

2018/01/29 23:43

セキュリティの設定ですか。 1.5.9はspring bootのバージョンでしょうか?そこはチーム共通なので簡単には変えられそうにないです。> < WebSecurityConfigクラスの実装で何か足りていないといったことは考えづらいでしょうか?
k499778

2018/01/29 23:44

// フォーム認証 http.formLogin() // 認証パス .loginProcessingUrl("/login") // ログインフォーム表示用のパス設定 .loginPage("/loginForm") // 認証失敗時のパス .failureUrl("/loginForm?error") // 認証成功時のパス .defaultSuccessUrl("/", true) // ユーザ名のリクエストパラメータ .usernameParameter("id") // パスワードのリクエストパラメータ .passwordParameter("password"); このようにlogin.htmlのname属性とは紐付けているのですが。 参考 http://springboot-domamaster-maintenance-sample.readthedocs.io/ja/latest/05-spring_security.html
k499778

2018/01/30 08:45

一応解決しました。 参考サイトの public String user3(@AuthenticationPrincipal User user) { のやり方だとUserオブジェクトに値が入ってきました。 public String user(Authentication authentication) { にすると取れませんでした。 原因はよくわかっていませんが、 とりあえずなんとかなりました。 ご協力いただきありがとうございました。 まだまだログインは独自実装にしたいなどやりたいことはありますが、この問題に関しては解決したのでclose致します。
guest

0

loadUserByUsernameクラスの中で、org.springframework.security.core.userdetails.Userを以下のように生成して、返して下さい。
つnew User(username, password, authorities)

追記
認証が成功すると、UserControllerクラスの対応するMethodが呼ばれます。
そこで、Userに設定したusernameやauthoritiesを取り出します。

投稿2018/01/29 12:50

編集2018/01/29 13:16
hichon

総合スコア5737

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

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

k499778

2018/01/29 13:02

回答ありがとうございます。 そこに関してはそのように記述しているのですが、問題はそのUserオブジェクトがどのように取得すればいいかということなのです。暗黙的に設定されており、UserControllerクラスで取得できそうなものなのですが、現状できていないので何かが足りていないのかなと思っています。もしご存知であれば教えていただきたいです。
hichon

2018/01/29 13:17

追記しました。
k499778

2018/01/29 16:25

では今取れてきていないということは認証が成功していないということですね。 逆にそっちが問題なのか。。。 一応WebSecurityConfigクラスでthymeleafのname属性と合わせた名前にしました。 // フォーム認証 http.formLogin() // 認証パス .loginProcessingUrl("/login") // ログインフォーム表示用のパス設定 .loginPage("/loginForm") // 認証失敗時のパス .failureUrl("/loginForm?error") // 認証成功時のパス .defaultSuccessUrl("/", true) // ユーザ名のリクエストパラメータ .usernameParameter("id") // パスワードのリクエストパラメータ .passwordParameter("password"); 何が足りないんでしょうか?hichonさん、もし何かお気付きの点やご経験などございましたら教えていただけると大変ありがたいです。 参考 http://springboot-domamaster-maintenance-sample.readthedocs.io/ja/latest/05-spring_security.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問