概要
権限によって、アクセス可能なページを制限する機能の実装します。
管理者画面を作成し、権限によって画面の出し分けを行います。
前提
- #1~ ログイン画面の実装が完了していること。
- 管理者画面の追加はSpringBootチュートリアルを元に行います。
実装
管理者画面の作成
配置先:src/main/resources/templates/admin/index.html
イメージ
HTML
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="header::head(~{::title})"> <title>管理画面 - Index</title> </head> <body> <header th:replace="header::header"></header> 管理者用の画面です。 </body> </html> |
Controller
配置先:src/main/java/com/example/demo/controller/AdminController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class AdminController { @GetMapping("/admin/index") public String getIndex() { return "admin/index"; } } |
セキュリティの設定
SecurityConfig.java
1 2 3 4 5 6 7 |
// SecurityConfig.java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/css/**", "/js/**").permitAll() .antMatchers("/admin/**").hasAuthority("ROLE_ADMIN") // ← 【追加】 .anyRequest().authenticated(); |
.antMatchers(“/admin/**”).hasAuthority(“ROLE_ADMIN”)
/admin以下のディレクトリは、ROLE_ADMINの権限を有するユーザのみ許可します。
出し分けの制御
SpringBootチュートリアルのヘッダーに管理画面用のリンクを追加して、
アドミン権限を持つユーザがログインした場合のみ表示されるようにします。
配置先:src/main/resources/templates/header.html
イメージ(ホーム画面)
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security" > <head th:fragment="head(title)"> <meta charset="UTF-8"> <title th:replace="${title}">title</title> <script th:src="@{/webjars/jquery/3.5.1/jquery.min.js}"></script> <script defer th:src="@{/js/dialog.js}"></script> </head> <body> <header th:fragment="header"> <a th:href="@{/}">ホーム</a> <a th:href="@{/book/list}">検索</a> <a th:href="@{/book/add}">新規登録</a> <a sec:authorize="hasRole('ROLE_ADMIN')" th:href="@{/admin/index}">管理画面</a> <a th:href="@{/logout}">ログアウト</a> <hr> </header> </body> </html> |
以下、SpringBootチュートリアル > #4~ headerの作成と埋め込みに対する変更点です。
・xmlns:sec=”http://www.thymeleaf.org/extras/spring-security”
無くても実装上の問題にはならないが、
HTML5の定義にないことでIDE上に警告表示されることが無いようにする対処。
・<a sec:authorize=”hasRole(‘ROLE_ADMIN’)” th:href=”@{/admin/index}”>管理画面</a>
ユーザの権限がROLE_ADMINであればリンクが表示されるようにします。
テスト
- ユーザ権限でログインし、管理画面のリンクが表示されないこと
- ユーザ権限でログインし、管理画面のリンクを直接指定してもアクセスできないこと
※SpringBootチュートリアルを元にしているため、エラーページが表示されます。 - 管理権限でログインし、管理画面のリンクが表示されること
- 管理権限でログインし、管理画面のリンクをクリックしてアクセスできること
まとめ
- アクセス可能なページをSecurityConfigで定義する。
- 画面上で、権限を有するユーザのみ表示するにはhasRoleで定義する。
- 権限のないユーザは、直接リンクであってもアクセスできない。
参考
後悔しないためのSpring Boot 入門書:Spring 解体新書(第2版): Spring Bootが丸分かり Spring解体新書
コメント