"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


原文地址: https://www.cveoy.top/t/topic/pAuA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录