📄 sdbms.cpp
字号:
//判断当前用户是否有权执行Set Child Role命令
if (!HaveSystemRight(SR_SET_CHILD_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
if (m_pCurDB->SetChildRole(strParentRoleName, strChildRoleName))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:设置某角色为当前数据库的顶层角色
***********************************************************************/
BOOL CSdbms::DoSetTopRole(CString strRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_SET_TOP_ROLE, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM); //不能使用系统定义的角色名
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行Set TOP Role命令
if (!HaveSystemRight(SR_SET_TOP_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
if (m_pCurDB->SetTopRole(strRoleName))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:把用户加入到当前连接的数据库上的一个角色中
***********************************************************************/
BOOL CSdbms::DoAddUserToRole(CString strUserName, CString strRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_ADD_ROLE, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN); //不能使用系统定义的角色名
CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
CSdbms_User *pUser;
if (!GetUser(strUserName, &pUser)) //检查用户名是否已存在
{
sprintf(g_strMsg, "用户%s不存在", strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
if ((IsOwnDbsaRole(pUser->m_nUserID)) && (strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) != 0))
{
sprintf(g_strMsg, "用户%s属于DBSA角色,不能把DBSA用户加入到任何其他角色中", pUser->m_strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
BOOL bRtn = FALSE;
if (strRoleName.CompareNoCase(SYSTEM_ROLE_SYSTEM) == 0) //加入到SYSTEM角色中
{
//判断当前用户是否有权把用户加到SYSTEM角色中
if (!HaveSystemRight(SR_ADDDEL_SYSTEM_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = InsertRoleUserList(pUser, m_pSystemRole);
}
else if (strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) == 0) //加入到DBSA角色中
{
//判断当前用户是否有权把用户加到DBSA角色中
if (!HaveSystemRight(SR_ADDDEL_DBSA_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = InsertRoleUserList(pUser, m_pDbsaRole);
}
else if (strRoleName.CompareNoCase(SYSTEM_ROLE_DBA) == 0) //加入到DBA角色中
{
//判断当前用户是否有权把用户加到DBA角色中
if (!HaveSystemRight(SR_ADDDEL_DBA_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = InsertRoleUserList(pUser, m_pDbaRole);
}
else
{
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行Add Role命令
if (!HaveSystemRight(SR_ADD_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
bRtn = m_pCurDB->AddUserToRole(pUser, strRoleName);
}
if (bRtn)
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:把用户从一个角色中删除
***********************************************************************/
BOOL CSdbms::DoDelUserFromRole(CString strUserName, CString strRoleName)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_DEL_ROLE, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN); //不能使用系统定义的角色名
CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
CSdbms_User *pUser;
if (!GetUser(strUserName, &pUser)) //检查用户名是否已存在
{
sprintf(g_strMsg, "用户%s不存在", strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
BOOL bRtn = FALSE;
if (strRoleName.CompareNoCase(SYSTEM_ROLE_SYSTEM) == 0) //从SYSTEM角色中删除
{
if (!HaveSystemRight(SR_ADDDEL_SYSTEM_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = RemoveRoleUserList(pUser, m_pSystemRole);
}
else if (strRoleName.CompareNoCase(SYSTEM_ROLE_DBSA) == 0) //从DBSA角色中删除
{
if (!HaveSystemRight(SR_ADDDEL_DBSA_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = RemoveRoleUserList(pUser, m_pDbsaRole);
}
else if (strRoleName.CompareNoCase(SYSTEM_ROLE_DBA) == 0) //从DBA角色中删除
{
if (!HaveSystemRight(SR_ADDDEL_DBA_ROLE, m_pCurUser, NULL))
return FALSE;
bRtn = RemoveRoleUserList(pUser, m_pDbaRole);
}
else
{
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行Del Role命令
if (!HaveSystemRight(SR_DEL_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
bRtn = m_pCurDB->DelUserFromRole(pUser, strRoleName);
}
if (bRtn)
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
//通知界面更新数据
g_msg.UpdateUser();
g_msg.UpdateRole();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:改变用户在当前连接的数据库上的角色为新的角色(不影响其他数据库及全局角色)
***********************************************************************/
BOOL CSdbms::DoChangeRole(CString strUserName, CString strRoleNames)
{
ASSERT(m_pCurUser);
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_CHANGE_ROLE, m_pCurDB);
CSdbms_User *pUser;
if (!GetUser(strUserName, &pUser)) //检查用户名是否已存在
{
sprintf(g_strMsg, "用户%s不存在", strUserName);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行Change Role命令
if (!HaveSystemRight(SR_CHANGE_ROLE, m_pCurUser, m_pCurDB))
return FALSE;
m_pCurDB->DelAllRole(pUser); //删除所有以前的角色
CString strRoleName[100];
int nRoleCount = ParseStrings(strRoleNames, strRoleName); //解析出角色名
for (int i=0; i<nRoleCount; i++)
{
CantUseRoleName(strRoleName[i], SYSTEM_ROLE_LOGIN); //不能使用系统定义的角色名
CantUseRoleName(strRoleName[i], SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName[i], SYSTEM_ROLE_OWNER);
m_pCurDB->AddUserToRole(pUser, strRoleName[i]);
}
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
return TRUE;
}
/**********************************************************************
功能:把一个系统权限授权给当前数据库中的一个自定义角色
***********************************************************************/
BOOL CSdbms::DoGrant(SystemRight nSystemRight, CString strRoleName)
{
ASSERT(m_pCurUser);
ASSERT(!strRoleName.IsEmpty());
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_GRANT_SYSTEM, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM); //不能授权给系统预定义角色
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行系统权限GRANT命令
if (!HaveSystemRight(SR_GRANT_SYSTEM, m_pCurUser, m_pCurDB))
return FALSE;
//进一步判断
if ((nSystemRight == SR_CREATE_DATABASE || nSystemRight == SR_DROP_DATABASE) &&
(!IsOwnDbaRole(m_pCurUser->m_nUserID) || !IsOwnSystemRole(m_pCurUser->m_nUserID)))
{
sprintf(g_strMsg, "用户%s无权授权%s命令", m_pCurUser->m_strUserName, g_strSystemRight[nSystemRight]);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
if (m_pCurDB->Grant(nSystemRight, strRoleName, m_pCurUser->m_nUserID))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:把一个系统权限从当前数据库中的一个自定义角色中收回授权
***********************************************************************/
BOOL CSdbms::DoRevoke(SystemRight nSystemRight, CString strRoleName)
{
ASSERT(m_pCurUser);
ASSERT(!strRoleName.IsEmpty());
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_REVOKE_SYSTEM, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM); //不能从系统预定义角色收回授权
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBA);
CantUseRoleName(strRoleName, SYSTEM_ROLE_LOGIN);
CantUseRoleName(strRoleName, SYSTEM_ROLE_GUEST);
CantUseRoleName(strRoleName, SYSTEM_ROLE_OWNER);
//检查当前是否有连接的数据库
if (m_pCurDB == NULL)
{
g_msg.ThrowErrorMsg("当前没有数据库被打开");
return FALSE;
}
ASSERT(m_pCurDB->m_bInit && m_pCurDB->m_pRole);
//判断当前用户是否有权执行系统权限REVOKE命令
if (!HaveSystemRight(SR_REVOKE_SYSTEM, m_pCurUser, m_pCurDB))
return FALSE;
//进一步判断
if ((nSystemRight == SR_CREATE_DATABASE || nSystemRight == SR_DROP_DATABASE) &&
(!IsOwnDbaRole(m_pCurUser->m_nUserID) || !IsOwnSystemRole(m_pCurUser->m_nUserID)))
{
sprintf(g_strMsg, "用户%s无权收回授权%s命令", m_pCurUser->m_strUserName, g_strSystemRight[nSystemRight]);
g_msg.ThrowErrorMsg(g_strMsg);
return FALSE;
}
if (m_pCurDB->Revoke(nSystemRight, strRoleName, m_pCurUser->m_nUserID))
{
//设置审计记录中操作成功属性为真
if (bAuditSuccess)
m_audit.SetOperateSuccess();
return TRUE;
}
else
return FALSE;
}
/**********************************************************************
功能:把在某个表的某些列上的权限授予给某个角色
参数说明:
nObjectRight, //表上的操作编号
strTableName, //表名
strFieldNames, //列名
strRoleName, //要授予的角色名
bCanGrant, //可否把权限授予给其他人
pCondition, //谓词条件的语法树
***********************************************************************/
BOOL CSdbms::DoGrant(ObjectRight nObjectRight, CString strTableName, CString strFieldName,
CString strRoleName, BOOL bCanGrant/*=FALSE*/, CSdbms_Condition *pCondition/*=NULL*/)
{
ASSERT(m_pCurUser);
ASSERT(!strRoleName.IsEmpty());
//审计
BOOL bAuditSuccess = m_audit.Audit(m_pCurUser, SR_GRANT_OBJECT, m_pCurDB);
CantUseRoleName(strRoleName, SYSTEM_ROLE_SYSTEM); //不能授权给系统预定义角色
CantUseRoleName(strRoleName, SYSTEM_ROLE_DBSA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -