我正在使用LDAP服務器僅用於身份驗證並且不包含任何角色的遺留環境,並且針對包含用戶角色映射的數據庫執行授權,但沒有密碼。使用LDAP身份驗證和JDBC授權實現Tomcat領域
我的計劃是通過擴展JNDIRealm並重寫角色方法來調用封裝的JDBCRealm來實現新的Tomcat領域。
我的境界是在server.xml中宣稱:
<Realm className="com.example.LdapJdbcRealm"
connectionURL="ldap://ldaphost:389"
resourceName="LDAP Auth"
userPattern="uid={0}, ou=Portal, dc=example, dc=com"
dbConnectionURL="jdbc:oracle:thin:@oracledb:1521:dbname"
userTable="db_user" userNameCol="user_id"
userRoleTable="db_user_role_xref" roleNameCol="role_id" />
這是JNDIRealm & JDBCRealm的標準屬性名稱的組合,用少許變化,因爲它們都使用的ConnectionURL。
package com.example;
import org.apache.catalina.Realm;
import org.apache.catalina.Context;
import org.apache.catalina.deploy.SecurityConstraint;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.realm.JNDIRealm;
import org.apache.catalina.realm.JDBCRealm;
import java.security.Principal;
import java.io.IOException;
public class LdapJdbcRealm extends JNDIRealm implements Realm
{
private JDBCRealm jdbcRealm = new JDBCRealm();
protected static final String info = "com.example.LdapJdbcRealm/1.0";
protected static final String name = "LdapJdbcRealm";
public String getDbConnectionURL() {
return jdbcRealm.getConnectionURL();
}
public void setDbConnectionURL(String dbConnectionURL) {
jdbcRealm.setConnectionURL(dbConnectionURL);
}
public String getUserTable() {
return jdbcRealm.getUserTable();
}
public void setUserTable(String userTable) {
jdbcRealm.setUserTable(userTable);
}
public String getUserNameCol() {
return jdbcRealm.getUserNameCol();
}
public void setUserNameCol(String userNameCol) {
jdbcRealm.setUserNameCol(userNameCol);
}
public String getUserRoleTable() {
return jdbcRealm.getUserRoleTable();
}
public void setUserRoleTable(String userRoleTable) {
jdbcRealm.setUserRoleTable(userRoleTable);
}
public String getRoleNameCol() {
return jdbcRealm.getRoleNameCol();
}
public void setRoleNameCol(String roleNameCol) {
jdbcRealm.setRoleNameCol(roleNameCol);
}
public boolean hasResourcePermission(Request request,
Response response,
SecurityConstraint[]constraints,
Context context) throws IOException
{
return jdbcRealm.hasResourcePermission(request, response, constraints, context);
}
public boolean hasRole(Principal principal, String role) {
return jdbcRealm.hasRole(principal, role);
}
}
這似乎工作,授權從LDAP返回一個委託人,它沒有預期的角色。同一個委託人輸入hasResourcePermission()
並失敗,因爲它沒有要求的角色。很明顯,我錯過了一些關鍵的代碼。
我正在尋找解決方案。我可以嘗試擴展JDBCRealm並添加LDAP身份驗證,但是這看起來像更多的工作。
我也相信這個LDAP認證/ DB授權並不罕見。是否有可用的替代解決方案?
這是而不是在我的控制範圍內添加角色到數據庫的LDAP或密碼,所以這些都不是我的解決方案。
是的,我在Tomcat 6.0.18 – 2009-07-16 16:18:20