Shiro的权限、角色、用户管理

权限管理

分析表设计

树形结构的权限设计。
关于编号,除了根节点,其他的节点编号都是三位数

Id:0 根节点 pId:null –根节点
Id:101 基础数据 pId:0 –一级节点,三位数,但要求是101开始
Id:101001 -从二级节点开始,三位数,从001开始
Id:101001001

三位数,可以容纳很多节点菜单
父点是0,一定是一个根
1开头的id或者0的pid,认为一定是一级菜单节点
001的规则,可以自动推算出下一个节点的编号101001+1=101002>tostring

列表查询

添加保存

FunctionAction:

        //保存功能权限
        @Action(value="function_save",results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/function.jsp")})
        public String save(){
            //调用业务层
            functionService.saveFunction(model);
            return SUCCESS;
        }

FunctionService:

        /**
         * 保存功能权限
         * @param function
         */
        public void saveFunction(Function function);

FunctionServiceImpl

        @Override
        public void saveFunction(Function function) {
            //-----页面的下拉的值需要处理easyui-combobox,不选,会返回"";
            //不选意味着是一级菜单,根节点是0
            if(function.getFunction()!=null && StringUtils.isBlank(function.getFunction().getId()) ){
                function.getFunction().setId("0");
            }

            //----编号主键:手动生成
            //父id
            Function parentFunction = function.getFunction();
            String pId =parentFunction.getId();     

            //不管父id是多少,查询出父id下面的所有的子项,取所有子项id的最大值+1
            //调用dao,查询父节点的所有子节点的最大id值
            String maxId=functionDAO.findMaxIdByPId (parentFunction);
            //当前id
            String id=null;
            if(StringUtils.isBlank(maxId)){
                //处理一级节点
                if(pId.equals("0")){
                    id="101";
                }else{
                    //还没有子节点
                    id=pId+"001";
                }
                //一般的系统,对于一些基础数据,一般是要求有的,初始化数据。
                //所以根一般是有的

            }else{
                //返回值:一级节点104,二级101004
                //计算id
                //只需要加1
                //当前id
                id=String.valueOf(Integer.valueOf(maxId)+1);
            }

            //设置id
            function.setId(id);

            functionDAO.save(function);
        }

FunctionDAO:

        /**
         * 根据父编号,获取最大id编号
         * @param pId
         * @return
         */
        @Query(value="select max(id) from t_auth_function where pid = ? ",nativeQuery=true)
        public String findMaxIdByPId(String pId);

角色管理

列表查询

添加角色并关联权限

查zTree的API

    //加载权限树形列表
        $.post("${pageContext.request.contextPath}/function_list.action",function(data){
            $.fn.zTree.init($("#functionTree"), setting, data);
        },"json");

通过js获取选中的节点,手动拼接为id字符串(逗号分割),并将其放入form表单的隐藏域中。

        // 点击保存
        $('#save').click(function(){
            //表单校验
            if($("#roleForm").form("validate")){
                //处理获取所有选中节点,将其拼接为逗号分割字符串,放入隐藏域
                var treeObj = $.fn.zTree.getZTreeObj("functionTree");
                var nodes = treeObj.getCheckedNodes(true);
                var array = new Array();
                $(nodes).each(function(){
                    array.push(this.id);
                });
                var functionIds = array.join(",");
                $("#functionIds").val(functionIds);

                //提交表单
                $("#roleForm").submit();
            }
        });

RoleAction

            //保存角色(关联权限)
            @Action(value="role_save" ,results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/role.jsp")})
            public String save(){
                //调用业务层
                roleService.saveRole(model,functionIds);

                return SUCCESS;
            }

            //属性驱动
            private String functionIds;
            public void setFunctionIds(String functionIds) {
                this.functionIds = functionIds;
            }

RoleServiceImpl

        @Override
        public void saveRole(Role role, String functionIds) {
            //---保存角色
            roleDAO.save(role);
            //---授权
            //权限不为空
            if(StringUtils.isNotBlank(functionIds)){
                String[] functionIdArray = functionIds.split(",");
                for (String functionId : functionIdArray) {
                        //快照更新:建立多表关系-自动向中间表插入数据(必须持久态关联持久态)
                    Function function = functionDAO.findOne(functionId);
                    //角色关联权限
                    role.getFunctions().add(function);
                }
            }
        }

用户管理

UserAction

    //保存用户,同时关联角色
    @Action(value="user_save",results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/userlist.jsp")})
    public String save(){
        //调用业务层保存
        userService.saveUser(model,roleIds);
        return SUCCESS;
    }

    //属性驱动获取角色列表
    private String roleIds;
    public void setRoleIds(String roleIds) {
        this.roleIds = roleIds;
    }

UserServiceImpl

        @Autowired
        private RoleDAO roleDAO;

        @Override
        public void saveUser(User user, String roleIds) {
            //----保存用户
            //加密密码
            user.setPassword(MD5Utils.md5(user.getPassword()));
            userDAO.save(user);
            //----关联角色
            if(StringUtils.isNotBlank(roleIds)){
                String[] roleIdArray = roleIds.split(",");
                for (String roleId : roleIdArray) {
                    //持久态
                    Role role = roleDAO.findOne(roleId);
                    //快照:用户关联角色
                    user.getRoles().add(role);
                }
            }
        }

列表查询

根据用户权限动态生成系统菜单 ##

FunctionAction

        /**
         * 菜单显示
         * @return
         */
        @Action("function_showmenu")
        public String showmenu(){
            //从shiro中获取当前登录用户
            Subject subject = SecurityUtils.getSubject();
            User loginUser = (User) subject.getPrincipal();
            //根据用户获取权限
            List<Function> functionList = functionService.findFunctionByUser(loginUser);
            //将结果压入栈顶
            pushToValueStack(functionList);
            return JSON;
        }

FunctionServiceImpl

        /**
         * 获取用户权限
         */
        @Override
        public List<Function> findFunctionByUser(User user) {
            //判断用户性质
            if (user.getUsername().equals("admin")) {
                //超级管理员,获取所有权限
                return functionDao.findMenuForAdmin();
            } else {
                //普通用户
                List<Function> functionList = functionDao.findMenuForUser(user);
                return functionList;
            }
        }

FunctionDAO

        /**
         * 查询普通用户的菜单
         * @param user
         * @return
         */
        @Query("from Function f inner join fetch f.roles r inner join fetch r.users u where u= ? and f.generatemenu ='1' order by f.zindex")        
        public List<Function> findMenuForUser(User user);

        /**
         * 查询超级管理员的菜单
         * @return
         */
        @Query("from Function f where f.generatemenu = '1' order by f.zindex asc")

        public List<Function> findMenuForAdmin();

查询菜单时,有个隐藏条件就是generatemenu =’1’,而且还要排序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值