RuoYi 权限服务:使用 Thymeleaf 和 JavaScript 实现按钮可见性控制
{"title":"package com.ruoyi.framework.web.service; \n\nimport java.beans.BeanInfo; \nimport java.beans.Introspector; \nimport java.beans.PropertyDescriptor; \nimport org.apache.shiro.SecurityUtils; \nimport org.apache.shiro.subject.Subject; \nimport org.slf4j.Logger; \nimport org.slf4j.LoggerFactory; \nimport org.springframework.stereotype.Service; \nimport com.ruoyi.common.utils.StringUtils; \n\n/** \n * RuoYi首创 js调用 thymeleaf 实现按钮权限可见性 \n * \n * @author ruoyi \n / \n@Service("permission") \npublic class PermissionService \n{ \n private static final Logger log = LoggerFactory.getLogger(PermissionService.class); \n\n /* 没有权限,hidden用于前端隐藏按钮 / \n public static final String NOACCESS = "hidden"; \n\n private static final String ROLE_DELIMETER = ","; \n\n private static final String PERMISSION_DELIMETER = ","; \n\n /* \n * 验证用户是否具备某权限,无权限返回hidden用于前端隐藏(如需返回Boolean使用isPermitted) \n * \n * @param permission 权限字符串 \n * @return 用户是否具备某权限 \n / \n public String hasPermi(String permission) \n { \n return isPermitted(permission) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否不具备某权限,与 hasPermi逻辑相反。无权限返回hidden用于前端隐藏(如需返回Boolean使用isLacksPermitted) \n * \n * @param permission 权限字符串 \n * @return 用户是否不具备某权限 \n / \n public String lacksPermi(String permission) \n { \n return isLacksPermitted(permission) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否具有以下任意一个权限,无权限返回hidden用于隐藏(如需返回Boolean使用hasAnyPermissions) \n * \n * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 \n * @return 用户是否具有以下任意一个权限 \n / \n public String hasAnyPermi(String permissions) \n { \n return hasAnyPermissions(permissions, PERMISSION_DELIMETER) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否具备某角色,无权限返回hidden用于隐藏(如需返回Boolean使用isRole) \n * \n * @param role 角色字符串 \n * @return 用户是否具备某角色 \n / \n public String hasRole(String role) \n { \n return isRole(role) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否不具备某角色,与hasRole逻辑相反。无权限返回hidden用于隐藏(如需返回Boolean使用isLacksRole) \n * \n * @param role 角色字符串 \n * @return 用户是否不具备某角色 \n / \n public String lacksRole(String role) \n { \n return isLacksRole(role) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否具有以下任意一个角色,无权限返回hidden用于隐藏(如需返回Boolean使用isAnyRoles) \n * \n * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 \n * @return 用户是否具有以下任意一个角色 \n / \n public String hasAnyRoles(String roles) \n { \n return isAnyRoles(roles, ROLE_DELIMETER) ? StringUtils.EMPTY : NOACCESS; \n } \n\n /* \n * 验证用户是否认证通过或已记住的用户。 \n * \n * @return 用户是否认证通过或已记住的用户 \n / \n public boolean isUser() \n { \n Subject subject = SecurityUtils.getSubject(); \n return subject != null && subject.getPrincipal() != null; \n } \n\n /* \n * 判断用户是否拥有某个权限 \n * \n * @param permission 权限字符串 \n * @return 用户是否具备某权限 \n / \n public boolean isPermitted(String permission) \n { \n return SecurityUtils.getSubject().isPermitted(permission); \n } \n\n /* \n * 判断用户是否不具备某权限,与 isPermitted逻辑相反。 \n * \n * @param permission 权限名称 \n * @return 用户是否不具备某权限 \n / \n public boolean isLacksPermitted(String permission) \n { \n return isPermitted(permission) != true; \n } \n\n /* \n * 验证用户是否具有以下任意一个权限。 \n * \n * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 \n * @return 用户是否具有以下任意一个权限 \n / \n public boolean hasAnyPermissions(String permissions) \n { \n return hasAnyPermissions(permissions, PERMISSION_DELIMETER); \n } \n\n /* \n * 验证用户是否具有以下任意一个权限。 \n * \n * @param permissions 以 delimeter 为分隔符的权限列表 \n * @param delimeter 权限列表分隔符 \n * @return 用户是否具有以下任意一个权限 \n / \n public boolean hasAnyPermissions(String permissions, String delimeter) \n { \n Subject subject = SecurityUtils.getSubject(); \n\n if (subject != null) \n { \n if (delimeter == null || delimeter.length() == 0) \n { \n delimeter = PERMISSION_DELIMETER; \n } \n\n for (String permission : permissions.split(delimeter)) \n { \n if (permission != null && subject.isPermitted(permission.trim()) == true) \n { \n return true; \n } \n } \n } \n\n return false; \n } \n\n /* \n * 判断用户是否拥有某个角色 \n * \n * @param role 角色字符串 \n * @return 用户是否具备某角色 \n / \n public boolean isRole(String role) \n { \n return SecurityUtils.getSubject().hasRole(role); \n } \n\n /* \n * 验证用户是否不具备某角色,与 isRole逻辑相反。 \n * \n * @param role 角色名称 \n * @return 用户是否不具备某角色 \n / \n public boolean isLacksRole(String role) \n { \n return isRole(role) != true; \n } \n\n /* \n * 验证用户是否具有以下任意一个角色。 \n * \n * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 \n * @return 用户是否具有以下任意一个角色 \n / \n public boolean isAnyRoles(String roles) \n { \n return isAnyRoles(roles, ROLE_DELIMETER); \n } \n\n /* \n * 验证用户是否具有以下任意一个角色。 \n * \n * @param roles 以 delimeter 为分隔符的角色列表 \n * @param delimeter 角色列表分隔符 \n * @return 用户是否具有以下任意一个角色 \n / \n public boolean isAnyRoles(String roles, String delimeter) \n { \n Subject subject = SecurityUtils.getSubject(); \n if (subject != null) \n { \n if (delimeter == null || delimeter.length() == 0) \n { \n delimeter = ROLE_DELIMETER; \n } \n\n for (String role : roles.split(delimeter)) \n { \n if (subject.hasRole(role.trim()) == true) \n { \n return true; \n } \n } \n } \n\n return false; \n } \n\n /* \n * 返回用户属性值 \n * \n * @param property 属性名称 \n * @return 用户属性值 \n */ \n public Object getPrincipalProperty(String property) \n { \n Subject subject = SecurityUtils.getSubject(); \n if (subject != null) \n { \n Object principal = subject.getPrincipal(); \n try \n { \n BeanInfo bi = Introspector.getBeanInfo(principal.getClass()); \n for (PropertyDescriptor pd : bi.getPropertyDescriptors()) \n { \n if (pd.getName().equals(property) == true) \n { \n return pd.getReadMethod().invoke(principal, (Object[]) null); \n } \n } \n } \n catch (Exception e) \n { \n log.error("Error reading property [{}] from principal of type [{}]", property, principal.getClass().getName()); \n } \n } \n return null; \n } \n} \n详细解释以上代码内容:该代码是一个服务类,用于在Thymeleaf模板中调用JavaScript来实现按钮权限的可见性。 \n\n该服务类提供了一系列方法来判断用户是否具备某个权限或角色,并返回相应的结果。 \n\n方法列表: \n\n1. hasPermi(String permission):验证用户是否具备某权限,返回空字符串表示有权限,返回"hidden"表示无权限。 \n\n2. lacksPermi(String permission):验证用户是否不具备某权限,返回空字符串表示无权限,返回"hidden"表示有权限。 \n\n3. hasAnyPermi(String permissions):验证用户是否具有以下任意一个权限,返回空字符串表示有权限,返回"hidden"表示无权限。 \n\n4. hasRole(String role):验证用户是否具备某角色,返回空字符串表示有角色,返回"hidden"表示无角色。 \n\n5. lacksRole(String role):验证用户是否不具备某角色,返回空字符串表示无角色,返回"hidden"表示有角色。 \n\n6. hasAnyRoles(String roles):验证用户是否具有以下任意一个角色,返回空字符串表示有角色,返回"hidden"表示无角色。 \n\n7. isUser():验证用户是否认证通过或已记住的用户,返回true表示认证通过或已记住,返回false表示未认证。 \n\n8. isPermitted(String permission):判断用户是否拥有某个权限,返回true表示有权限,返回false表示无权限。 \n\n9. isLacksPermitted(String permission):判断用户是否不具备某权限,返回true表示无权限,返回false表示有权限。 \n\n10. hasAnyPermissions(String permissions):验证用户是否具有以下任意一个权限,返回true表示有权限,返回false表示无权限。 \n\n11. isRole(String role):判断用户是否拥有某个角色,返回true表示有角色,返回false表示无角色。 \n\n12. isLacksRole(String role):验证用户是否不具备某角色,返回true表示无角色,返回false表示有角色。 \n\n13. isAnyRoles(String roles):验证用户是否具有以下任意一个角色,返回true表示有角色,返回false表示无角色。 \n\n14. getPrincipalProperty(String property):返回用户的属性值,例如用户名、角色等。 \n\n该服务类通过调用Shiro的Subject对象来判断用户的权限和角色,并返回相应的结果。在Thymeleaf模板中可以通过调用这些方法来动态控制按钮的可见性。
原文地址: https://www.cveoy.top/t/topic/pAuM 著作权归作者所有。请勿转载和采集!