2013-07-18 56 views
5

我正在研究一個非常簡單的Java應用程序,需要使用用戶名和密碼進行保護。我必須使用Active Directory進行身份驗證。我只能允許經過身份驗證的用戶訪問它。我不需要任何種類的組/角色檢查來確定用戶可以看到或不看。我正在使用JETTY來運行應用程序。Jetty - JAAS和活動目錄 - 只有身份驗證?

我一直在嘗試相當一段時間來實現與Jetty的LDAP登錄模塊。但每次提交登錄表單時,我都會收到「!role」消息的403錯誤。

HTTP ERROR 403 

Problem accessing /JAAS/. Reason: 

    !role 

碼頭時,我提交登錄表單標準輸出:

​​

碼頭日誌文件時,我提交登錄表單(我在日誌中輸入出現的用戶名,所以認證的一部分,似乎工作):在web.xml的

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> 
    <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> 

最後,碼頭啓動命令:

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

我檢查了Windows安全事件日誌,並且確實看到登錄成功的審覈條目r我在登錄表單中提供的用戶。

事情是,我不需要任何角色。我只想執行身份驗證並允許所有經過身份驗證的用戶訪問應用程序。

任何想法如何我只能進行身份驗證,並避免角色?我正在考慮重寫LdapLoginModule類並強制一個我將在web.xml中聲明的「虛擬」角色。但我不確定這是否是正確的做法。

回答

0

您的驗證成功。

由於您希望允許所有經過身份驗證的用戶訪問所有內容,因此您仍然需要保護網址格式/ *。您可以使用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等標準內容綁定。

0

您需要修改web.xml中使用的特殊作用**如下所示:Authorization section for Jetty Authentication:授予誰被驗證,不管角色的任何用戶

訪問。這是通過特殊的值表示「**」爲<角色名在<安全約束>

所以一個< AUTH-約束>的>,這就是我的安全約束的樣子:

<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>