原有的一个CRM系统,使用的是 oracle, NHibernate 在链接数据库时,采用了 oracle 的该应用的DBA作为链接用户,这对系统的安全非常非常的不好。
作为调整,为该应用创建了一个新的客户端用户,使其拥有最小权限。在这种复合权限的应用中,会产生很多的问题。在这里我们逐一列举。
ORACLE版本: 11g1
NHibernate: 2.1.2.4
.Net: 2.x/3.x/4.x
1. 创建应用用户角色
create role app_user_role not identified;
///对象的权限列表很长,此处简写了
grant select/delete/insert on app_dba.tables/sequence/function/procedure to app_user_role;
///
grant connect to app_user_role;
grant create session to app_user_role;
2. 创建应用用户,并附角色
create user app_user identified by 'app user password here'
default tablespace XXXX
temporary tablespace XXXXXX
profile default
account unlock;
grant app_user_role to app_user;
3. 尝试 app_user 登录
C:\Users\Administrator>sqlplus app_user@appdb
SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 9月 2 12:18:48 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
输入口令:
ERROR:
ORA-01045: user APP_USER lacks CREATE SESSION privilege; logon denied
[说明]
上面的错误说明,connect, create session 被付给了角色 app_user_role, 而 app_user并没能从角色中获得这两个权限,所以我们需要重新设定权限:
revoke connect from app_user_role;
grant create session to app_user;
从命令行上,app_user 现在已经可以成功登录了.
为什么把权限 create session 赋给 app_user_role,然后把app_user_role再赋给app_user,却不起作用呢?这个问题可以参考 4. 启动应用程序.... ,他们是属于同一类型的问题:app_user_role必须作为用户的默认角色。
4. 启动应用程序,却得到了 ORA-00942: 表或视图不存在 的错误
可以在 sqlplus 中重现此问题:
SQL> connect app_user@appdb
SQL> select table_name from all_tables where owner='APP_ADMIN';
TABLE_NAME
------------------------------
SQL>
我们看到,app_user 确实看不到 app_admin 的表,这是怎么回事呢? 问题在 app_user_role 付给 app_user 后,还缺少一步:
alter user app_user default role app_user_role;
让 app_user 的默认权限角色是 app_user_role 很关键。我并不记得oracle8/9中是否必须这样设置了(那是很久以前的事了)