首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

OA中用户角色权限有关问题

2011-12-13 
OA中用户角色权限问题一个用户进入OA,我怎么知道他是普通员工,还是经理,还是总经理呢,然后对应用业务操作

OA中用户角色权限问题
一个用户进入OA,我怎么知道他是普通员工,还是经理,还是总经理呢,然后对应用业务操作不同呢?比如说普通员工可以看到自己的数据,经理可以看到自己部门所有员工的,总经理不仅可以看到整个公司所有员工的,还可以对每位员工的数据进行删,改,查。
我现在又一个User表
UId UName DeptID(部门ID)
1 张三 1
2 李四 2
3 王五 2
4 赵六 3
5 赵七 3

部门表:Dept
DId DName DParentID(父节点ID)
1 总经办 0
2 销售部 0
3 人事部 0

最终的树形展示:

总经办
  |________张三(总经理)
  |
销售部
  |________李四 (部门经理)
  |
  |________王五(普通员工)
  |
销售部
  |________赵六 (部门经理)
  |
  |________赵七(普通员工)
  
可能有人会说,我可以再添加一个角色表(Role)
RoleID RoleName
1 总经理
2 部门经理
3 普通员工

这样虽然有了个角色概念,用1,2,3代表不同的角色,那难道让我在程序里判断if(角色ID=="1")...那如果这个公司又增加了一个新的角色,比如说:秘书,用4表示,那我对应整套OA只要是设计的权限部门的都要再加一个判断,判断是否等于4吗?这些我觉得是不可行的。
可能是我的思路问题,但是我不知道像这样的系统,是怎么处理权限的问题的,根据不同的角色,进行不同权限的业务逻辑。

我看了,网上免费的OA系统,他好像是给Role分配功能权限,意思就是比如说这个OA系统有三个功能,新闻发布,新闻查看,新闻管理,然后他根据不同的角色,比如说让总经理都有这些功能,让普通员工只有新闻查看的这个功能。虽然这样的做法在一定程度上解决了权限的问题,但是如果 “新闻管理”这个功能,所有角色都应该有这个功能,不同的是,不同角色看到的信息是不一样的,比如说总经理就看到所有人的,并且可以删,经理看到自己本部门的,员工只能看自己的。这个时候我就没法知道他到底是部门经理呢?还是什么呢?


希望高手能给我个思路,解决办法!谢谢各位咯!

[解决办法]
基于角色的权限管理
http://www.cnblogs.com/badboy2008/articles/579633.html
-----------------------------
 典型的简单权限分配系统方法介绍
[url=http://www.cnblogs.com/jackyrong/archive/2008/10/22/1316645.html[/url]
一个struts1+spring+hibernate的典型权限系统的设计思路,归纳小结如下,特别适用于简单场合的,比如某个单位下,有直属单位及部门的
情况.数据表设计如下
user表:
userid:
username:
unitid: //所属单位的id
deptid://所属部门的id
status:0表示为普通用户 1:表示为该单位的最高管理员
 
role角色表
 
id:编号
rolename:角色名
content:角色的具体分配权限
memo:备注
unit:所属的单位id
userright表:(user与role是多对多,因此需要该表)
id:
userId:
roleid:
 
unit表(单位表)
unitId:单位编号
unitName:单位名
fatherId:上级单位ID (如果为0的时候,表示为最上层的单位)
allFatherId:保存所有关联的父级单位的id路径)
unitType :表明是单位还是部门, 0:单位, 1:部门
 
举个例子说明下:
unitid unitname fatherid allfatherid unittype
1 根单位 0 0
2 根单位部门1 1 ,1 1
3 直属单位1 1 ,1 0
4 直属单位1的部门1 3 ,1,3 1
 
AddressGroup 单位群组表:这个表的作用在于,可以将某几个单位归为一个群组,那么比如在发文的时候,可以一次同时发送文件给该群组下的
所有的单位
groupId 群组编号:
groupName 群组名称
content:包含的单位id,比如某个群组有单位1,3的
 
