企业级系统一般都会涉及到权限的问题,系统里面的功能对有一些用户是开放的,
对某一些用户是禁止访问的,就好比我们使用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() {
ServletContext servletContext = ServletActionContext.getServletContext();
String path = servletContext.getRealPath("\\WEB-INF\\classes\\Function.xml");
List<XmlObjectBean> xmlList = new ArrayList<XmlObjectBean>();
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(path));
Element element = document.getRootElement();
for(Iterator<Element> ite=element.elementIterator("Function");ite.hasNext();){
Element elementObject = ite.next();
XmlObjectBean objectBean = new XmlObjectBean();
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">
<img src="${pageContext.request.contextPath }/images/add.gif" name="imgKB0" width="9" height="9" alt="" border="0" />
<A class="cl" onclick="expand('KB0'); return false" href="#"> 技术设施维护管理</A>
</TD>
</TR>
</TBODY>
</TABLE>
</DIV>
<%} %>