From 2ac3f6841323a4b5f12a271b6ee7cb5b259e756c Mon Sep 17 00:00:00 2001
From: Shinsuke Sugaya <shinsuke@apache.org>
Date: Sun, 22 Dec 2019 17:35:44 +0900
Subject: [PATCH] fix #2343 add fe:permission

---
 .../java/org/codelibs/fess/Constants.java     |   2 -
 .../fess/app/web/admin/AdminAction.java       |  11 +-
 .../accesstoken/AdminAccesstokenAction.java   |   5 +
 .../web/admin/backup/AdminBackupAction.java   |   5 +
 .../web/admin/badword/AdminBadwordAction.java |   5 +
 .../admin/boostdoc/AdminBoostdocAction.java   |   5 +
 .../crawlinginfo/AdminCrawlinginfoAction.java |   5 +
 .../admin/dashboard/AdminDashboardAction.java |   5 +
 .../dataconfig/AdminDataconfigAction.java     |   5 +
 .../web/admin/design/AdminDesignAction.java   |  18 +-
 .../app/web/admin/dict/AdminDictAction.java   |   5 +
 .../kuromoji/AdminDictKuromojiAction.java     |   5 +
 .../dict/mapping/AdminDictMappingAction.java  |   5 +
 .../protwords/AdminDictProtwordsAction.java   |   5 +
 .../AdminDictStemmeroverrideAction.java       |   5 +
 .../stopwords/AdminDictStopwordsAction.java   |   5 +
 .../dict/synonym/AdminDictSynonymAction.java  |   5 +
 .../AdminDuplicatehostAction.java             |   5 +
 .../elevateword/AdminElevatewordAction.java   |   5 +
 .../app/web/admin/esreq/AdminEsreqAction.java |   5 +
 .../failureurl/AdminFailureurlAction.java     |   5 +
 .../admin/fileauth/AdminFileauthAction.java   |   5 +
 .../fileconfig/AdminFileconfigAction.java     |   5 +
 .../web/admin/general/AdminGeneralAction.java |   5 +
 .../app/web/admin/group/AdminGroupAction.java |   5 +
 .../web/admin/joblog/AdminJoblogAction.java   |   5 +
 .../admin/keymatch/AdminKeymatchAction.java   |   5 +
 .../admin/labeltype/AdminLabeltypeAction.java |   5 +
 .../app/web/admin/log/AdminLogAction.java     |   5 +
 .../maintenance/AdminMaintenanceAction.java   |   5 +
 .../web/admin/pathmap/AdminPathmapAction.java |   5 +
 .../web/admin/plugin/AdminPluginAction.java   |   5 +
 .../AdminRelatedcontentAction.java            |   5 +
 .../relatedquery/AdminRelatedqueryAction.java |   5 +
 .../admin/reqheader/AdminReqheaderAction.java |   5 +
 .../app/web/admin/role/AdminRoleAction.java   |   5 +
 .../admin/scheduler/AdminSchedulerAction.java |   5 +
 .../searchlist/AdminSearchlistAction.java     |   5 +
 .../admin/searchlog/AdminSearchlogAction.java |   5 +
 .../web/admin/storage/AdminStorageAction.java |   5 +
 .../web/admin/suggest/AdminSuggestAction.java |   5 +
 .../systeminfo/AdminSysteminfoAction.java     |   5 +
 .../web/admin/upgrade/AdminUpgradeAction.java |   5 +
 .../app/web/admin/user/AdminUserAction.java   |   5 +
 .../web/admin/webauth/AdminWebauthAction.java |   5 +
 .../admin/webconfig/AdminWebconfigAction.java |   5 +
 .../web/admin/wizard/AdminWizardAction.java   |   5 +
 .../fess/app/web/base/FessAdminAction.java    |   9 +
 .../fess/mylasta/direction/FessProp.java      |   4 -
 .../codelibs/fess/taglib/FessFunctions.java   |  15 ++
 src/main/webapp/WEB-INF/fe.tld                |   8 +
 .../webconfig/admin_webconfig_details.jsp     |   4 +-
 .../view/common/admin/crud/buttons.jsp        |   8 +-
 .../WEB-INF/view/common/admin/crud/header.jsp |   4 +-
 .../WEB-INF/view/common/admin/header.jsp      |   2 +
 .../WEB-INF/view/common/admin/sidebar.jsp     | 198 ++++++++++--------
 56 files changed, 381 insertions(+), 122 deletions(-)

