0

JBoss 7.1 で LDAP 認証を設定する必要がありますが、資格情報を使用しようとすると問題が発生します。私の構成はそのようなものです:

<login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required">
    <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
    <module-option name="java.naming.provider.url" value="ldap://domain.com:389"/>
    <module-option name="java.naming.security.authentication" value="simple"/>
    <module-option name="java.naming.referral" value="follow"/>
    <module-option name="baseFilter" value="(uid={0})"/>
    <module-option name="baseCtxDN" value="ou=people,dc=domain,dc=com"/>
    <module-option name="throwValidateError" value="true"/>
    <module-option name="principalDNPrefix" value="suid="/>
    <module-option name="principalDNSuffix" value=",ou=people,dc=domain,dc=com"/>
    <module-option name="searchTimeLimit" value="5000"/>
    <module-option name="searchScope" value="ONELEVEL"/>
</login-module>

「uid」はログインに使用するユーザー名 (「名字」) を表し、「suid」は一意の ID を表します。したがって、そのように Java クラスで LDAP を使用しようとすると、次のように動作します。

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
env.put("java.naming.provider.url", "ldap://domain.com:389");
env.put("java.naming.security.authentication", "simple");
env.put("java.naming.security.principal", "suid=123456789001234,ou=people,dc=st,dc=com");
env.put("java.naming.referral", "follow");
env.put("java.naming.security.credentials", "123456");
DirContext directoryContext = new InitialDirContext(env);

しかし、JBoss が uid を suid に変換する方法を設定できません (たとえば、「姓」を「123456789001234」に変換するなど)。

4

2 に答える 2

0

LDAP サーバーで次の階層を作成します。

+ o=your-organization-name (partition) 
   + ou=users (organizationalUnit) 
      - uid=your-id-user (inetOrgPerson), add userPassword attribute 
   + ou=groups (organizationalUnit) 
      - cn=your-user-role (groupOfNames), add the uid before created

JBoss 7.1 のセキュリティ ドメイン (standalone.xml):

 <subsystem xmlns="urn:jboss:domain:security:1.1">
            <security-domains>
             ...
 <security-domain name="SecurityRealm" cache-type="default">
                    <authentication>
                        <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required">
                            <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
                            <module-option name="java.naming.provider.url" value="ldap://host-ldap-server:port-ldap-server/"/>
                            <module-option name="java.naming.security.authentication" value="simple"/>
                            <module-option name="principalDNPrefix" value="uid="/>
                            <module-option name="principalDNSuffix" value=",ou=users,o=your-organization-name"/>
                            <module-option name="rolesCtxDN" value="ou=groups,o=your-organization-name"/>
                            <module-option name="uidAttributeID" value="member"/>
                            <module-option name="matchOnUserDN" value="true"/>
                            <module-option name="roleAttributeID" value="cn"/>
                            <module-option name="roleAttributeIsDN" value="false"/>
                        </login-module>
                    </authentication>
                </security-domain>
            </security-domains>

jboss-web.xml で

<security-domain>SecurityRealm</security-domain>

そして最も重要なことは、ユーザーがこのページへのアクセスを許可されているかどうかです。(web.xml):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <!-- Protected Areas -->
    <security-constraint>
         <display-name>Protected</display-name>
        <web-resource-collection>              
            <url-pattern>url-pages-you-want-protect</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>your-user-role</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <!-- Validation By Form -->
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>your-login-page</form-login-page>
            <form-error-page>your-error-page</form-error-page>
        </form-login-config>
    </login-config>

    <!-- Allowed Roles -->
    <security-role>
        <role-name>your-user-role</role-name>
    </security-role>
</web-app>

接続をテストするには、これを使用します。

public class LoginModulesTestCase extends TestCase
{
   static
   {
      try
      {
         Configuration.setConfiguration(new TestConfig());
         System.out.println("Installed TestConfig as JAAS Configuration");
      }
      catch(Exception e)
      {
         e.printStackTrace();
      }
   }
   /** Hard coded login configurations for the test cases. The configuration
    name corresponds to the unit test function that uses the configuration.
    */
   static class TestConfig extends Configuration
   {
      public void refresh()
      {
      }

      public AppConfigurationEntry[] getAppConfigurationEntry(String name)
      {
         AppConfigurationEntry[] entry = null;
         try
         {
            Class[] parameterTypes = {};
            Method m = getClass().getDeclaredMethod(name, parameterTypes);
            Object[] args = {};
            entry = (AppConfigurationEntry[]) m.invoke(this, args);
         }
         catch(Exception e)
         {
         }
         return entry;
      }

      AppConfigurationEntry[] testLdapExample1()
      {
         String name = "org.jboss.security.auth.spi.LdapLoginModule";
         HashMap options = new HashMap();
         options.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
         options.put("java.naming.provider.url", "ldap://host-ldap-server:port-ldap-server/");
         options.put("java.naming.security.authentication", "simple");
         options.put("principalDNPrefix", "uid=");
         options.put("principalDNSuffix", ",ou=users,o=your-organization-name");         
         options.put("rolesCtxDN", "ou=groups,o=your-organization-name");
         options.put("uidAttributeID", "member");
         options.put("matchOnUserDN", "true");
         options.put("roleAttributeID", "cn");
         options.put("roleAttributeIsDN", "false");
         AppConfigurationEntry ace = new AppConfigurationEntry(name,
         AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
         AppConfigurationEntry[] entry = {ace};
         return entry;
      }
   }

   public LoginModulesTestCase(String testName)
   {
      super(testName);
   }

   @Test
   public void testLdapExample1() throws Exception
   {
      System.out.println("testLdapExample1");
      UsernamePasswordHandler handler = new UsernamePasswordHandler("your-uid", "your-uid-password".toCharArray());
      LoginContext lc = new LoginContext("testLdapExample1", handler);
      lc.login();

      Subject subject = lc.getSubject();
      System.out.println("Subject: "+subject);

      Set groups = subject.getPrincipals(Group.class);
      assertTrue("Principals contains your-uid", subject.getPrincipals().contains(new SimplePrincipal("your-uid")));
      Group roles = (Group) groups.iterator().next();
      assertTrue("your-uid-role is a role", roles.isMember(new SimplePrincipal("your-uid-role")));

      lc.logout();
   }

}

ねえ、私はあなたに何か尋ねなければなりません:

  • あなたの LDAP ホストは domain.com ですか?
  • そしてあなたのldapポート= 389?
  • LDAP サーバーはどこにインストールされていますか?
  • あなたの組織の LDAP パーティションは ou=people,dc=domain,dc=com ですか?
  • suid を使用しないでください。私が示した例のように uid を使用してください。uid は一意です。
  • uid は ou=people,dc=domain,dc=com にありますか?
  • このコードはサンプル コピーですか?
  • 自分のマシンで Apache Directory サーバーを lpad サーバーとして使用しています。あなたのサーバーは誰ですか?
  • あなたのサーバーはどこにありますか?

Apache Directory Server の設定をお手伝いしたい場合は、stackoverflow に質問して、jboss 7.x および ldap stackoverflow タグを追加するだけです。

于 2013-01-12T18:42:18.573 に答える