二 在页面层中,类似如下:
<td rowspan=4>发文管理</td>
<td><input name="box" type="checkbox" value="211">发文登记</td>
<td><input name="box" type="checkbox" value="212" >创建</td>
<td><input name="box" type="checkbox" value="213" >修改</td>
<td width=15%><input name="box" type="checkbox" value="215" >查看</td>
.......就是很多个上面的形式,
然后用javascript把用户所选的都记录下来
function check(){
if (thisForm.roleName.value == ""||trim(thisForm.roleName.value)==""){
alert("请填写角色名称!");
thisForm.roleName.focus();
return false;
}
thisForm.content.value=getRole();
thisForm.submit();
}
//将角色用逗号连接起来
function getRole(){
var allCHK = document.body.all.tags('INPUT');
var lstr = "" ;
for(i=0;i<allCHK.length;i++){
if(allCHK[i].type.toUpperCase()=="CHECKBOX" && allCHK[i].checked==true){
if (lstr==""){


lstr = allCHK[i].value;}
else {lstr= lstr + "," + allCHK[i].value; }
}
}
return lstr ;
}
同样要埋藏一个hidden域来保存咯
<input type=hidden name=content value="$!role.getContent()">
 
三 action层的保存
/**
* 保存角色信息
*/
 public void saveRole(Role role)throws Exception{
String where = " from Role where roleName='"+role.getRoleName()+"' and unitId = "+role.getUnit().getUnitId()+" and roleId<>"+role.getRoleId();
List list = roleDao.find(where);
if(list.size()>0){
throw new LogicException("本单位中已经存在" + role.getRoleName() + "这个角色");
}
roleDao.save(role);
 }
 
四 编辑角色时,把某个角色读取出来,回显在页面上
public ActionForward viewRole(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
String roleId = request.getParameter("roleId");
if(!("".equals(roleId))){
Role role = roleManager.getRole(roleId);
request.setAttribute("role",role);
}
return mapping.findForward("viewRole");
 }
 
在JSP页面中,可以读出来 ,可以在body的onload函数中,读init();
<input type=hidden name="content" value="$!role.getContent()">
function init(){
 var allCHK = document.body.all.tags('INPUT');
 var content = thisForm.content.value;
 if(content != ""){
var strIds = content.split(",");
for(k=0;k<strIds.length;k++){
for(i=0;i<allCHK.length;i++){
if(allCHK[i].type.toUpperCase()=="CHECKBOX" && allCHK[i].name=="box" && allCHK[i].value==strIds[k]) {
allCHK[i].checked=true ;
}
}
}

 }
}
 
五 权限的判断
一般在一个菜单里面,可以在导航菜单中予以体现
下面是velocity的一个例子
#set ($RECVDOC_LIST = 111)
#set ($RECVDOC_SIGN = 112)
#set ($RECVDOC_TUIHUI = 113)
#set ($RECVDOC_READ = 114)
#set ($RECVDOC_LOOKFOR = 115)
就是设定某些功能的权限编码
 然后是service层的,取出某个用户的权限:
public Vector getPermissionIDsByUserId(int userId) throws Exception{
int i;
Vector v=new Vector();
String sql=" from Role where roleid in (select roleId from UsersRight where userId="+userId+")";
List list = roleDao.find(sql);
Iterator iter = list.iterator();
while(iter.hasNext()){
Role role = (Role)iter.next();
String strIds[] = StringUtils.split(role.getContent(),",");
for(i = 0; i < strIds.length; i++){
v.add(strIds[i]);
}
}
return v;
}
}
 
public boolean hasPermission(int permissionId) throws Exception{
String permissionIdStr=Integer.toString(permissionId);
boolean retValue = false;
if(permission == null) {

//返回该用户的权限
permission = rmg.getPermissionIDsByUserId(u.getUserId().intValue());
}
if(permissionIdStr.length()==3){ retValue=permission.contains(permissionIdStr);}
 
if(permissionIdStr.length()==1)
{
int i;
for(i=0;i<permission.size();i++)
{
if (((String)permission.elementAt(i)).startsWith(permissionIdStr))
{
retValue=true;
i=permission.size();
}
}
}
return retValue;
}
  
 菜单拦的判断
 
 var p;
