LDAPサーバーが認証にのみ使用され、ロールは含まれておらず、ユーザーロールマッピングを含むデータベースに対して承認が行われるレガシー環境では、パスワードはありません。LDAP認証とJDBC認証を使用してTomcatレルムを実装する
私の計画は、JNDIRealmを拡張し、カプセル化されたJDBCRealmを呼び出すロールメソッドをオーバーライドすることで、新しいTomcat Realmを実装することです。
私のレルムはserver.xmlで宣言されている:彼らは両方のconnectionURLを使用するよう
<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" />
は、これはほとんど変化して、JNDIレルム& JDBCレルムのための標準的なプロパティ名を組み合わせたものです。
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認証が珍しいパターンではないとも考えています。既に利用可能な代替ソリューションがありますか?
それはDBにLDAPやパスワードに役割を追加するために私のコントロール内ではないので、それらは私のためのソリューションではありません。
はい、私は、JDBCレルムかかわら呼び出すためのTomcat 6.0.18 –