yuusuke-roughの日記

Java,SpringBoot,趣味等

Spring Security 6.0.1にバージョンを変更した話

はじめに

いろいろ考え事があって本調子じゃない年末。少しだけ学習。

 

特定のURLの認可処理を実装していたところ、Spring Securityのドキュメントのバージョンが6.0.1である事に気づく。

WebConfigurerAdapter等が廃止され、起動もできなくなった。

 

今回は、上記問題の解決から始める。

内容

Spring Boot 3.0.0

Spring Security 6.0.1

 

JDKのバージョン変更

Spring Boot 3.0.0にはJava17が必要。

Java11からJava17へ切り替える。

Java 複数バージョン切り替え方法 - Qiita

 

 

②Spring BootのバージョンとSpring Security変更

pom.xmlにてSpring Boot 3.0.0、Spring Security 6.0.1に変更も...

 

dependencies.dependency.version' for org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar is missing.
    - プロジェクト・ビルド・エラー: 'dependencies.dependency.version' for org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar is 
     missing.

 

https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity6

Spring Securityのバージョンごとにthymeleaf-extras-springsecurityが対応しているのでthmeleaf-extras-springsecurityに変更。

 

③各ファイル修正

 

参考

Spring Security 5.7でセキュリティ設定の書き方が大幅に変わる件 - Qiita

SpringBoot 2.7 to 3.0 メモ - Qiita

Spring Boot 3.0 (Spring Framework6.0) へのアップデートで対応したこと - Qiita

 

1.importしているパッケージ名の変更

javax → jakarta

背景:JavaEEとJakartaEE、どう違うの? - Qiita

 

2.Spring Security変更点

 

AccessDecisionVoter、AccessDecisionManager、UnanimousBased、WebExpressionVoterが非推奨

WebSecurityConfigurerAdapterの廃止

 

Spring Security without the WebSecurityConfigurerAdapter

Authorize HttpServletRequests with AuthorizationFilter :: Spring Security

 

authorizeHttpRequestsに変更

Spring Securityのリファレンスにて下記のような改善が行われたとの事

  1. Uses the simplified AuthorizationManager API instead of metadata sources, config attributes, decision managers, and voters. This simplifies reuse and customization.

  2. Delays Authentication lookup. Instead of the authentication needing to be looked up for every request, it will only look it up in requests where an authorization decision requires authentication.

  3. Bean-based configuration support.

 

コードの書き方は下記

Spring Security - Lambda DSL

Spring Security: Upgrading the Deprecated WebSecurityConfigurerAdapter | Baeldung

AuthenticationManagerBuilderもUserDetailsManagerかUserDetailsServiceコンポーネントを定義するとある

 

....あれDAOAuthenticationProviderのBeanを設定して

@Bean
    public DaoAuthenticationProvider authProvider() {
        CustomAuthenticationProvider authProvider = new CustomAuthenticationProvider();
        authProvider.setUserDetailsService(userdetailservice);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

 

AuthenticationManagerBuilder使わなくていいの?

DAOAuthenticationProviderを勝手に追加してくれてる...?

...後日追記予定

 

修正し起動

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/SpringApplication has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

 

java -versionとjavac -version共にJava 17だが...

 

コンソール上はAdoptOpenJDK¥jdk-11.0.11.9...になっていた。

STSの実行環境を確認すると上記設定と一致。

 

手順は実行の構成→該当のプロジェクト→JRE→環境→インストール済みのJRE

で、ロケーションを追加した。

 

⑤動くけど...

Application shutdown requested.

...

Stopping service [Tomcat]

...

The web application [ROOT] appears to have started a thread named [HikariPool-6 housekeeper] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

java.base@17.0.5/jdk.internal.misc.Unsafe.park(Nativ Method)

java.base@17.0.5/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
 java.base@17.0.5/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1672)
 java.base@17.0.5/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
 java.base@17.0.5/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
 java.base@17.0.5/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1062)
 java.base@17.0.5/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1122)
 java.base@17.0.5/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
 java.base@17.0.5/java.lang.Thread.run(Thread.java:833)

がでた。

 

sun.misc.Unsafe#parkって何? - スティルハウスの書庫の書庫

スレッドをブロック...触れた事のないお話...

 

HikariPool-6 housekeeperがメモリリークのような状態にある?

Spring Boot で HikariCP のコネクションリークを調べる - Qiita

 

「HikariPool but has failed to stop it.」 で検索するとTomcatの仕様で出力される・プロセス停止辞典でメモリ開放はできているとのため、ひとまず、この問題は置いておく。

 

 

感想

焦ったのは④と⑤。

Java17で設定しているのにエラーがでたので、実行環境かなと直感は働いた。

しかし、具体的な設定方法がわからず、STSの中を探し見つけたときは嬉しかった。

 

SpringSecurity自体は設定後に一発で動いたのでよし。

 

⑤については現状対処不要ですが、

HikariPoolについてやメモリリークが本当に起こった場合の特定と解決方法については、とても興味がある。

 

今、学習しなくてはいけない事を改めてまとめると...

①基本情報等の知識→「マスタリングTCP/IP 入門編」に絞って隙間時間に学習中

②DB→「達人に学ぶDB設計」でテーブル見直し完了・パフォーマンス等は現時点で検証不可のため保留

SQL→1月予定

JavaScriptフレームワーク→1月予定

⑤Git→プライベートリポジトリで活用中・誤った理解がないか「サル先生のGit入門」で都度補完

ExcelVBA→早くて1月

-------以下、趣味で必要な分野(習得期間未定)-------

⑦JavaGold

AWS

⑨SpringBoot

メモリリークやエラーに対する対策とトラブルシューティング

⑪HTML、CSS、BootStrap

-------余裕のある時-------

アプリ開発

アルゴリズム

 

退職したら、①~⑥最優先に切り替える。

今までの学習方針からは一転して、その目安は、「基本の理解を速く、手を動かして行う」。

理由としては、場数で身につく世界と思うので、場数をこなせる前提条件を整える事が最優先に思えた。そのために、速さを意識して学習する。

 

 

全然関係ない話

FFUSAのボスバトルBGMのメタルアレンジが疾走感あって好き。というか、ただただ懐かしい。

そういえば、妹夫婦からギターするように言われているけれど、二人と違ってバンド経験ないし、まず指が動くレベルまで到達していない。アコギで自分ペースにポロポロ弾いてるのが好きなレベル。

最近してなかったけれど、気持ちが沈む時はプログラミングに加えて、絵描いたり、ギター練習するのも良さそう。しかし、運動、数学、読書といい、気持ちが落ち着くのって学校の科目らしい。

 

ゲームは誘われてする分には楽しいから好き。けど、一人の場合はコツを掴んでしまうと、どのタイトルも時間に対する実力の伸び具合の天井が見えて、そのためにプレイする意味を見出せなくなる。感情的な楽しさ。

対して、プログラミングや数学は時間かかるけど、血のめぐるような達成感がある。

後者は岡潔の言う情緒というものに近いと思う。

道半ばなので、「近い何か」としか言えない。

数学かなり忘れちゃったけど、確率を勉強してて思う。

 

旧ハンターのセル画いいなと思いました。

重厚感というか暗さがある。「太陽は夜も輝く」とか。