我正在研究一個非常簡單的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中聲明的「虛擬」角色。但我不確定這是否是正確的做法。