我正在开发一个使用Oracle的java Web应用程序。 Web应用程序使用Glassfish AS并通过已配置的连接池连接到Oracle。
执行用户身份验证的客户要求是尝试在提供的用户登录名/密码下创建oracle会话,如果成功,则用户已成功登录。
我想到的第一个想法是写一个函数,它接受登录/密码,执行散列并将哈希与存储的哈希进行比较。但我担心,如果我这样做,我有一些陷阱,比如哈希算法可以随时更改,oracle帐户可以锁定,所以我必须执行额外的检查等等。
除了创建Oracle会话之外,有没有人可以建议我检查oracle用户身份验证的可靠方法?
答案 0 :(得分:0)
我不会在第一时间这样做 我会使用其中的众多工具之一在Web应用程序中进行身份验证 更重要的是,我将创建连接池的db用户 - 代理用户,并且永远不会提供或检查应用程序中用户的数据库密码(如this asktom post中所述)。
但是,因为客户要求执行用户身份验证是尝试创建oracle会话,那么为什么不这样做呢?
从网络应用程序访问DBA_USERS
视图中的密码听起来非常糟糕......
答案 1 :(得分:0)
我有另一个(非常糟糕)的想法 -
您可以在plsql中创建一个动态创建DBLink给用户的功能
然后你将尝试(动态地再次)使用该dblink查询DUAL
表,
如果它有效 - 返回ok,否则返回不正常。
然后再次(动态地)删除dblink。
应该看起来像这个匿名阻止 -
DECLARE
res NUMBER := 1;
BEGIN
EXECUTE IMMEDIATE 'create database link temp_dblink connect to user identified by password using ''dbname''';
BEGIN
EXECUTE IMMEDIATE 'select 1 from dual@temp_dblink';
EXCEPTION
WHEN others THEN
res := 0;
END;
ROLLBACK;
dbms_session.close_database_link('temp_dblink');
EXECUTE IMMEDIATE 'drop database link temp_dblink';
END;
这当然不能“按原样”,
你需要绑定“用户名”和“密码”,
需要为每个用户/尝试(网络会话)使tmp_dblink的名称不同,
还有更多...
另请注意,这可能会在您的数据库中留下不需要的dblink等等
我不建议使用此解决方案
(我为它的运动写了更多...)
答案 2 :(得分:0)
我通过使用以下代码解析glassfish域配置文件$GLASSFISH_ROOT/domains/domain1/domain.xml
来解决问题:
private String getGlassfishConfigParameterJdbcUrl() {
String instanceRoot = System.getProperty("com.sun.aas.instanceRootURI");
URI configUri = null;
try {
configUri = new URI(instanceRoot);
File configFile = new File(configUri.getPath(), "config" + File.separator + "domain.xml");
XmlNode node = XmlNode.fromFile(configFile);
return node.getNode("domain/resources/jdbc-connection-pool[@name=\"GLASSFISH_DB_POOL_NAME\"]/property[@name=\"URL\"]").getAttribute("value");
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
XmlNode是我的xml解析实用程序类。