本文包含主要内容:在数据库,操作系统中都用到的权限管理方式——用户角色
写本文的目的:根着老师一起做OA系统,总结一下开发过程中值得注意和应用的知识点
文章分类:学习总结
读者类型:熟悉JAVA,SSH相关知识
主要参考:陈涛老师课堂授课及代码
学科类别:JAVA WEB开发
这是一个功能完善的办公系统,包括的主要功能有,
登陆系统,系统根据不同人的身份出现他可以操作的模块。用户可以对保个模块进行管理。权限管理是许多系统中的一个安全问题,本系统采用了用户角色管理方式:我们给不同的角色赋予不同的权力,然后把角色分配给用户,用户根据自己的权利有合法的操作
1 ,用ACL来定义权限,在数据库中存储权限
我们是用角色来管理用户的权限,因此我们只需要给角色赋于权限。定义ACL类来管理权限,
public class ACL {
private int id;//ACL的主键
private String principalType; // 主体类型 角色
private int principalSn; // 主体标识 角色id
private int resourceSn; // 资源标识 模块id
// 授权状态 用后四位bit 来表示 c创建r读取u修改d删除
private int aclState;
//设置根除,,permission取值 0 1 2 3 设置aclState的每一位
public void setPermission(int permission,boolean yes){
int tmp = 1;
tmp = tmp << permission;
if(yes == true){
aclState += tmp;
}else{
aclState ^= tmp;
}
}
//得到每一位的权限:如果那一位上允许我们返回一,否则返回0
public int getPermission(int permission){
int tmp = 1;
tmp = tmp << permission;
tmp &= aclState;
if(tmp != 0){
return 1;
}
return 0;
}
}
2 存取管理权限
public class ACLManagerImpl extends AbstractManager implements IACLManager{
public void addOrUpdatePermission(String principalType, int principalSn}//保存或更新权限,
public void delPermission(String principalType, int principalSn, int resourceSn) //删除权限
public boolean hasPermission(int userId, int resourceSn, int permission) 某个用户对某个资源是否有某项权力
public List searchModules(int userId) {
Map temp = new HashMap();
//根据用户的ID,以及UsersRolesG表的记录,得到以ID用户的所有角色编号
String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u where u.id = ? order by ur.orderNo desc";
List aclIds =getSession()
.createQuery(hql)
.setParameter(0, userId)
.list();
//根据角色编号,得到所有的的权限列表ACL
for(Iterator it = aclIds.iterator();it.hasNext();){
Integer rid = (Integer)it.next();
List<ACL> acls =
getSession().createQuery("select acl from ACL acl where acl.principalType = ? and acl.principalSn = ?")
.setParameter(0, ACL.TYPE_ROLE)
.setParameter(1, rid)
.list();
//把权限的资源编号取出放到TEMP中,重复的被过滤出去
for(Iterator<ACL> its = acls.iterator();its.hasNext();){
ACL acl = (ACL)its.next();
temp.put(acl.getResourceSn(), acl);
}
}
/ //对于有些资源,用户不能读,所以我们要把他从,MAP中删除
List delReources = new ArrayList();
//将所有map key value返回
Set entries = temp.entrySet();
for(Iterator it = entries.iterator();it.hasNext();){
Map.Entry entry = (Map.Entry)it.next();
ACL acl = (ACL)entry.getValue();
if(acl.getPermission(Permission.READ) == ACL.ACL_NO){
delReources.add(entry.getKey());
}
}
for(Iterator it = delReources.iterator();it.hasNext();){
Object key = (Object)it.next();
temp.remove(key);
}
//如果MAP中被删除完,我们就返回空的LIST
if(temp.isEmpty()){
return new ArrayList();
}
//MAP中还有值,我们就返回以MAP中的资源
String searchModules = "select m from Module m where m.id in(:ids)";
return getSession().createQuery(searchModules)
.setParameterList("ids", temp.keySet())
.list();
}
这种管理方式具有很高的
本文暂时没有评论,来添加一个吧(●'◡'●)