macha_7
@macha_7

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【SpringSecurity】ログイン認証状況取得 より良い方法はないか

ログイン認証取得でプチはまりしたので投稿します。

相談内容

  1. より良いログイン状況の取得方法はないでしょうか
  2. ログイン情報について参考になる記事などあればコメントお願いいたします

やりたいこと

SpringSecurity でログイン判定したい

こちらの記事
Spring Security 使い方メモ 認証・認可
にログイン認証済みかどうかは下記で取得できるとあったが、動かしたところログアウトしていても"true"が返ってきた。

import org.springframework.security.core.context.SecurityContextHolder;
...
Boolean login = 
    SecurityContextHolder.getContext().getAuthentication().isAuthenticated();

自分で試したこと

とりあえずログアウト・ログイン時の Authentication の値を確認

SecurityContextHolder.getContext().getAuthentication();

■ログアウト

AnonymousAuthenticationToken [
	Principal=anonymousUser, 
	Credentials=[PROTECTED], 
	Authenticated=true, 
	Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, 
	SessionId=95E129BF93F697FF3F30921ECC94D420], 
	Granted Authorities=[ROLE_ANONYMOUS]
]

.getName()の返り値 ... anonymousUser

■ログイン中 ユーザ名:test@test

UsernamePasswordAuthenticationToken [
	Principal=org.springframework.security.core.userdetails.User [
		Username=test@test, 
		Password=[PROTECTED], 
		Enabled=true, AccountNonExpired=true, 
		CredentialsNonExpired=true, 
		AccountNonLocked=true, 
		Granted Authorities=[ADMIN]
	], 
	Credentials=[PROTECTED], 
	Authenticated=true, 
	Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, 
	SessionId=95E129BF93F697FF3F30921ECC94D420], 
	Granted Authorities=[ADMIN]
]

.getName()の返り値 ... test@test

解決策1:getNameした値が"anonymousUser"かどうかで判定

// ログイン状況取得
String email = SecurityContextHolder.getContext().getAuthentication().getName();
 if (!email.equals("anonymousUser")) {
	// ログイン中
} else {
	// 未ログイン
}

解決策2:Authentication が AnonymousAuthenticationToken のインスタンスかどうかで判定する。

@gongoro さんにコメントいただき追記しました。こちらを採用することにします!

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
    // ログイン中
    auth.getName(); // ユーザネームの取得 
    ...
}

その他

ログアウト時にセッションを削除する方法があるみたい(今度追記します。)

参考

  1. Spring Security 使い方メモ 認証・認可
  2. SecurityExpressionOperations (spring-security-docs API) - Javadoc
  3. https://stackoverflow.com/questions/26101738/why-is-the-anonymoususer-authenticated-in-spring-security
  4. https://spring.pleiades.io/spring-security/reference/servlet/authentication/anonymous.html
0

isAuthenticated()がtrueになってしまう件については、stackoverflowで同様の質問がありました。
https://stackoverflow.com/questions/26101738/why-is-the-anonymoususer-authenticated-in-spring-security
spring-securityの匿名認証の機能がデフォルトの動作に関わっているようです。
https://spring.pleiades.io/spring-security/reference/servlet/authentication/anonymous.html

なお、上記のstackoverflowでは、AnonymousAuthenticationTokenのインスタンスかどうか等で認証状況を取得する方法が紹介されておりました。

2Like

Your answer might help someone💌