ロールによって画面のリンクの表示/非表示を制御するには? | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

SpringSecurityでは、taglibが用意されています。

それを利用すると、ログインユーザが持っているロールによってリンクを制御できます!


早速サンプルを見てみましょう。



【サンプルJSP】


<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"% >
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags " %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="css/default.css" type="text/css" />

<title>トップページ</title>
</head>
<body>
<a href="logout">ログアウト</a>
<br />

<sec:authorize ifAnyGranted="ROLE_ADMIN">
<a href="editUser.do">管理者のみがリンク表示されます</a><br />
</sec:authorize>



</body>
</html>




【説明】

ロールのチェックをするには、authorize タグを使用します。

ロールの判定の仕方は、ifAllGranted、 ifAnyGranted、 ifNotGrantedの3種類があります。

カンマ区切りでロールを指定します。


ifAllGranted ・・・ログインユーザが指定のロールすべてを持っている場合

ifAnyGranted ・・・ログインユーザが指定のロールのうちどれかを持っている場合

ifNotGranted ・・・ログインユーザが指定のロールを持っていない場合



このタグを使用するだけでリンクや文字列などの表示を制御できます。


便利でしょ?




【補足】

WEBだと良く出る要望が、

「閲覧権限のない画面へのリンクは表示しないでほしい」

だと思います。

上記のサンプルのように権限でリンク表示を制御する場合、この要望を満たすにはリンク1つずつについて必要なロールをすべて記述する必要があります。

これは記述が大変な上に、ロールが増えるたびにすべて書き直さないといけません。


そうすると、パスを指定して、ログインユーザがそのパスの認可が通るかどうかを判定する機構が必要になります。


これは結構きついです。。

なかなか便利なtaglibですが、どうも上記のことはできないようです。


一応、別の記事でこの実現方法を見てみようと思っています。(以下の参考を参照)




参考:

・閲覧許可がある画面のリンクのみ表示するには?

・実際に認証と認可をWEBにつけるには? (基本編:設定方法)

SpringSecurityでラクラクセキュリティ対策