package\u0020com.ruoyi.framework.web.service;

import\u0020java.beans.BeanInfo; import\u0020java.beans.Introspector; import\u0020java.beans.PropertyDescriptor; import\u0020org.apache.shiro.SecurityUtils; import\u0020org.apache.shiro.subject.Subject; import\u0020org.slf4j.Logger; import\u0020org.slf4j.LoggerFactory; import\u0020org.springframework.stereotype.Service; import\u0020com.ruoyi.common.utils.StringUtils;

/**

  • RuoYi 首创 js 调用 thymeleaf 实现按钮权限可见性

  • @author ruoyi */ @Service("permission") public\u0020class\u0020PermissionService { private\u0020static\u0020final\u0020Logger\u0020log\u0020=\u0020LoggerFactory.getLogger(PermissionService.class);

    /** 没有权限,hidden 用于前端隐藏按钮 */ public\u0020static\u0020final\u0020String\u0020NOACCESS\u0020=\u0020"hidden";

    private\u0020static\u0020final\u0020String\u0020ROLE_DELIMETER\u0020=\u0020",";

    private\u0020static\u0020final\u0020String\u0020PERMISSION_DELIMETER\u0020=\u0020",";

    /**

    • 验证用户是否具备某权限,无权限返回 hidden 用于前端隐藏(如需返回 Boolean 使用 isPermitted)
    • @param permission 权限字符串
    • @return 用户是否具备某权限 */ public\u0020String\u0020hasPermi(String\u0020permission) { return\u0020isPermitted(permission)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否不具备某权限,与 hasPermi 逻辑相反。无权限返回 hidden 用于前端隐藏(如需返回 Boolean 使用 isLacksPermitted)
    • @param permission 权限字符串
    • @return 用户是否不具备某权限 */ public\u0020String\u0020lacksPermi(String\u0020permission) { return\u0020isLacksPermitted(permission)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否具有以下任意一个权限,无权限返回 hidden 用于隐藏(如需返回 Boolean 使用 hasAnyPermissions)
    • @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
    • @return 用户是否具有以下任意一个权限 */ public\u0020String\u0020hasAnyPermi(String\u0020permissions) { return\u0020hasAnyPermissions(permissions, PERMISSION_DELIMETER)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否具备某角色,无权限返回 hidden 用于前端隐藏(如需返回 Boolean 使用 isRole)
    • @param role 角色字符串
    • @return 用户是否具备某角色 */ public\u0020String\u0020hasRole(String\u0020role) { return\u0020isRole(role)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否不具备某角色,与 hasRole 逻辑相反。无权限返回 hidden 用于前端隐藏(如需返回 Boolean 使用 isLacksRole)
    • @param role 角色字符串
    • @return 用户是否不具备某角色 */ public\u0020String\u0020lacksRole(String\u0020role) { return\u0020isLacksRole(role)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否具有以下任意一个角色,无权限返回 hidden 用于隐藏(如需返回 Boolean 使用 isAnyRoles)
    • @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
    • @return 用户是否具有以下任意一个角色 */ public\u0020String\u0020hasAnyRoles(String\u0020roles) { return\u0020isAnyRoles(roles, ROLE_DELIMETER)\u0020?\u0020StringUtils.EMPTY\u0020:\u0020NOACCESS; }

    /**

    • 验证用户是否认证通过或已记住的用户。
    • @return 用户是否认证通过或已记住的用户 */ public\u0020boolean\u0020isUser() { Subject\u0020subject\u0020=\u0020SecurityUtils.getSubject(); return\u0020subject\u0020!=\u0020null\u0020&&\u0020subject.getPrincipal()\u0020!=\u0020null; }

    /**

    • 判断用户是否拥有某个权限
    • @param permission 权限字符串
    • @return 用户是否具备某权限 */ public\u0020boolean\u0020isPermitted(String\u0020permission) { return\u0020SecurityUtils.getSubject().isPermitted(permission); }

    /**

    • 判断用户是否不具备某权限,与 isPermitted 逻辑相反。
    • @param permission 权限名称
    • @return 用户是否不具备某权限 */ public\u0020boolean\u0020isLacksPermitted(String\u0020permission) { return\u0020isPermitted(permission)\u0020!=\u0020true; }

    /**

    • 验证用户是否具有以下任意一个权限。
    • @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
    • @return 用户是否具有以下任意一个权限 */ public\u0020boolean\u0020hasAnyPermissions(String\u0020permissions) { return\u0020hasAnyPermissions(permissions, PERMISSION_DELIMETER); }

    /**

    • 验证用户是否具有以下任意一个权限。

    • @param permissions 以 delimeter 为分隔符的权限列表

    • @param delimeter 权限列表分隔符

    • @return 用户是否具有以下任意一个权限 */ public\u0020boolean\u0020hasAnyPermissions(String\u0020permissions, String\u0020delimeter) { Subject\u0020subject\u0020=\u0020SecurityUtils.getSubject();

      if\u0020(subject\u0020!=\u0020null) { if\u0020(delimeter\u0020==\u0020null\u0020||\u0020delimeter.length()\u0020==\u00200) { delimeter\u0020=\u0020PERMISSION_DELIMETER; }

       for\u0020(String\u0020permission\u0020:\u0020permissions.split(delimeter))
       {
           if\u0020(permission\u0020!=\u0020null\u0020&&\u0020subject.isPermitted(permission.trim())\u0020==\u0020true)
           {
               return\u0020true;
           }
       }
      

      }

      return\u0020false; }

    /**

    • 判断用户是否拥有某个角色
    • @param role 角色字符串
    • @return 用户是否具备某角色 */ public\u0020boolean\u0020isRole(String\u0020role) { return\u0020SecurityUtils.getSubject().hasRole(role); }

    /**

    • 验证用户是否不具备某角色,与 isRole 逻辑相反。
    • @param role 角色名称
    • @return 用户是否不具备某角色 */ public\u0020boolean\u0020isLacksRole(String\u0020role) { return\u0020isRole(role)\u0020!=\u0020true; }

    /**

    • 验证用户是否具有以下任意一个角色。
    • @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
    • @return 用户是否具有以下任意一个角色 */ public\u0020boolean\u0020isAnyRoles(String\u0020roles) { return\u0020isAnyRoles(roles, ROLE_DELIMETER); }

    /**

    • 验证用户是否具有以下任意一个角色。

    • @param roles 以 delimeter 为分隔符的角色列表

    • @param delimeter 角色列表分隔符

    • @return 用户是否具有以下任意一个角色 */ public\u0020boolean\u0020isAnyRoles(String\u0020roles, String\u0020delimeter) { Subject\u0020subject\u0020=\u0020SecurityUtils.getSubject(); if\u0020(subject\u0020!=\u0020null) { if\u0020(delimeter\u0020==\u0020null\u0020||\u0020delimeter.length()\u0020==\u00200) { delimeter\u0020=\u0020ROLE_DELIMETER; }

       for\u0020(String\u0020role\u0020:\u0020roles.split(delimeter))
       {
           if\u0020(subject.hasRole(role.trim())\u0020==\u0020true)
           {
               return\u0020true;
           }
       }
      

      }

      return\u0020false; }

    /**

    • 返回用户属性值
    • @param property 属性名称
    • @return 用户属性值 */ public\u0020Object\u0020getPrincipalProperty(String\u0020property) { Subject\u0020subject\u0020=\u0020SecurityUtils.getSubject(); if\u0020(subject\u0020!=\u0020null) { Object\u0020principal\u0020=\u0020subject.getPrincipal(); try { BeanInfo\u0020bi\u0020=\u0020Introspector.getBeanInfo(principal.getClass()); for\u0020(PropertyDescriptor\u0020pd\u0020:\u0020bi.getPropertyDescriptors()) { if\u0020(pd.getName().equals(property)\u0020==\u0020true) { return\u0020pd.getReadMethod().invoke(principal, (Object[])\u0020null); } } } catch\u0020(Exception\u0020e) { log.error("Error reading property [{}] from principal of type [{}]", property, principal.getClass().getName()); } } return\u0020null; }
RuoYi 权限服务:基于 Shiro 和 Thymeleaf 实现按钮权限可见性

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

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