#if($userinfo.hasPermission(1))
p = new createPanel('recvdoc','收文管理');
#if($userinfo.hasPermission($RECVDOC_SIGN_LIST) || $userinfo.hasPermission($RECVDOC_SIGN_PRINT) || $userinfo.hasPermission($RECVDOC_SIGN_READ) || $userinfo.hasPermission($RECVDOC_SIGN_LOOKFOR))


p.addButton('$request.getContextPath()/menu/images/recvdoc.gif','待签收文件','changePage("10");');
#end
 
比如上面的收文管理模块中,有很多个子功能,这里首先传入到userinfo.hasPermission(1))去判断,
这时会执行if(permissionIdStr.length()==1)
{
的判断,
假如该用户有收文管理下的某个子功能的权限,比如111,则通过该验证(注意 i=permission.size();跳出FOR了,返回true值,因此该
用户可以看到"收文管理"这个大的菜单,至于该用户能具体看到下面的哪些子功能,则通过
if(permissionIdStr.length()==3){ retValue=permission.contains(permissionIdStr);} 去判断了.


[解决办法]
可以参考一下

SQL code
use OASystemgocreate table Users(             --用户UserID int identity(1,1) primary key,UserName varchar(30) not null,PassWord varchar(30) not null)gocreate table Roles(              --角色RoleID int identity(1,1) primary key,RoleName varchar(30) not null,RoleDescription varchar(100))gocreate table Modules(    --菜单ModuleID int identity(1,1) primary key,ModuleName varchar(30) not null,ModuleUrl varchar(200) null,ParentID int not null,ModulePosition int not null,ImageUrl varchar(100))gocreate table UserRoleRel(       --用户和角色关联表ID int identity(1,1) primary key,UserID int not null references Users(UserID),RoleID int not null references Roles(RoleID))GOcreate table RoleModuleRel(     --角色和菜单功能关联表ID int identity(1,1) primary key,RoleID int not null references Roles(RoleID),ModuleID int not null references Modules(ModuleID))
[解决办法]
User表 用户表
UserID
UserName
UserRoleID

UserRole表 用户组表
UserRoleID
UserRoleName

Right表 权限表
RightID
RightName

UserRight表 用户权限表
UserID
RightID
RightValue

RoleRight表 用户组权限表
UserRoleID
RightID
RightValue

当发现在UserRight表中没有关于特定权限的记录时,再去检查RoleRight表,当然,这套系统还有一些附属的表,但是基本上可以满足你的第一个需求了,至于你所说的部门经理只能看到本部门的记录,你就必须额外在权限上面细分多个RightValue出来,必须0时没有权限、1时查看本部门、2时查看所有……以此类推
[解决办法]
角色 是具有相同权限的一类人员,而你的秘书 经理是职位

你要理清HR方面的知识 
组织架构分为 集团 公司 部门 
职位 可以下挂在每个组织下面,每个组织必须有负责人,他的下属必须下挂在他下面 这样就解决你 权限查看范围的问题 负责人可以看他的下属

角色 可以包含很多类的权限 比如菜单的,数据的 范围的 

每个人员都有 部门 公司 集团的ID 还有职位 和角色的id

登陆以后把这些信息写入session



[解决办法]

[解决办法]
还有待完善的....
SQL code
1.1  UserInfo表表名列名           数据类型(精度范围)        空/非空        约束条件                                        其他说明UserID          Varchar(50)              非空            种子,自增1                         用户唯一标识UserName    Varchar(50)              非空                                                     用户名称PassWord    Varchar(50)              非空                                                     用户密码Gender             Varchar(4)              非空                                                     性别UserPhone    Varchar(20)                                                            用户电话MobilePhone    Varchar(20)                                                                移动电话Address           Varchar(200)                                                            用户住址RoleId               Int                      非空                                                      用户角色UserStateId       Int                      非空        表UserState的外键,对应UserStateId 字段    用户状态1.2  UserState表表名列名            数据类型(精度范围)       空/非空       约束条件    其他说明UserStateId         Int             非空    种子,自增1    1:正常状态;0:被屏蔽UserStateName    Varchar(50)             非空                  状态名称 1.3  RoleInfo表表名列名            数据类型(精度范围)   空/非空      约束条件    其他说明RoleId                 int         非空    种子,自增1    角色idRoleName    Varchar(50)         非空                 角色名称RoleDesc    Varchar(50)                            角色描述1.4  RoleRight表表名  列名                数据类型(精度范围)          空/非空         约束条件                             其他说明RoleRightId        Int                         非空        种子,自增1                          角色权限idRoleId                Int                      非空    表RoleInfo的外键,对应RoleId           角色idPopedomId        Int                         非空    表PopedomInfo的外键,对应PopedomId    权限Id1.5  UserRole表表名列名          数据类型(精度范围)    空/非空    约束条件                     其他说明UserRoleId    Int               非空           种子,自增1                    用户角色IdUserId            Int               非空    表UserInfo的外键,对应UserId    用户IdRoleId       Int               非空      表RoleInfo的外键,对应RoleId    角色Id1.6  PopedomInfo表表名列名          数据类型(精度范围)    空/非空       约束条件        其他说明PopedomId    Int             非空       种子,自增1       权限IdPopedomName  Varchar(50)         非空                          权限名称Path         Varchar(50)    非空                           路径 


[解决办法]

探讨
还有待完善的....

SQL code
1.1 UserInfo表
表名
列名 数据类型(精度范围) 空/非空 约束条件 其他说明
UserID Varchar(50) 非空 种子,自增1 用户唯一标识
UserName Varchar(50) 非空 用户名称
PassWord Var…

[解决办法]
权限表--关联表--角色表--关联表--用户表
[解决办法]
功能字典表
权限角色表
权限角色权限表
员工表
员工所属权限角色表
中间可以加个权限组的表来控制权限角色的权限
[解决办法]
要定义两种角色,一种是用来控制OA中的操作菜单的,另外一种是在流转审批时使用的.
前者按大众化的来定义就可以了,后者要多加一个字段来区别,是否是共享角色,和非共享角色.
例如:部门经理是共享角色,所以每人提效请假单时,根据自定义流程,直接找本部门经理.
董事长是非共享角色,直接提取,不需要单独找.
[解决办法]
探讨
引用:
有谁能给出详细的 数据库表的设计吗?说清楚各个表之间的么,真的谢谢了! 
 
上班ing.....暂无法给出详细解答 参考:ASP.NET后台权限 OA系统设计方案

[解决办法]
这个还是相对比较容易的。。。
主要你要理解
有时间我们交流一下吧。。。可以给我写的给你看看~~
shevc@live.com
[解决办法]
其实 微软对于你这种问题已经有很好的解决的方案了!

详细请查阅MSDN 成员资格管理!

现在大项目 都是用 系统本身的解决方案!

这样的好处就是有官方技术支持!

此解决方案是ASP.NET2.0新加的!

好好去学学功能很强大!
[解决办法]
to:wanhot
不论你水平高到什么程度,都不要笑话那些你觉得水平很烂的人.
我看了你两个帖子,都是在嘲笑别人,不知道这样做对你有什么好处?
说话的时候不要总想着怎么攻击别人,CSDN只是一个游戏,要玩这个游戏就要遵循游戏规则,不遵守的就走开,不要玩.
就算别人回答的不对,你也没有必要抓住不放,就说星星很菜之类的,星星的确很菜,只是这个游戏玩的久了攒了点分而已,没必要仇富的.
我原本不想说什么的,可是你在我们家涵子这乱说话惹她生气就不行,你是大牛,这里不需要你,走开.

另一个帖子:http://topic.csdn.net/u/20090521/12/558914f0-ad7d-43f6-9e3c-b0bbb7fb91c0.html

热点排行