Java

thymeleaf-extras-springsecurity のsec:authorize="hasRole('ロール名')" でどのロールでも要素が表示されてしまう

Spring Securityで、ログインしているロールごとに表示する要素を変えたい場合、thymeleaf-extras-springsecurityというartifactを使うことでview側で簡単に制御できます。
調べたとおり、以下の用に依存を書いて、

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>

Thymeleafのテンプレートで以下のように書いてみます。もちろん「でたらめなロール」は存在しないロールなので表示されないことを期待しています。

<div sec:authorize="hasRole('ROLE_SAMURAISM_ADMIN')">This is Admin</div>
<div sec:authorize="hasRole('ROLE_SAMURAISM_EMPLOYEE')">This is employee</div>
<div sec:authorize="hasRole('ROLE_SAMURAISM_でたらめなロール名')">デタラメ</div>

さて、表示してみると、あれ?

「デタラメ」が表示されてしまいました。

GitHubのreadmeを見てみると
thymeleaf-extras-springsecurity3はSpring Security 3.x用、
thymeleaf-extras-springsecurity4は4.x用、
thymeleaf-extras-springsecurity5は5.x用、
とのことでした。使っているSpring Bootのバージョンは2.4.2、/Securityのバージョンは5.4.2だったので、thymeleaf-extras-springsecurity4ではなくてthymeleaf-extras-springsecurity5を使うべきでした。

最後の数字を間違えてもバージョン番号は同じものが用意されており、さらに例外も発生しないのでちょっとはまりどころですね。

以下のように修正することで正常に動作しました。

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>