【问题标题】:Is there a way to make OpenSSO/OpenAM talk to Database for its authentication and authorization?有没有办法让 OpenSSO/OpenAM 与数据库对话以进行身份​​验证和授权?
【发布时间】:2011-04-17 15:52:16
【问题描述】:

我们希望使用 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 与数据库数据存储区对话以获取其权利和策略决策?

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

感谢和问候,

桑巴舞

【问题讨论】:

    标签: authentication authorization opensso


    【解决方案1】:

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

    博客的内容, Rahul Ghose

    OpenAM 数据库与 MySql 的连接

    这篇文章是很久以后的。在创建单点登录实现方面,我真的被我的项目所困扰。我正在使用一款令人惊叹的软件 OpenAM,以前称为 OpenSSO,目前由 Forgerock 社区维护。

    我的设置:我在 Centos 上使用 Tomcat 和 Mysql 和 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 中的此页面(访问控制 -> 领域(您的选择)-> 数据存储区 -> 新建):

    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:关于数据库配置的邮件列表条目

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-12
            • 2015-10-12
            • 2018-04-03
            • 1970-01-01
            • 2011-09-27
            相关资源
            最近更新 更多