Java Web权限管理

上周在学习过程中,对权限管理大体上有了一个模糊的认识,借博客来加深一下整体印象以及各个具体流程

那么,我们现在开始具体操作一下:

前提:eclipse、Spring、SpringMVC、Mybatis、MySQL、easyUI

1.设置表

我在数据库里设置了五张表
这里写图片描述

三张实体类表
用户表:user
角色表:role
菜单表:menu
两张关系表:
用户角色表:user_role
角色菜单表:role_menu

可假想这么一个场景:
一个拥有角色的用户在后台登陆之后,呈现给用户的菜单不同,当然,对应的操作也就不同

这就是我现在对权限管理的了解(因为本人是咸鱼,所以可能理解的很片面,请谅解,以后深入了解会回来修改!)

2.加入一些三个实体类表数据:

user表:
这里写图片描述


role表:
这里写图片描述


menu表:
这里写图片描述


3.配置文件的配置

截图如下:
这里写图片描述

这些代码在最底下会放在链接里
其中diagrams文件夹不用管,属于工作流那块
(1)jdbc.properties是链接数据库文件,我里面配置的是MySQL数据库链接

(2)log4j和log4j2的只是可以在这个大佬中了解到,网址如下:http://blog.csdn.net/fangaohua200/article/details/53561718,log4j2.xml直接放在source目录下就可以直接用,log4j需要配置,他们的作用就是日志记录,在编写代码时的测试执行过程中,可以记录SQL语句执行的具体情况,更好的定位错误来源,当然也可以保存成日志文件查看…等等等等

(3)spring-dao用来配置数据库连接池,通过JNDI数据源里的参数读取jdbc.properties的数据,不过在此之前需要用标签context:property-placeholder读取文件,再定义一个sqlSessionFactory会话工厂(重量级)来创建sqlSession会话,由会话来对数据库进行操作,所以我们只需要在spring-dao里配置sqlSessionFactory即可,然后通过spring-mybatis整合包里的bean中class为MapperScannerConfigurer的扫描dao层里的映射文件**mapper.xml,配置会话工厂为上面提到的(只有设置一个的话可以不写)

所以我们程序员只需要关注xml里的sql语句编写,以及对应名称的dao.java的方法编写就可以了(id要和方法名一样),很是方便。

(4)spring-mvc配置文件《context:annotation-config />这个标签是用来识别我们配置的注解的,不需要手动写四个bean。

《context:component-scan base-package=”“/>表示扫描路径下的注解,还包含context标签的功能

视图解析器:我的理解是return字符串的时候在字符串前后加字符串,节省一些时间和烦恼

文件上传:前端通过form表单(enctype=”multipart/form-data”)上传一个文件,后台接收

(5)spring-transaction:表示spring事务方面的配置,通过创建事务管理器,创建时定义数据源连接起来,再配置目标包里的哪些java文件里的哪些方法,避免脏读、幻读等

(6)SqlMapConfig.xml表示mybatis的运行环境,因为spring中有整合,所以这里只做了一个别名定义

(7)web.xml配置:基本上起到拦截的作用(字体、spring文件的扫描、请求地址的拦截等)

4.创建实体类

这里写图片描述

5.五层架构

这里写图片描述

这里写图片描述

6.思路

每个用户登陆有对应的角色,角色有对应的菜单
分成这两步来结局
第一步:
通过对表user_role的相关操作来决定,比较好实现一些
(详细操作看代码)
比如创建张三这个用户,可以在角色设置这个页面设定张三的角色
第二步:
因为要在页面中显示层状的菜单,所以在实体类中需要这么设置
这里写图片描述

菜单中有许多子菜单是,我这里因为返回给前端是一个含有根节点年的List,然后由前端去拼(略微复杂了),所以后端需要通过递归来得到一整个树,代码如下:

package lanqiao.service.Impl;



import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ResponseBody;

import lanqiao.dao.MenuMapper;
import lanqiao.entity.Menu;
import lanqiao.service.MenuMapperService;

@Service
public class MenuMapperServiceImpl implements MenuMapperService{

    @Autowired
    private MenuMapper menuMapper;

    /**思路:得到一个数据库的混乱菜单,然后通过头结点为根菜单和parent_id一一递归得到完整的树,因为easyui需要返回一个
     * 包含根菜单的list,所以把根菜单这个Menu放到list里**/
    @Override
    public @ResponseBody List<Menu> getAllNodes() {
        List<Menu> list = menuMapper.getAllNodes();
        List<Menu> tree = new ArrayList<Menu>();
        Menu root = new Menu();
        for (Menu menu : list) {
            if(menu.getId() == 1){
                root = menu;
            }
        }   
        getByTree(root, list);
        tree.add(root);
        return tree;
    }

    /*此方法意为得到一个节点的子节点集合,第一个参数为节点,第二个参数为list里的menu子节点范围*/
    public static List<Menu> getTreeByMenu(Menu menu,List<Menu> list){
        List<Menu> children = new ArrayList<Menu>();
        for(int j=0;j<list.size();j++){
            /*如果相等,说明list里的结点为tree[i]的子节点*/
            if(list.get(j).getParent_id() == menu.getId()){ 
                /*list的节点加入tree节点的children中*/
                children.add(list.get(j));
            }
        }
        return children;
    }

    /*此方法意为得到list集合以menu为根节点的完整的树(递归)*/
    public static void getByTree(Menu menu, List<Menu> list) {
        /*得到根节点的子节点集合*/
        List<Menu> children = getTreeByMenu(menu, list);

        if (children == null || children.size() == 0) {
            return;
        } else {
            /*将获得的子节点赋值给根*/
            menu.setChildren(children); 
             /*遍历子节点*/
            for (Menu sonmenu : menu.getChildren()) {
                getByTree(sonmenu,list);
            }
        }
    }

    @Override
    public int getTotal() {
        return menuMapper.getTotal();
    }

    @Override
    public void insert(Map<String, Integer> map) {
        menuMapper.insert(map);
    }

    @Override
    public List<Menu> getMenuByRole(int role_id) {
        List<Menu> list = menuMapper.getMenuByRole(role_id);
        System.out.println("menulist:"+list);
        List<Menu> tree = new ArrayList<Menu>();
        Menu root = new Menu();
        for (Menu menu : list) {
            if(menu.getId() == 1){
                root = menu;
            }
        }
        getByTree(root, list);
        tree.add(root);
        return tree;
    }
}

前端通过字符串拼接页面的方式,拼到easyui的左方

这里写图片描述
这里写图片描述

这样就可以有不同的菜单和不同操作栏了

源代码:https://share.weiyun.com/018c15d7e3ecf5bdc853d26746244577

补充

这周在项目中对新的小思路做了验证,上述的做法很是缺乏通用性,所以我在这里说一下我新的做法,也比较简单好用

首先回顾一下权限分配:不一样的角色有着不一样的菜单列表对应不一样的操作
所以我在后台日常使用session存储登陆用户信息,不过多了一个role__id(可以在实体类加上或者再设置一个session),jsp页面上使用EL、JSTL表达式进行判断筛选,使用
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
<%@page isELIgnored=”false” %>
第一句引入JSTL表达式
第二句让JSP识别el表达式

然后使用JSTL的标签或者里的做判断,符合条件执行或者中的语句

调用后台session直接使用${sessionScope.user.role_id}即可

发布了12 篇原创文章 · 获赞 1 · 访问量 3565
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览