5

我正在开发一个非常简单的 Java 应用程序,需要使用用户名和密码进行保护。我必须使用 Active Directory 进行身份验证。我只能允许经过身份验证的用户访问它。我不需要任何类型的组/角色检查来确定用户可能会看到什么。我正在使用 JETTY 来运行应用程序。

我已经尝试了很长一段时间来使用 Jetty 实现 LDAP 登录模块。但是每次我提交登录表单时,都会收到带有“!角色”消息的 403 错误。

HTTP ERROR 403

Problem accessing /JAAS/. Reason:

    !role

提交登录表单时的 Jetty 标准输出:

2013-07-18 19:28:47.035:INFO:oejpjs.LdapLoginModule:Searching for users with filter: '(&(objectClass={0})({1}={2}))' from base dn: DC=mydomain,DC=test,DC=local
2013-07-18 19:28:47.041:INFO:oejpjs.LdapLoginModule:Found user?: true
2013-07-18 19:28:47.042:INFO:oejpjs.LdapLoginModule:Attempting authentication: CN=User Name,OU=ADMIN_HOME,DC=mydomain,DC=test,DC=local

我提交登录表单时的 Jetty 日志文件(我输入的用户名出现在日志中,因此部分身份验证似乎有效):

0:0:0:0:0:0:0:1 -  -  [18/Jul/2013:17:28:38 +0000] "GET /JAAS/ HTTP/1.1" 302 0 
0:0:0:0:0:0:0:1 -  -  [18/Jul/2013:17:28:38 +0000] "GET /JAAS/login.html HTTP/1.1" 304 0 
0:0:0:0:0:0:0:1 -  -  [18/Jul/2013:17:28:47 +0000] "POST /JAAS/j_security_check HTTP/1.1" 302 0 
0:0:0:0:0:0:0:1 - username [18/Jul/2013:17:28:47 +0000] "GET /JAAS/ HTTP/1.1" 403 1362 

声明了 security-constraint 和 security-roke 的 web.xml 的摘录:

<security-constraint>
    <web-resource-collection>
         <web-resource-name>Entire Application</web-resource-name>
         <url-pattern>/*</url-pattern>
    </web-resource-collection>

    <auth-constraint>
       <role-name>*</role-name>
    </auth-constraint>
  </security-constraint>

    <security-role>
        <role-name>*</role-name>
    </security-role>

    <security-role>
        <role-name>Domain Users</role-name>
    </security-role>

    <security-role>
        <role-name>MyLocalGroup</role-name>
    </security-role>

LDAP 登录模块配置文件(ldaploginmodule.conf):

myloginmodule {
   org.eclipse.jetty.plus.jaas.spi.LdapLoginModule required
   debug="true"
   debugNative="true"
   contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
   hostname="ldapserver"
   port="389"
   bindDn="CN=Administrator,CN=Users,DC=mydomain,DC=test,DC=local"
   bindPassword="secret"
   directGroupExtraction="true"
   userGroupAttribute="cn"
   allRolesMode="authOnly"
   userFilter="(objectClass=organizationalPerson)"
   authenticationMethod="simple"
   forceBindingLogin="true"
   userBaseDn="DC=mydomain,DC=test,DC=local"
   userRdnAttribute="cn"
   userIdAttribute="sAMAccountName"
   userPasswordAttribute="unicodePwd"
   userObjectClass="user"
   roleSearch="(member={0})" 
   roleName="cn" 
   roleSubtree="true"
   roleBaseDn="CN=Users,DC=mydomain,DC=test,DC=local";
   };

码头领域配置(my-jaas.xml):

<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <!-- JAAS TEST -->
    <Call name="addBean">
       <Arg>
          <New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
             <Set name="Name">Test JAAS Realm</Set>
             <Set name="LoginModuleName">myloginmodule</Set>

             <Set name="roleClassNames">
                <Array type="java.lang.String">
                   <Item>org.eclipse.jetty.plus.jaas.JAASRole</Item>
                </Array>
             </Set>

          </New>
      </Arg>
    </Call>

</Configure>

最后是jetty启动命令:

java -Xdebug -Djava.naming.referral=follow -Djava.security.auth.login.config=etc/ldaploginmodule.conf -jar start.jar etc/my-jaas.xml

我检查了 Windows 安全事件日志,并且确实看到了我在登录表单中提供的用户登录的成功审核条目。

问题是,我不需要任何角色。我只想执行身份验证并允许所有经过身份验证的用户访问该应用程序。

知道如何仅进行身份验证并避免角色吗?我正在考虑重写 LdapLoginModule 类并强制一个我将在 web.xml 中声明的“虚拟”角色。但我不确定这是否是正确的方法。

4

2 回答 2

0

您的身份验证成功。

由于您希望允许所有经过身份验证的用户访问所有内容,因此您仍然需要像这样做一样保护 URL 模式 /*。您可以使用 RegExpAuthorizationFilter(请参阅https://wiki.apache.org/solr/SolrSecurity)。现在,他们不将此类包含在常规分发中。我在这里找到了代码(https://issues.apache.org/jira/secure/attachment/12572819/SOLR-4470_branch_4x_r1454444.patch)并且很容易编译。

当您配置过滤器时,请指定一个任意(不存在,如 /abcde)具有任何角色的 URL 模式。它的工作方式是查看请求的 URL 是否与此模式匹配。既然没有,就往前走。但是没有更多的规则,并且允许访问。

因此,它需要对所有 URL 进行身份验证,但在成功身份验证后,所有有效 URL 都可以访问。

我的设置是在 Jetty 上运行的 solr 上下文中进行的。但是,我认为我的所有配置都与 web.xml 等标准内容相关联。

于 2014-09-26T20:42:16.533 回答
0

您需要修改 web.xml 以使用此处所示的特殊角色 **:Jetty 身份验证的授权部分

授予任何经过身份验证的用户的访问权限,无论角色如何。这由 <security-constraint> 中 <auth-constraint> 的 <role-name> 的特殊值“**”表示

所以,这就是我的安全约束的样子:

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Secured Solr Admin User Interface</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>**</role-name>
  </auth-constraint>
</security-constraint>
于 2016-03-03T15:20:29.023 回答