欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jive中的权限管理 SQLJavaAOP编程 

程序员文章站 2022-07-11 13:57:15
...
比如要createForum,那么jive就会这么做:
大体上的思路是,用代理模式,本来ForumFactory 是没有权限的相关方法和属性的,那么,就把这些功能代理给ForumFactoryProxy ,这样就把任务分开了!


public class ForumFactoryProxy extends ForumFactory {
  ......
  public Forum createForum(String name, String description);
    throws UnauthorizedException, ForumAlreadyExistsException
  {
    if (permissions.get(ForumPermissions.SYSTEM_ADMIN);); {
      Forum newForum = factory.createForum(name,   description);;
      return new ForumProxy(newForum, authorization, permissions);;
    }else {
      throw new UnauthorizedException();;
    }
  }
  ......
}


就是这一句:
 if (permissions.get(ForumPermissions.SYSTEM_ADMIN);); {
             //~~~~~~~~~
       }else {
      throw new UnauthorizedException();;
    }


其中permissions是该代理类的一个属性,是在ForumFactory.getInstance中创建变量的最后一个参数。
该参数是这么得到的:

dbforumFactory.getPermissions(Authorization authorizaton);   {
      
        return permissionsManager.getFinalUserPerms(-1, userID);;
}


所以,得到一个权限是和用户的userid联系起来的,而userid在系统中是由 Authorization类来包装的
所以在
permissionsManager.getFinalUserPerms(-1, userID);;
中,应该查询到数据库层,来对用户的权限进行进一步的处理!
在数据库中,权限相关的表格如下:
    UserPerm  (
                                 forumID
                                 userID 
                                 userType 
                                 permission 
                                 );;

              Userid(userType ,userID );
             两个表是多对多关系


 StringBuffer sql = new StringBuffer(
                "SELECT DISTINCT permission FROM bisUserPerm WHERE "
            );;


            if (forumID == -1); {
                sql.append("forumID IS NULL AND ");;
            }
            else {
                sql.append("forumID=");.append(forumID);.append(" AND ");;
            }
			
			
            if (userID == -1); {
                sql.append("userID IS NULL and userType=");;
                sql.append(BisGlobals.ANONYMOUS);;
            }
            else if (userID == 0); {
                sql.append("userID IS NULL AND userType=");;
                sql.append(BisGlobals.REGISTERED_USERS);;
            }			
            else {
                sql.append("userID=");.append(userID);.append(" AND userType=");;
                sql.append(BisGlobals.USER);;
            }
            ResultSet rs = stmt.executeQuery(sql.toString(););;
            while(rs.next();); {
                int newPerm = rs.getInt(1);;
              //!!!~~~~~
                permissions[newPerm] = true;
            }
        }
return new ForumPermissions(permissions);;

返回了一个包装了权限数组的类ForumPermissions

数组permissions中各个元素的意义如下:
boolean read;                      p[0]
boolean systemAdmin;        p[1]
boolean forumAdmin;          p[2]
boolean userAdmin;              p[3]
boolean groupAdmin;          p[4]
boolean moderateThreads; p[5]
boolean createThread;        p[6]
boolean createMessage;      p[7]
boolean moderateMessages; p[8]

比如要添加一个对各个论坛都有管理员权限systemAdmin
insert into UserPerm(forumID,userID,userType,permission)
              values (NULL,1,3,1);
其中第三位userType有以下三种:
匿名用户,游客,注册用户
分别是 11 ,12, 3

既然权限都创建了,下面权限的检查就不是一件难事了~~;
//就本例来说,创建论坛当然要管理员的权限,所以代码如下:
permissions.get(ForumPermissions.SYSTEM_ADMIN););{
 if (type < 0 || type > 8); {
            return false;
        }
        return values[type];
}

下一篇讨论关于切面编程的权限控制:AOP权限控制技术