diff --git a/src/main/java/org/codelibs/fess/Constants.java b/src/main/java/org/codelibs/fess/Constants.java
index ad8240195..91fa848c1 100644
--- a/src/main/java/org/codelibs/fess/Constants.java
+++ b/src/main/java/org/codelibs/fess/Constants.java
@@ -102,8 +102,6 @@ public class Constants extends CoreLibConstants {
 
     public static final String WEB_API_POPULAR_WORD_PROPERTY = "web.api.popularword";
 
-    public static final String WEB_DESIGN_EDITOR_PROPERTY = "design.editor";
-
     public static final String APP_VALUE_PROPERTY = "system.properties";
 
     public static final String DEFAULT_LABEL_VALUE_PROPERTY = "label.value";
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/AdminAction.java b/src/main/java/org/codelibs/fess/app/web/admin/AdminAction.java
index 35772641a..f0ecc3778 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/AdminAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/AdminAction.java
@@ -60,13 +60,10 @@ import org.lastaflute.web.response.HtmlResponse;
 
 public class AdminAction extends FessAdminAction {
 
-    // ===================================================================================
-    //                                                                            Constant
-    //
-
-    // ===================================================================================
-    //                                                                           Attribute
-    //
+    @Override
+    protected String getActionRole() {
+        return "admin";
+    }
 
     // ===================================================================================
     //                                                                      Search Execute
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/accesstoken/AdminAccesstokenAction.java b/src/main/java/org/codelibs/fess/app/web/admin/accesstoken/AdminAccesstokenAction.java
index 1d116a85d..a2db4c1dc 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/accesstoken/AdminAccesstokenAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/accesstoken/AdminAccesstokenAction.java
@@ -72,6 +72,11 @@ public class AdminAccesstokenAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameAccesstoken()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java b/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
index a13fff500..d5d024ef3 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/backup/AdminBackupAction.java
@@ -109,6 +109,11 @@ public class AdminBackupAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameBackup()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     @Execute
     @Secured({ ROLE, ROLE + VIEW })
     public HtmlResponse index() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/badword/AdminBadwordAction.java b/src/main/java/org/codelibs/fess/app/web/admin/badword/AdminBadwordAction.java
index 2f6284c9c..70295dff7 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/badword/AdminBadwordAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/badword/AdminBadwordAction.java
@@ -75,6 +75,11 @@ public class AdminBadwordAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameBadword()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/boostdoc/AdminBoostdocAction.java b/src/main/java/org/codelibs/fess/app/web/admin/boostdoc/AdminBoostdocAction.java
index e300c8366..20d72c71a 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/boostdoc/AdminBoostdocAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/boostdoc/AdminBoostdocAction.java
@@ -59,6 +59,11 @@ public class AdminBoostdocAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameBoostdoc()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/crawlinginfo/AdminCrawlinginfoAction.java b/src/main/java/org/codelibs/fess/app/web/admin/crawlinginfo/AdminCrawlinginfoAction.java
index a1a264077..72bfa2400 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/crawlinginfo/AdminCrawlinginfoAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/crawlinginfo/AdminCrawlinginfoAction.java
@@ -61,6 +61,11 @@ public class AdminCrawlinginfoAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameCrawlinginfo()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dashboard/AdminDashboardAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dashboard/AdminDashboardAction.java
index cba435c62..22635025e 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dashboard/AdminDashboardAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dashboard/AdminDashboardAction.java
@@ -49,6 +49,11 @@ public class AdminDashboardAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDashboard()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                              Index
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dataconfig/AdminDataconfigAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dataconfig/AdminDataconfigAction.java
index 5afb51072..83e750743 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dataconfig/AdminDataconfigAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dataconfig/AdminDataconfigAction.java
@@ -77,6 +77,11 @@ public class AdminDataconfigAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDataconfig()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/design/AdminDesignAction.java b/src/main/java/org/codelibs/fess/app/web/admin/design/AdminDesignAction.java
index 5bc098e07..d4f4dc760 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/design/AdminDesignAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/design/AdminDesignAction.java
@@ -37,7 +37,6 @@ import org.codelibs.fess.exception.FessSystemException;
 import org.codelibs.fess.util.ComponentUtil;
 import org.dbflute.optional.OptionalEntity;
 import org.lastaflute.web.Execute;
-import org.lastaflute.web.response.ActionResponse;
 import org.lastaflute.web.response.HtmlResponse;
 import org.lastaflute.web.response.StreamResponse;
 import org.lastaflute.web.ruts.process.ActionRuntime;
@@ -59,29 +58,18 @@ public class AdminDesignAction extends FessAdminAction {
     // ===================================================================================
     //                                                                               Hook
     //                                                                              ======
-    @Override
-    public ActionResponse hookBefore(final ActionRuntime runtime) {
-        checkEditorStatus(runtime);
-        return super.hookBefore(runtime);
-    }
-
-    private void checkEditorStatus(final ActionRuntime runtime) {
-        if (!editable()) {
-            throwValidationError(messages -> messages.addErrorsDesignEditorDisabled(GLOBAL), () -> asListHtml());
-        }
-    }
 
     @Override
     protected void setupHtmlData(final ActionRuntime runtime) {
         super.setupHtmlData(runtime);
-        runtime.registerData("editable", editable());
         runtime.registerData("fileNameItems", loadFileNameItems());
         runtime.registerData("jspFileNameItems", loadJspFileNameItems());
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDesign()));
     }
 
-    private boolean editable() {
-        return fessConfig.isWebDesignEditorEnabled();
+    @Override
+    protected String getActionRole() {
+        return ROLE;
     }
 
     private List<Pair<String, String>> loadJspFileNameItems() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/AdminDictAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/AdminDictAction.java
index 825533541..ae346ebcc 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/AdminDictAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/AdminDictAction.java
@@ -49,6 +49,11 @@ public class AdminDictAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDict()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java
index 4a7f9281f..0c031b62e 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/kuromoji/AdminDictKuromojiAction.java
@@ -69,6 +69,11 @@ public class AdminDictKuromojiAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictKuromoji()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/mapping/AdminDictMappingAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/mapping/AdminDictMappingAction.java
index 2c065af90..e656b9795 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/mapping/AdminDictMappingAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/mapping/AdminDictMappingAction.java
@@ -71,6 +71,11 @@ public class AdminDictMappingAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictMapping()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/protwords/AdminDictProtwordsAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/protwords/AdminDictProtwordsAction.java
index 46056c007..b139aa8ee 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/protwords/AdminDictProtwordsAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/protwords/AdminDictProtwordsAction.java
@@ -68,6 +68,11 @@ public class AdminDictProtwordsAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictProtwords()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/stemmeroverride/AdminDictStemmeroverrideAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/stemmeroverride/AdminDictStemmeroverrideAction.java
index 64b1a39a4..e282a6594 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/stemmeroverride/AdminDictStemmeroverrideAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/stemmeroverride/AdminDictStemmeroverrideAction.java
@@ -68,6 +68,11 @@ public class AdminDictStemmeroverrideAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictStemmeroverride()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/stopwords/AdminDictStopwordsAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/stopwords/AdminDictStopwordsAction.java
index 7ff9192a1..afe7c7e5c 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/stopwords/AdminDictStopwordsAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/stopwords/AdminDictStopwordsAction.java
@@ -66,6 +66,11 @@ public class AdminDictStopwordsAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictStopwords()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/dict/synonym/AdminDictSynonymAction.java b/src/main/java/org/codelibs/fess/app/web/admin/dict/synonym/AdminDictSynonymAction.java
index 1e1728013..b1e50bbef 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/dict/synonym/AdminDictSynonymAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/dict/synonym/AdminDictSynonymAction.java
@@ -71,6 +71,11 @@ public class AdminDictSynonymAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictSynonym()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/duplicatehost/AdminDuplicatehostAction.java b/src/main/java/org/codelibs/fess/app/web/admin/duplicatehost/AdminDuplicatehostAction.java
index 1e14c6e8b..23fdc069d 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/duplicatehost/AdminDuplicatehostAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/duplicatehost/AdminDuplicatehostAction.java
@@ -59,6 +59,11 @@ public class AdminDuplicatehostAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDuplicatehost()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java
index 57c6a7cf6..a86f0de67 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java
@@ -85,6 +85,11 @@ public class AdminElevatewordAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameElevateword()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/esreq/AdminEsreqAction.java b/src/main/java/org/codelibs/fess/app/web/admin/esreq/AdminEsreqAction.java
index 98e9ce4ca..4b3fa90e6 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/esreq/AdminEsreqAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/esreq/AdminEsreqAction.java
@@ -54,6 +54,11 @@ public class AdminEsreqAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameEsreq()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     @Execute
     @Secured({ ROLE, ROLE + VIEW })
     public HtmlResponse index() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/failureurl/AdminFailureurlAction.java b/src/main/java/org/codelibs/fess/app/web/admin/failureurl/AdminFailureurlAction.java
index fc264d84b..d70bca4be 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/failureurl/AdminFailureurlAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/failureurl/AdminFailureurlAction.java
@@ -54,6 +54,11 @@ public class AdminFailureurlAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameFailureurl()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/fileauth/AdminFileauthAction.java b/src/main/java/org/codelibs/fess/app/web/admin/fileauth/AdminFileauthAction.java
index 6588f4d97..9c6b1f660 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/fileauth/AdminFileauthAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/fileauth/AdminFileauthAction.java
@@ -70,6 +70,11 @@ public class AdminFileauthAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameFileauth()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/fileconfig/AdminFileconfigAction.java b/src/main/java/org/codelibs/fess/app/web/admin/fileconfig/AdminFileconfigAction.java
index 63ce394f2..f50b4178b 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/fileconfig/AdminFileconfigAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/fileconfig/AdminFileconfigAction.java
@@ -73,6 +73,11 @@ public class AdminFileconfigAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameFileconfig()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java b/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java
index 6c53ed43d..dcdac47b2 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java
@@ -69,6 +69,11 @@ public class AdminGeneralAction extends FessAdminAction {
         runtime.registerData("dayItems", getDayItems());
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //
 
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/group/AdminGroupAction.java b/src/main/java/org/codelibs/fess/app/web/admin/group/AdminGroupAction.java
index deb0245e2..d5749226f 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/group/AdminGroupAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/group/AdminGroupAction.java
@@ -64,6 +64,11 @@ public class AdminGroupAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameGroup()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/joblog/AdminJoblogAction.java b/src/main/java/org/codelibs/fess/app/web/admin/joblog/AdminJoblogAction.java
index 80e51d701..b8d34c710 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/joblog/AdminJoblogAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/joblog/AdminJoblogAction.java
@@ -57,6 +57,11 @@ public class AdminJoblogAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameJoblog()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/keymatch/AdminKeymatchAction.java b/src/main/java/org/codelibs/fess/app/web/admin/keymatch/AdminKeymatchAction.java
index a0a379c4f..165bb1aec 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/keymatch/AdminKeymatchAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/keymatch/AdminKeymatchAction.java
@@ -66,6 +66,11 @@ public class AdminKeymatchAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameKeymatch()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/labeltype/AdminLabeltypeAction.java b/src/main/java/org/codelibs/fess/app/web/admin/labeltype/AdminLabeltypeAction.java
index 37e412265..1fb4645d7 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/labeltype/AdminLabeltypeAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/labeltype/AdminLabeltypeAction.java
@@ -71,6 +71,11 @@ public class AdminLabeltypeAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameLabeltype()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/log/AdminLogAction.java b/src/main/java/org/codelibs/fess/app/web/admin/log/AdminLogAction.java
index 09fe2ca50..6fa4922a5 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/log/AdminLogAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/log/AdminLogAction.java
@@ -56,6 +56,11 @@ public class AdminLogAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameLog()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     @Execute
     @Secured({ ROLE, ROLE + VIEW })
     public HtmlResponse index() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/maintenance/AdminMaintenanceAction.java b/src/main/java/org/codelibs/fess/app/web/admin/maintenance/AdminMaintenanceAction.java
index 3e42e1c57..7f4e9fe48 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/maintenance/AdminMaintenanceAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/maintenance/AdminMaintenanceAction.java
@@ -76,6 +76,11 @@ public class AdminMaintenanceAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameMaintenance()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/pathmap/AdminPathmapAction.java b/src/main/java/org/codelibs/fess/app/web/admin/pathmap/AdminPathmapAction.java
index 58b66a3b8..26ae8739c 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/pathmap/AdminPathmapAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/pathmap/AdminPathmapAction.java
@@ -60,6 +60,11 @@ public class AdminPathmapAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNamePathmap()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/plugin/AdminPluginAction.java b/src/main/java/org/codelibs/fess/app/web/admin/plugin/AdminPluginAction.java
index ede4e3c5a..6590c5078 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/plugin/AdminPluginAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/plugin/AdminPluginAction.java
@@ -54,6 +54,11 @@ public class AdminPluginAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNamePlugin()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     @Execute
     @Secured({ ROLE, ROLE + VIEW })
     public HtmlResponse index() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/relatedcontent/AdminRelatedcontentAction.java b/src/main/java/org/codelibs/fess/app/web/admin/relatedcontent/AdminRelatedcontentAction.java
index 04b01423d..b1d12f1b5 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/relatedcontent/AdminRelatedcontentAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/relatedcontent/AdminRelatedcontentAction.java
@@ -59,6 +59,11 @@ public class AdminRelatedcontentAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameRelatedcontent()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/relatedquery/AdminRelatedqueryAction.java b/src/main/java/org/codelibs/fess/app/web/admin/relatedquery/AdminRelatedqueryAction.java
index a1cf552c7..5570eda85 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/relatedquery/AdminRelatedqueryAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/relatedquery/AdminRelatedqueryAction.java
@@ -66,6 +66,11 @@ public class AdminRelatedqueryAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameRelatedquery()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/reqheader/AdminReqheaderAction.java b/src/main/java/org/codelibs/fess/app/web/admin/reqheader/AdminReqheaderAction.java
index b23d1cce2..80f590bfe 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/reqheader/AdminReqheaderAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/reqheader/AdminReqheaderAction.java
@@ -69,6 +69,11 @@ public class AdminReqheaderAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameReqheader()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/role/AdminRoleAction.java b/src/main/java/org/codelibs/fess/app/web/admin/role/AdminRoleAction.java
index 39bd1fcb4..4ba00052d 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/role/AdminRoleAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/role/AdminRoleAction.java
@@ -64,6 +64,11 @@ public class AdminRoleAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameRole()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/scheduler/AdminSchedulerAction.java b/src/main/java/org/codelibs/fess/app/web/admin/scheduler/AdminSchedulerAction.java
index f60d70e98..ebd629bca 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/scheduler/AdminSchedulerAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/scheduler/AdminSchedulerAction.java
@@ -66,6 +66,11 @@ public class AdminSchedulerAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameScheduler()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java
index d047b09b2..afbd2c8d5 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java
@@ -112,6 +112,11 @@ public class AdminSearchlistAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameSearchlist()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     // Search Execute
     // ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlog/AdminSearchlogAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlog/AdminSearchlogAction.java
index 709eb1424..ba20b41d9 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/searchlog/AdminSearchlogAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlog/AdminSearchlogAction.java
@@ -56,6 +56,11 @@ public class AdminSearchlogAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameSearchlog()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/storage/AdminStorageAction.java b/src/main/java/org/codelibs/fess/app/web/admin/storage/AdminStorageAction.java
index f63c0b855..64affa9cb 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/storage/AdminStorageAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/storage/AdminStorageAction.java
@@ -62,6 +62,11 @@ public class AdminStorageAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameStorage()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     @Execute
     @Secured({ ROLE, ROLE + VIEW })
     public HtmlResponse index() {
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/suggest/AdminSuggestAction.java b/src/main/java/org/codelibs/fess/app/web/admin/suggest/AdminSuggestAction.java
index c041e8dff..563db4cdb 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/suggest/AdminSuggestAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/suggest/AdminSuggestAction.java
@@ -49,6 +49,11 @@ public class AdminSuggestAction extends FessAdminAction {
         runtime.registerData("queryWordsNum", suggestHelper.getQueryWordsNum());
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                             Execute
     //                                                                            ========
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/systeminfo/AdminSysteminfoAction.java b/src/main/java/org/codelibs/fess/app/web/admin/systeminfo/AdminSysteminfoAction.java
index f5f18ef50..a9780a028 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/systeminfo/AdminSysteminfoAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/systeminfo/AdminSysteminfoAction.java
@@ -64,6 +64,11 @@ public class AdminSysteminfoAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameSysteminfo()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                              Index
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/upgrade/AdminUpgradeAction.java b/src/main/java/org/codelibs/fess/app/web/admin/upgrade/AdminUpgradeAction.java
index c93e9998d..73ad58ec6 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/upgrade/AdminUpgradeAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/upgrade/AdminUpgradeAction.java
@@ -111,6 +111,11 @@ public class AdminUpgradeAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameUpgrade()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/user/AdminUserAction.java b/src/main/java/org/codelibs/fess/app/web/admin/user/AdminUserAction.java
index 435c56207..7d71cde5b 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/user/AdminUserAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/user/AdminUserAction.java
@@ -77,6 +77,11 @@ public class AdminUserAction extends FessAdminAction {
         runtime.registerData("ldapAdminEnabled", fessConfig.isLdapAdminEnabled());
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/webauth/AdminWebauthAction.java b/src/main/java/org/codelibs/fess/app/web/admin/webauth/AdminWebauthAction.java
index b1c6d341a..b35aaadc8 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/webauth/AdminWebauthAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/webauth/AdminWebauthAction.java
@@ -69,6 +69,11 @@ public class AdminWebauthAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameWebauth()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/webconfig/AdminWebconfigAction.java b/src/main/java/org/codelibs/fess/app/web/admin/webconfig/AdminWebconfigAction.java
index 683cdfe8a..d2d2a7ca6 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/webconfig/AdminWebconfigAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/webconfig/AdminWebconfigAction.java
@@ -77,6 +77,11 @@ public class AdminWebconfigAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameWebconfig()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java b/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java
index 7c3e5f5aa..93be59623 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/wizard/AdminWizardAction.java
@@ -80,6 +80,11 @@ public class AdminWizardAction extends FessAdminAction {
         runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameWizard()));
     }
 
+    @Override
+    protected String getActionRole() {
+        return ROLE;
+    }
+
     // ===================================================================================
     //                                                                      Search Execute
     //                                                                      ==============
diff --git a/src/main/java/org/codelibs/fess/app/web/base/FessAdminAction.java b/src/main/java/org/codelibs/fess/app/web/base/FessAdminAction.java
index dad0de616..9bcc68533 100644
--- a/src/main/java/org/codelibs/fess/app/web/base/FessAdminAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/base/FessAdminAction.java
@@ -18,6 +18,7 @@ package org.codelibs.fess.app.web.base;
 import javax.annotation.Resource;
 import javax.servlet.ServletContext;
 
+import org.codelibs.core.lang.StringUtil;
 import org.codelibs.fess.exception.UserRoleLoginException;
 import org.codelibs.fess.helper.CrawlingConfigHelper;
 import org.dbflute.optional.OptionalThing;
@@ -49,8 +50,16 @@ public abstract class FessAdminAction extends FessBaseAction {
     protected void setupHtmlData(final ActionRuntime runtime) {
         super.setupHtmlData(runtime);
         systemHelper.setupAdminHtmlData(this, runtime);
+
+        final Boolean editable =
+                getUserBean().map(user -> user.hasRoles(fessConfig.getAuthenticationAdminRolesAsArray()) || user.hasRole(getActionRole()))
+                        .orElse(false);
+        runtime.registerData("editable", editable);
+        runtime.registerData("editableClass", editable.booleanValue() ? StringUtil.EMPTY : "disabled");
     }
 
+    protected abstract String getActionRole();
+
     protected void write(final String path, final byte[] data) {
         LdiFileUtil.write(path, data);
     }
diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
index 13ecc89c6..3a8f017b6 100644
--- a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
+++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java
@@ -203,10 +203,6 @@ public interface FessProp {
         setSystemProperty(key, Integer.toString(value));
     }
 
-    default boolean isWebDesignEditorEnabled() {
-        return getSystemPropertyAsBoolean(Constants.WEB_DESIGN_EDITOR_PROPERTY, true);
-    }
-
     default boolean isSearchFileProxyEnabled() {
         return getSystemPropertyAsBoolean(Constants.SEARCH_FILE_PROXY_PROPERTY, true);
     }
diff --git a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
index 74d1a1673..b663d008d 100644
--- a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
+++ b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
@@ -50,6 +50,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.pdfbox.util.DateConverter;
 import org.codelibs.core.lang.StringUtil;
 import org.codelibs.fess.Constants;
+import org.codelibs.fess.app.web.base.FessAdminAction;
+import org.codelibs.fess.app.web.base.login.FessLoginAssist;
 import org.codelibs.fess.entity.FacetQueryView;
 import org.codelibs.fess.helper.ViewHelper;
 import org.codelibs.fess.util.ComponentUtil;
@@ -404,4 +406,17 @@ public class FessFunctions {
         final Locale locale = LaRequestUtil.getOptionalRequest().map(HttpServletRequest::getLocale).orElse(Locale.ROOT);
         return ComponentUtil.getMessageManager().findMessage(locale, key).orElse(defaultValue);
     }
+
+    public static boolean hasActionRole(final String role) {
+        final String[] roles;
+        if (role.endsWith(FessAdminAction.VIEW)) {
+            roles = new String[] { role, role.substring(0, role.length() - FessAdminAction.VIEW.length()) };
+        } else {
+            roles = new String[] { role };
+        }
+        final FessLoginAssist loginAssist = ComponentUtil.getComponent(FessLoginAssist.class);
+        return loginAssist.getSavedUserBean()
+                .map(user -> user.hasRoles(roles) || user.hasRoles(ComponentUtil.getFessConfig().getAuthenticationAdminRolesAsArray()))
+                .orElse(false);
+    }
 }
diff --git a/src/main/webapp/WEB-INF/fe.tld b/src/main/webapp/WEB-INF/fe.tld
index aa4d58710..561a57848 100644
--- a/src/main/webapp/WEB-INF/fe.tld
+++ b/src/main/webapp/WEB-INF/fe.tld
@@ -265,4 +265,12 @@
     <function-signature>java.lang.String getMessage(java.lang.String, java.lang.String)</function-signature>
     <example>${fe:message("labels.foobar", "default value")}</example>
   </function>
+
+  <function>
+    <description>Check if user has a permission.</description>
+    <name>permission</name>
+    <function-class>org.codelibs.fess.taglib.FessFunctions</function-class>
+    <function-signature>boolean hasActionRole(java.lang.String)</function-signature>
+    <example>${fe:permission("admin-dashboard")}</example>
+  </function>
 </taglib>
diff --git a/src/main/webapp/WEB-INF/view/admin/webconfig/admin_webconfig_details.jsp b/src/main/webapp/WEB-INF/view/admin/webconfig/admin_webconfig_details.jsp
index 7baba515b..b52f15c9f 100644
--- a/src/main/webapp/WEB-INF/view/admin/webconfig/admin_webconfig_details.jsp
+++ b/src/main/webapp/WEB-INF/view/admin/webconfig/admin_webconfig_details.jsp
@@ -158,11 +158,11 @@
 								<!-- /.box-body -->
 								<div class="box-footer">
 									<jsp:include page="/WEB-INF/view/common/admin/crud/buttons.jsp"></jsp:include>
-									<la:link styleClass="btn btn-success"
+									<c:if test="${editable}"><la:link styleClass="btn btn-success"
 										href="/admin/scheduler/createnewjob/web_crawling/${f:u(id)}/${fe:base64(name)}">
 										<em class="fa fa-plus-circle"></em>
 										<la:message key="labels.web_crawling_button_create_job" />
-									</la:link>
+									</la:link></c:if>
 								</div>
 								<!-- /.box-footer -->
 							</div>
diff --git a/src/main/webapp/WEB-INF/view/common/admin/crud/buttons.jsp b/src/main/webapp/WEB-INF/view/common/admin/crud/buttons.jsp
index c0491ec81..dc03ca484 100644
--- a/src/main/webapp/WEB-INF/view/common/admin/crud/buttons.jsp
+++ b/src/main/webapp/WEB-INF/view/common/admin/crud/buttons.jsp
@@ -5,28 +5,33 @@
 		<em class="fa fa-arrow-circle-left"></em>
 		<la:message key="labels.crud_button_back" />
 	</button>
+	<c:if test="${editable}">
 	<button type="submit" class="btn btn-success" name="create"
 		value="<la:message key="labels.crud_button_create" />">
 		<em class="fa fa-plus"></em>
 		<la:message key="labels.crud_button_create" />
 	</button>
+	</c:if>
 </c:if>
 <c:if test="${crudMode == 2}">
 	<button type="submit" class="btn btn-default" name="edit" value="back">
 		<em class="fa fa-arrow-circle-left"></em>
 		<la:message key="labels.crud_button_back" />
 	</button>
+	<c:if test="${editable}">
 	<button type="submit" class="btn btn-warning" name="update"
 		value="<la:message key="labels.crud_button_update" />">
 		<em class="fa fa-pencil-alt"></em>
 		<la:message key="labels.crud_button_update" />
 	</button>
+	</c:if>
 </c:if>
 <c:if test="${crudMode == 4}">
 	<button type="submit" class="btn btn-default" name="list" value="back">
 		<em class="fa fa-arrow-circle-left"></em>
 		<la:message key="labels.crud_button_back" />
 	</button>
+	<c:if test="${editable}">
 	<button type="submit" class="btn btn-warning" name="edit"
 		value="<la:message key="labels.crud_button_edit" />">
 		<em class="fa fa-pencil-alt"></em>
@@ -71,4 +76,5 @@
 			</div>
 		</div>
 	</div>
-</c:if>
\ No newline at end of file
+	</c:if>
+</c:if>
diff --git a/src/main/webapp/WEB-INF/view/common/admin/crud/header.jsp b/src/main/webapp/WEB-INF/view/common/admin/crud/header.jsp
index 7aa7a3738..0cf3d55bb 100644
--- a/src/main/webapp/WEB-INF/view/common/admin/crud/header.jsp
+++ b/src/main/webapp/WEB-INF/view/common/admin/crud/header.jsp
@@ -19,7 +19,7 @@
 <div class="btn-group pull-right">
 	<c:choose>
 		<c:when test="${crudMode == null}">
-			<la:link href="createnew" styleClass="btn btn-success btn-xs">
+			<la:link href="createnew" styleClass="btn btn-success btn-xs ${f:h(editableClass)}">
 				<em class="fa fa-plus"></em>
 				<la:message key="labels.crud_link_create" />
 			</la:link>
@@ -31,4 +31,4 @@
 			</la:link>
 		</c:otherwise>
 	</c:choose>
-</div>
\ No newline at end of file
+</div>
diff --git a/src/main/webapp/WEB-INF/view/common/admin/header.jsp b/src/main/webapp/WEB-INF/view/common/admin/header.jsp
index 83f69df54..61b501699 100644
--- a/src/main/webapp/WEB-INF/view/common/admin/header.jsp
+++ b/src/main/webapp/WEB-INF/view/common/admin/header.jsp
@@ -23,9 +23,11 @@
 					<a href="${installationLink}" target="_olh"><em class="fa fa-exclamation-triangle"></em></a></li>
 				</c:if>
 				<li><a href="${contextPath}/"><em class="fa fa-list-alt"></em></a></li>
+				<c:if test="${fe:permission('admin-scheduler')}">
 				<li><a
 					href="${contextPath}/admin/scheduler/details/4/default_crawler"><em
 						class="fa fa-play-circle"></em></a></li>
+				</c:if>
 				<c:if test="${not empty helpLink}">
 				<li><a href="${helpLink}" target="_olh"><em
 						class="fa fa-question-circle"></em></a></li>
diff --git a/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp b/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp
index 57350ba97..eb0a1bbce 100644
--- a/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp
+++ b/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp
@@ -6,6 +6,7 @@
 	<section class="sidebar">
 
 		<!-- search form -->
+		<c:if test="${fe:permission('admin-searchlist-view')}">
 		<form action="<%=request.getContextPath()%>/admin/searchlist/search" method="GET"
 			class="sidebar-form">
 			<div class="input-group">
@@ -20,18 +21,20 @@
 				</span>
 			</div>
 		</form>
+		</c:if>
 
 		<!-- Sidebar Menu -->
 		<ul class="sidebar-menu" data-widget="tree">
 			<li class="header"><la:message key="labels.sidebar.menu" /></li>
 
-			<li
+			<c:if test="${fe:permission('admin-dashboard-view')}"><li
 				class="<c:if test="${param.menuCategoryType=='dashboard'}">active</c:if>"><la:link
 					href="/admin/dashboard/">
 					<em class="fa fa-tachometer-alt"></em>
 					<span><la:message key="labels.menu_dashboard_config" /></span>
-				</la:link></li>
+				</la:link></li></c:if>
 
+			<c:if test="${fe:permission('admin-wizard-view') or fe:permission('admin-general-view') or fe:permission('admin-scheduler-view') or fe:permission('admin-design-view') or fe:permission('admin-dict-view') or fe:permission('admin-accesstoken-view') or fe:permission('admin-plugin-view') or fe:permission('admin-storage-view')}">
 			<li
 				class="treeview <c:if test="${param.menuCategoryType=='system'}">active</c:if>"><a
 				href="#"><em class='fa fa-laptop'></em> <span><la:message
@@ -39,56 +42,64 @@
 					class="fa fa-angle-left pull-right"></em></a>
 				<ul class="treeview-menu">
 
+					<c:if test="${fe:permission('admin-wizard-view')}">
 					<li <c:if test="${param.menuType=='wizard'}">class="active"</c:if>><la:link
 							href="/admin/wizard/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_wizard" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-general-view')}">
 					<li <c:if test="${param.menuType=='general'}">class="active"</c:if>><la:link
 							href="/admin/general/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_crawl_config" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='scheduler'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-scheduler-view')}">
+					<li <c:if test="${param.menuType=='scheduler'}">class="active"</c:if>><la:link
 							href="/admin/scheduler/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_scheduler_config" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-design-view')}">
 					<li <c:if test="${param.menuType=='design'}">class="active"</c:if>><la:link
 							href="/admin/design/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_design" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-dict-view')}">
 					<li <c:if test="${param.menuType=='dict'}">class="active"</c:if>><la:link
 							href="/admin/dict/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_dict" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-accesstoken-view')}">
 					<li <c:if test="${param.menuType=='accessToken'}">class="active"</c:if>><la:link
 							href="/admin/accesstoken/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_access_token" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-plugin-view')}">
 					<li <c:if test="${param.menuType=='plugin'}">class="active"</c:if>><la:link
 							href="/admin/plugin/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_plugin" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<c:if test="${storageEnabled.booleanValue()}"><li <c:if test="${param.menuType=='storage'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-storage-view') and storageEnabled.booleanValue()}">
+					<li <c:if test="${param.menuType=='storage'}">class="active"</c:if>><la:link
 							href="/admin/storage/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_storage" /></span>
 						</la:link></li></c:if>
 
-				</ul></li>
+				</ul></li></c:if>
+			<c:if test="${fe:permission('admin-webconfig-view') or fe:permission('admin-fileconfig-view') or fe:permission('admin-dataconfig-view') or fe:permission('admin-labeltype-view') or fe:permission('admin-keymatch-view') or fe:permission('admin-boostdoc-view') or fe:permission('admin-relatedcontent-view') or fe:permission('admin-relatedquery-view') or fe:permission('admin-pathmap-view') or fe:permission('admin-webauth-view') or fe:permission('admin-fileauth-view') or fe:permission('admin-reqheader-view') or fe:permission('admin-duplicatehost-view')}">
 			<li
 				class="treeview <c:if test="${param.menuCategoryType=='crawl'}">active</c:if>"><a
 				href="#"><em class='fa fa-cogs'></em> <span><la:message
@@ -96,123 +107,128 @@
 					class="fa fa-angle-left pull-right"></em></a>
 				<ul class="treeview-menu">
 
-					<li
-						<c:if test="${param.menuType=='webConfig'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-webconfig-view')}">
+					<li <c:if test="${param.menuType=='webConfig'}">class="active"</c:if>><la:link
 							href="/admin/webconfig/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_web" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='fileConfig'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-fileconfig-view')}">
+					<li <c:if test="${param.menuType=='fileConfig'}">class="active"</c:if>><la:link
 							href="/admin/fileconfig/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_file_system" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='dataConfig'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-dataconfig-view')}">
+					<li <c:if test="${param.menuType=='dataConfig'}">class="active"</c:if>><la:link
 							href="/admin/dataconfig/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_data_store" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='labelType'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-labeltype-view')}">
+					<li <c:if test="${param.menuType=='labelType'}">class="active"</c:if>><la:link
 							href="/admin/labeltype/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_label_type" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='keyMatch'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-keymatch-view')}">
+					<li <c:if test="${param.menuType=='keyMatch'}">class="active"</c:if>><la:link
 							href="/admin/keymatch/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_key_match" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='boostDocumentRule'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-boostdoc-view')}">
+					<li <c:if test="${param.menuType=='boostDocumentRule'}">class="active"</c:if>><la:link
 							href="/admin/boostdoc/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_boost_document_rule" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='relatedContentRule'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-relatedcontent-view')}">
+					<li <c:if test="${param.menuType=='relatedContentRule'}">class="active"</c:if>><la:link
 							href="/admin/relatedcontent/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_related_content" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='relatedQueryRule'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-relatedquery-view')}">
+					<li <c:if test="${param.menuType=='relatedQueryRule'}">class="active"</c:if>><la:link
 							href="/admin/relatedquery/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_related_query" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='pathMapping'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-pathmap-view')}">
+					<li <c:if test="${param.menuType=='pathMapping'}">class="active"</c:if>><la:link
 							href="/admin/pathmap/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_path_mapping" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='webAuthentication'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-webauth-view')}">
+					<li <c:if test="${param.menuType=='webAuthentication'}">class="active"</c:if>><la:link
 							href="/admin/webauth/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_web_authentication" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='fileAuthentication'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-fileauth-view')}">
+					<li <c:if test="${param.menuType=='fileAuthentication'}">class="active"</c:if>><la:link
 							href="/admin/fileauth/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_file_authentication" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='requestHeader'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-reqheader-view')}">
+					<li <c:if test="${param.menuType=='requestHeader'}">class="active"</c:if>><la:link
 							href="/admin/reqheader/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_request_header" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='duplicateHost'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-duplicatehost-view')}">
+					<li <c:if test="${param.menuType=='duplicateHost'}">class="active"</c:if>><la:link
 							href="/admin/duplicatehost/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_duplicate_host" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-				</ul></li>
+				</ul></li></c:if>
+			<c:if test="${fe:permission('admin-user-view') or fe:permission('admin-role-view') or fe:permission('admin-group-view')}">
 			<li
 				class="treeview <c:if test="${param.menuCategoryType=='user'}">active</c:if>"><a
 				href="#"><em class='fa fa-user'></em> <span><la:message
 							key="labels.menu_user" /></span> <em class="fa fa-angle-left pull-right"></em></a>
 				<ul class="treeview-menu">
 
+					<c:if test="${fe:permission('admin-user-view')}">
 					<li <c:if test="${param.menuType=='user'}">class="active"</c:if>><la:link
 							href="/admin/user/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_user" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-role-view')}">
 					<li <c:if test="${param.menuType=='role'}">class="active"</c:if>><la:link
 							href="/admin/role/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_role" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-group-view')}">
 					<li <c:if test="${param.menuType=='group'}">class="active"</c:if>><la:link
 							href="/admin/group/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_group" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-				</ul></li>
+				</ul></li></c:if>
+			<c:if test="${fe:permission('admin-suggest-view') or fe:permission('admin-elevateword-view') or fe:permission('admin-badword-view')}">
 			<li
 				class="treeview <c:if test="${param.menuCategoryType=='suggest'}">active</c:if>"><a
 				href="#"><em class='fa fa-list'></em> <span><la:message
@@ -220,28 +236,29 @@
 					class="fa fa-angle-left pull-right"></em></a>
 				<ul class="treeview-menu">
 
-					<li
-						<c:if test="${param.menuType=='suggestWord'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-suggest-view')}">
+					<li <c:if test="${param.menuType=='suggestWord'}">class="active"</c:if>><la:link
 							href="/admin/suggest/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_suggest_word" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='elevateWord'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-elevateword-view')}">
+					<li <c:if test="${param.menuType=='elevateWord'}">class="active"</c:if>><la:link
 							href="/admin/elevateword/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_elevate_word" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='badWord'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-badword-view')}">
+					<li <c:if test="${param.menuType=='badWord'}">class="active"</c:if>><la:link
 							href="/admin/badword/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_bad_word" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-				</ul></li>
+				</ul></li></c:if>
+			<c:if test="${fe:permission('admin-systeminfo-view') or fe:permission('admin-searchlog-view') or fe:permission('admin-joblog-view') or fe:permission('admin-crawlinginfo-view') or fe:permission('admin-log-view') or fe:permission('admin-failureurl-view') or fe:permission('admin-searchlist-view') or fe:permission('admin-backup-view') or fe:permission('admin-maintenance-view')}">
 			<li
 				class="treeview <c:if test="${param.menuCategoryType=='log'}">active</c:if>"><a
 				href="#"><em class='fa fa-rss'></em> <span><la:message
@@ -249,67 +266,70 @@
 					class="fa fa-angle-left pull-right"></em></a>
 				<ul class="treeview-menu">
 
-					<li
-						<c:if test="${param.menuType=='systemInfo'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-systeminfo-view')}">
+					<li <c:if test="${param.menuType=='systemInfo'}">class="active"</c:if>><la:link
 							href="/admin/systeminfo/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_system_info" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-searchlog-view')}">
 					<li <c:if test="${param.menuType=='searchLog'}">class="active"</c:if>><la:link
 							href="/admin/searchlog/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_searchLog" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-joblog-view')}">
 					<li <c:if test="${param.menuType=='jobLog'}">class="active"</c:if>><la:link
 							href="/admin/joblog/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_jobLog" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='crawlingInfo'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-crawlinginfo-view')}">
+					<li <c:if test="${param.menuType=='crawlingInfo'}">class="active"</c:if>><la:link
 							href="/admin/crawlinginfo/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_crawling_info" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
+					<c:if test="${fe:permission('admin-log-view')}">
 					<li <c:if test="${param.menuType=='log'}">class="active"</c:if>><la:link
 							href="/admin/log/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_log" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='failureUrl'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-failureurl-view')}">
+					<li <c:if test="${param.menuType=='failureUrl'}">class="active"</c:if>><la:link
 							href="/admin/failureurl/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_failure_url" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='searchList'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-searchlist-view')}">
+					<li <c:if test="${param.menuType=='searchList'}">class="active"</c:if>><la:link
 							href="/admin/searchlist/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_search_list" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='backup'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-backup-view')}">
+					<li <c:if test="${param.menuType=='backup'}">class="active"</c:if>><la:link
 							href="/admin/backup/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_backup" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-					<li
-						<c:if test="${param.menuType=='maintenance'}">class="active"</c:if>><la:link
+					<c:if test="${fe:permission('admin-maintenance-view')}">
+					<li <c:if test="${param.menuType=='maintenance'}">class="active"</c:if>><la:link
 							href="/admin/maintenance/">
 							<em class='fa fa-genderless'></em>
 							<span><la:message key="labels.menu_maintenance" /></span>
-						</la:link></li>
+						</la:link></li></c:if>
 
-				</ul></li>
+				</ul></li></c:if>
 			<c:if test="${fe:fileExists('/WEB-INF/view/common/admin/sidebar_extra.jsp')}">
 				<c:import url="/WEB-INF/view/common/admin/sidebar_extra.jsp" />
 			</c:if>
-- 
GitLab