有没有办法让OpenSSO / OpenAM与数据库通信以进行身份​​验证和授权?

时间:2010-09-27 08:32:58

标签: authentication authorization opensso

我们希望将OpenSSO用于我们的身份验证和授权需求,但我更喜欢它   与数据库而不是默认的LDAP数据存储区通信。我们发现OpenAM 9.0版本中存在一个实验性数据库数据存储区。

但是,它似乎只关注身份验证和用户生命周期管理。没有规定在数据库数据存储中存储权利信息。我们希望将整个身份验证和授权信息保留在数据库中。

我甚至可以自定义代码以使OpenAM与数据库通信以评估策略并决定用户可以对特定资源执行或不执行的操作。顺便说一句,我们有要求保护几种资源,而不仅仅是页面(URL)。

我查看了代码,发现基本数据存储类如 com.sun.identity.entitlement.opensso.DataStore.java com.sun.identity.entitlement.PolicyDataStore.java , 的 com.sun.identity.entitlement.opensso.OpenSSOPolicyDataStore.java

都与基于LDAP的实现紧密绑定。

是否有任何接口或抽象类可以自定义以使opensso与数据库数据存储区进行对话以获取其权利和策略决策?

如果有些人可以提供我可以开始使用的任何提示,我甚至愿意花费几个月的时间来完成这项工作。

谢谢和问候,

桑巴

4 个答案:

答案 0 :(得分:4)

这可能有助于身份验证:http://rahul-ghose.blogspot.com/2014/05/openam-database-connectivity-with-mysql.html

博客内容 Rahul Ghose

与MySql的OpenAM数据库连接

这篇文章经过很长一段时间。在创建单点登录实现时,我一直坚持我的项目。我正在使用一个非常棒的软件OpenAM,以前的OpenSSO,目前由Forgerock社区维护。

我的设置:我使用Tomcat和Mysql以及在Centos上运行的OpenAM 11.0.0

首先,首先为您的操作系统安装mysql-connector-java,然后你应该得到一个jar文件。这是我在盒子上的内容:

# rpm -ql mysql-connector-java | grep jar
/usr/share/java/mysql-connector-java-5.1.17.jar
/usr/share/java/mysql-connector-java.jar
Now copy this to your tomcat installation directory. At "$CATALINA_HOME/lib" and restart tomcat.

如果您跳过上述步骤,则会遇到如下错误:

java.lang.InstantiationException: JdbcSimpleUserDao.initialize: failed to load driver class jdbcDriver=com.mysql.jdbc.Driver exception=com.mysql.jdbc.Driver
    at com.sun.identity.idm.plugins.database.JdbcSimpleUserDao.initialize(JdbcSimpleUserDao.java:274)
    at com.sun.identity.idm.plugins.database.DatabaseRepo.initialize(DatabaseRepo.java:429)
    at com.sun.identity.idm.server.IdRepoPluginsCache.constructIdRepoPlugin(IdRepoPluginsCache.java:475)
    at com.sun.identity.idm.server.IdRepoPluginsCache.addIdRepo(IdRepoPluginsCache.java:353)
    at com.sun.identity.idm.server.IdRepoPluginsCache.removeIdRepo(IdRepoPluginsCache.java:251)
    at com.sun.identity.idm.server.IdRepoPluginsCache.organizationConfigChanged(IdRepoPluginsCache.java:646)
    at com.sun.identity.sm.ServiceConfigManagerImpl.notifyOrgConfigChange(ServiceConfigManagerImpl.java:493)
    at com.sun.identity.sm.ServiceConfigManagerImpl.objectChanged(ServiceConfigManagerImpl.java:453)
    at com.sun.identity.sm.SMSNotificationManager.sendNotifications(SMSNotificationManager.java:289)
    at com.sun.identity.sm.SMSNotificationManager$LocalChangeNotifcationTask.run(SMSNotificationManager.java:365)
    at com.iplanet.am.util.ThreadPool$WorkerThread.run(ThreadPool.java:306)

接下来,连接到您的mysql服务器并在OpenAM中导航到此页面(访问控制 - > Realm(您选择的) - >数据存储 - >新):

Step 1 of 2: Select type of Data store

Name: My_Database_Repo
Type: 
   Active Directory
   Active Directory Application Mode (ADAM)
   Database Repository (Early Access)  <--- TICK THIS ONE
   Generic LDAPv3
   OpenDJ
   Sun DS with OpenAM schema
   Tivoli Directory Server

现在点击下一步。我们只需要更改以下字段:

Password for Connecting to database: 
Password for Connecting to database (confirm):
JDBC driver url: jdbc:mysql://127.0.0.1:3306/test
Connect this user to database: root

输入您的mysql数据库用户的密码和用户名。还要更改mysql数据库安装的IP地址,端口和数据库名称,以引用您专门为OpenAM保留的表。 OpenAM将在此数据库中使用2个表,您需要在此处指定名称:

User Configuration
    *Database User Table Name: opensso_users

在这里:

Group configuration
    Database Membership table name: groups

因此对于用户表,您需要将列创建为VARCHAR,不知何故整数对我不起作用。您可以在此表中找到表中需要的列名:

List of User Attributes Names in Database

uid
ChangePassword
sunIdentityMSISDNNumber
mail
sn
manager
preferredlocale
iplanet_am_user_password_reset_force_reset
givenname
iplanet_am_user_alias_list

我删除了所有iplanet_ *属性,并在MySql数据库中创建了一个用户表。然后使用以下sql脚本为默认配置创建数据库条目:

create database test;
use test; 
create table opensso_users (uid varchar(50), userpassword varchar(50), inetuserstatus integer, cn varchar(50),mail varchar(50),manager varchar(50), preferredlocale varchar(50), givenname varchar(50), telephonenumber varchar(50), telephonenumber varchar(50), telephonenumber varchar(50), sn varchar(50)  );
create table groups (uid varchar(50), group_name varchar(50), cn varchar(50));

现在将您的用户添加到此表中,然后去,去,去!

注意:我无法让群组使用此配置,如果您有任何专业知识,请告诉我

另请阅读:

1:https://wikis.forgerock.org/confluence/display/openidm/JDBC+Repository

2:数据库配置上的邮件列表条目

答案 1 :(得分:0)

研究类似的问题。找到OpenAM的自定义身份验证模块:https://wikis.forgerock.org/confluence/display/openam/Write+a+custom+authentication+module

答案 2 :(得分:0)

我可以通过编写一个新的opensso存储库来使身份验证和授权指向数据库(或任何其他存储支持)。我是通过编写一个扩展com.sun.identity.idm.IdRepo的新类来完成的。这很长,因为新类必须重载很多IdRepo抽象方法。

但是这允许我在opensso中创建一个新的数据存储区。为了避免opensso内部数据存储的问题,我在新领域使用了我的新数据存储区。

我的代码基于opensso数据库和ldap存储库示例代码(在opensso源中可用)。

答案 3 :(得分:0)

OpenAM配置存储目前仅限于LDAP目录,并且权利存储在配置存储中,因此您可能会发现此要求很难实现。如果你仍然 想要使用DataBase作为后端,你可能必须重构很多代码,即使这样你也可能发现它根本不可行。

配置主要由com.sun.identity.sm.SMSObject实现检索/修改,因此您必须提供一个适用于数据库的自定义impl。