shiro权限控制与动态添加树形菜单

1.shiro处理权限流程

1.1 从数据库查询所有权限交给shiro管理

	  List<Permission> permissions = permissionService.findAll();
      for (Permission permission : permissions) {
          mp.put(permission.getUrl(), "perms["+permission.getSn()+"]");
      }

1.2 查询当前用户具备权限

 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //授权方法
        Employee employee =(Employee) principalCollection.getPrimaryPrincipal();
        //根据用户名得到权限代码
        //从数据库查询当前用户的所有的权限
       // Set<String> permissions = getPermissionsByUsername(employee.getUsername());
        Set<String> permissionSet = permissionService.findPermissionByEmployeeId(employee.getId());
        //shiro就会自己取进行权限的比较
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.setStringPermissions(permissionSet);
        return authorizationInfo;
    }

1.3 没有权限时,ajax怎么返回

(1)写一个过滤器 覆写PermissionsAuthorizationFilter

(2)重写 onAccessDenied方法

​ 方法里面判断如果是ajax请求 就直接返回json格式,

​ 否则就走原来的格式,返回页面

1.4 页面权限的按钮控制

添加标签来控制页面的按钮是否显示

 <shiro:hasPermission name="employee:delete">
             <a href="#" data-method="delete" plain="true"   class="easyui-linkbutton" iconCls="icon-remove">删除</a>
  </shiro:hasPermission>

2 动态添加树形菜单

现在菜单写死了,写到json文件里面,但是如果如果想添加一个菜单,还有修改的json文件,比较麻烦,所有把菜单存入数据库,读取数据库就OK

2.1 menu对象的确定

写了Menu domain对象

public class Menu extends BaseDomain {

    private String name;//菜单名称
    private String url; //路径
    private String icon; //图标

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="parent_id")
    @JsonIgnore //忽略json 在展示json格式的 parent不会展示出来 会造成死循环
    private Menu parent;

    @Transient //这个是临时属性,不交给jpa管理 ,自己来维护 -- 手动添加子菜单
    private List<Menu> children = new ArrayList();

    //兼容esayui的菜单树[id:1,text:'xxx']
    public String getText(){
        return this.name;
    }
    //setget...
    }

2.2 service构造json的方法

public List<Menu> findMenuByLoginUser(Long employeeId) {
        List<Menu> menus = new ArrayList();
        //查询当前用户的所有的子菜单
        List<Menu> subMenus = menuRepository.findByLoginUser(employeeId);
        //循环子菜单  2,3,4,5    1   (7 8)  6
        for (Menu subMenu : subMenus) {
            //从子菜单里面拿到父菜单 6
            Menu parentMenu = subMenu.getParent();
            if(!menus.contains(parentMenu)) {
                menus.add(parentMenu);
            }
            parentMenu.getChildren().add(subMenu);//[1,[2,3,4,5],6 [7,8]]
        }

        return menus;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值