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

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

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

解決済

thymeleafのlayoutファイルをログインしていないときにも読み込めるようにしたい

k_java_beginner
k_java_beginner

総合スコア12

1回答

0評価

0クリップ

228閲覧

投稿2022/07/21 05:56

前提

Spring bootでWEBアプリを作成しています。

thymeleafのth:fragmentを使って共通部分をまとめているのですが、
ログイン中でないとlayoutが適用されません。

SecurityConfigでlayoutファイルが認証時以外にも読み込まれるようにしたいのですが、
うまく設定できていない状況です。

実現したいこと

ログイン時以外でもlayoutファイルが読み込まれるようにしたい

WebSecurityConfig.java

java

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.formLogin(login -> login .loginProcessingUrl("/login") .loginPage("/login") .defaultSuccessUrl("/top", true) .failureUrl("/login?error") .permitAll() ).logout(logout -> logout .logoutSuccessUrl("/login") ).authorizeHttpRequests(authz -> authz .antMatchers("css/**", "js/**") .permitAll() .mvcMatchers("/") .permitAll() .mvcMatchers("/register") .permitAll() .mvcMatchers("/validate") .permitAll() .anyRequest().authenticated() ); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

layout.html

html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <title layout:title-pattern="$CONTENT_TITLE | $LAYOUT_TITLE">DigTweet</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" th:href="@{/css/style.css}"> </head> <body> <div layout:replace="~{layout/header::header}"></div> <main> <div layout:fragment="content"></div> </main> <div layout:replace="~{layout/footer::footer}"></div> </body> </html>

ディレクトリ構成

. ├── java │ ├── com │ │ ├── application │ │ │ ├── myapp │ │ │ │ ├── config │ │ │ │ │ └── WebSecurityConfig.java(おそらくこのファイルの設定が原因) │ │ │ │ ├── controller │ │ │ │ │ ├── AnalyticsController.java │ │ │ │ │ ├── AuthController.java │ │ │ │ │ ├── IndexController.java │ │ │ │ │ └── MemoCRUDController.java │ │ │ │ ├── entity │ │ │ │ │ ├── Memo.java │ │ │ │ │ ├── TmpUser.java │ │ │ │ │ └── User.java │ │ │ │ ├── form │ │ │ │ │ └── UserForm.java │ │ │ │ ├── repository │ │ │ │ │ ├── MemoRepository.java │ │ │ │ │ ├── TmpUserRepository.java │ │ │ │ │ └── UserRepository.java │ │ │ │ ├── service │ │ │ │ │ ├── AnalyticsService.java │ │ │ │ │ ├── MemoCRUDService.java │ │ │ │ │ └── UserService.java │ │ │ │ ├── utility │ │ │ │ │ ├── .DS_Store │ │ │ │ │ ├── CreateMail.java │ │ │ │ │ ├── FrequencyList.java │ │ │ │ │ ├── LDTFormatter.java │ │ │ │ │ ├── RandomMessage.java │ │ │ │ │ ├── SentiScoreMap.java │ │ │ │ │ ├── TargetSplit.java │ │ │ │ │ └── UpdateUserContext.java │ │ │ │ ├── .DS_Store │ │ │ │ └── Application.java │ │ │ └── .DS_Store │ │ └── .DS_Store │ └── .DS_Store ├── resources │ ├── files │ │ ├── .DS_Store │ │ ├── LEngineer-Regular.otf │ │ └── pn.csv.m3.120408.trim │ ├── static │ │ ├── css │ │ │ └── style.css │ │ └── js │ │ └── dialog.js │ ├── templates │ │ ├── analytics │ │ │ └── analytics.html │ │ ├── auth │ │ │ ├── login.html │ │ │ ├── register_result.html │ │ │ └── register.html │ │ ├── contact │ │ │ └── contact.html │ │ ├── crud │ │ │ ├── archive.html │ │ │ ├── create.html │ │ │ ├── edit.html │ │ │ └── search.html │ │ ├── home │ │ │ └── home.html │ │ ├── layout(このフォルダ直下の3つのファイルを読み込みたい) │ │ │ ├── footer.html │ │ │ ├── header.html │ │ │ └── layout.html │ │ ├── mypage │ │ │ └── mypage.html │ │ ├── top │ │ │ └── top.html │ │ └── .DS_Store │ ├── .DS_Store │ └── application.yml └── .DS_Store.

試したこと

的外れかもですが、、、

・antMatcher内に「"layout/"」「"../templates/layout/"」「"../templates/layout/layout"」などと記載を試みる
・layoutフォルダをtemplatesからstaticに移動

などを試しましたが、解決せずでした。

補足情報(FW/ツールのバージョンなど)

openjdk version "17.0.3"
springframework.boot version '2.7.0'

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

k_java_beginner

2022/07/27 00:25

調べたところ、thymeleafのlayoutファイル自体は読み込まれているようでした。 ただ、cssやjsといった静的ファイルが、おそらくconfigの設定が原因で読み込まれていないようです。 https://www.docswell.com/s/MasatoshiTada/KGVY9K-spring-security-intro#p19 上記スライドを参考に、WebSecurityConfigの .antMatchers("css/**", "js/**") .permitAll() の部分を下記のように書き換えました。 .requestMatchers(PathRequest.toStaticResources().atCommonLocations()) .permitAll() がしかし、下記のエラーが出ています。 The method requestMatchers(RequestMatcher...) in the type AbstractRequestMatcherRegistry<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizedUrl> is not applicable for the arguments (StaticResourceRequest.StaticResourceServerWebExchange)Java(67108979) 引数の指定の仕方などが違うのかと思ったのですが、何を入れていいやらさっぱりわからず、、、 どなたかご助言いただけますと幸いです。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る