(project)-用户角色

    企业级系统一般都会涉及到权限的问题,系统里面的功能对有一些用户是开放的,
    对某一些用户是禁止访问的,就好比我们使用PC的时候,某些功能是需要超级管理员才能访问的,而普通的用户是不能访问。
    就上述,我们便于管理对用户的管理,会对一些具有一定权限的用户抽象为一类对象,我们称之为角色。
    也就是说一个用户在系统中会被分配一个角色,而这个角色具有一定的权限的集合。
    根据上面的分析,我们假设刘备是某系统中最高级的用户,所以他会分配最高级的角色给他,
    但是一个用户对应的不只是一个角色,他在系统中是可以扮演多种角色,刘备是皇帝,但他同时也是一名能武的武将。
    然而张飞也是一名武将,所以张飞也具有武将的角色,所以角色是可以由多个用户所对应的,
    而一个用户又可以对应多个角色,所以用户与角色的关系是多对多的关系。
    再来分析角色与权限之间的关系,同一个权限不同的角色可以行使,就好比不同的官员具有的权利就是拿国家的俸禄。
    而同一个角色具备的权限是不止一个的。所以角色与权限的关系也是多对多的关系。
    综上所述,用户,角色,权限他们之间的关系是都是多对多的关系。而角色就相当是一个桥梁的作用,
    抽象了一类具有某些权限的用户。
    数据库表的设计
    1,首先用户表t_user创建是必不可少的
     userId    logonName   userName
    1       liubei      刘备
    2       kongming    孔明  
    2,然后需要一张表来关联用户与角色t_user_role
    seqId    userId     roleId    remark 
    1       1       1     xxxx
    2       2       1     xxxx
    3       2       2     xxxx
    从上面的描述我们说明了用户与角色之间的关系是多对多的关系。而角色的roleId从我们之间创建的数据字典表中查询。
    3,最后我们需要一张表来关联角色和权限之间的关系。
    这个时候会有两种设计方案
    方案一:
    id     roleId    权限code
    1      1        a
    2      1        b
    3      2        a
    方案二:
    id     roleId    权限code
    1      1        abcd
    2      2        begf
    很明显上面的两种方案第二种方案会比较好一点。那么最后的问题来了。
    a,b这些对应到真实字符串是什么意思呢?
    我给出的解决方案就是使用xml文件来描述这些字母具体的代表的意思。

系统权限:
权限code          权限名称            父级权限code            父级权限名称
a                仪器设备管理          device                技术设施维护管理
b                设备校准检修          device                技术设施维护管理
c                设备购置计划          device                技术设施维护管理
d                资料图纸管理         informationAndPager    技术资料图纸管理
    <Function>
            <FunctionCode>a</FunctionCode>
            <FunctionName>仪器设备管理</FunctionName>
            <ParentCode>device</ParentCode>
            <ParentName>技术设施维护管理</ParentName>
    </Function>    
    <Function>
            <FunctionCode>b</FunctionCode>
            <FunctionName>设备校准检修</FunctionName>
            <ParentCode>device</ParentCode>
            <ParentName>技术设施维护管理</ParentName>
    </Function> 
    上面我们分析好了,接下就要进入到业务相关的实现了。
    1,首先是数据的展示(展示所有数据)
    通过一个下拉框来展示所有的角色数据?
    查找数据字典,根据用户角色查找就行了
    展示所有的用户权限?
    使用dom4j来解析xml文件。
public List<XmlObjectBean> readFunctionXml() {
        //找到类路径下Function文件
        ServletContext servletContext = ServletActionContext.getServletContext();
        String path = servletContext.getRealPath("\\WEB-INF\\classes\\Function.xml");
        List<XmlObjectBean> xmlList = new ArrayList<XmlObjectBean>();
        try {
            //使用dom4j解析xml文件
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File(path));
            Element element = document.getRootElement();
            //按照XML文件的Function进行循环,获取每条数据
            for(Iterator<Element> ite=element.elementIterator("Function");ite.hasNext();){
                Element elementObject = ite.next();
                XmlObjectBean objectBean = new XmlObjectBean();
                //获取对应的4个节点(code,name,parentcode,parentname)中的文本内容
                objectBean.setCode(elementObject.elementText("FunctionCode"));
                objectBean.setName(elementObject.elementText("FunctionName"));
                objectBean.setParentCode(elementObject.elementText("ParentCode"));
                objectBean.setParentName(elementObject.elementText("ParentName"));
                xmlList.add(objectBean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xmlList;
    }
    用户查询自己的权限
    首先我们通过用户的roleId这个字段去数据库中查询该roleId对应的权限有哪些。当然我们使用的是方案二。
    取出来是一堆包含字母的字符串。
    然后第二步就是解析xml文件,获取该系统中所有的用户权限,接着转换为JavaBean,比如是XMLObjectBean,
    这个bean的属性对应着从xml文件中取出来的值。同时给这个对象增加一个flag属性,
    这个属性的作用就是在jsp页面显示的时候来判断该该权限是否是用户用有的权限。
    下面的代码是遍历所有的XMLObjectBean对象,
    然后判断我们根据roleId取出来的字符串是否包含了XMLObjectBean对象中的code。
        if(popedomcode.contains(objectBean.getCode())){
            objectBean.setFlag("1");
        }
        else{
            objectBean.setFlag("2");
        }
    总结:企业级应用的粗粒度权限控制是指,当一个用户登录成功的时候,这个系统的哪一些功能是对该用户是可见的,
    或则说哪一些功能模块对该用户是可以访问的。
    当面对这样的业务逻辑的时候,用户角色的设计就起到了一个相当重要的作用啦。当用户登录成功的时候,
    后台的程序就会将用户对象的信息保存到session中,
    除此之外,还会根据用户的id来查询该用户的角色,从而来查询该用户具备的权限,
    所以在jsp页面展示系统功能的时候会判断这些,从而来决定页面是否显示该功能的模块。
<%if(popedom.contains("a") || popedom.contains("b") || popedom.contains("c")){ %>
                        <DIV class="parent" id="KB0Parent">
                            <TABLE cellSpacing="0" cellPadding="0" width="100%" border="0">
                                <TBODY>
                                    <TR height=25 >
                                        <TD align="left" background="${pageContext.request.contextPath }/images/b-info.gif"  vAlign="middle">
                                            &nbsp;&nbsp;&nbsp;<img src="${pageContext.request.contextPath }/images/add.gif" name="imgKB0" width="9" height="9" alt="" border="0" />
                                            &nbsp; <A class="cl" onclick="expand('KB0'); return false" href="#">&nbsp;技术设施维护管理</A>
                                        </TD>
                                    </TR>
                                </TBODY>
                            </TABLE>
                        </DIV>
                    <%} %>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值