【发布时间】:2010-11-11 10:15:03
【问题描述】:
我在旧环境中工作,其中 LDAP 服务器仅用于身份验证并且不包含任何角色,并且针对包含用户角色映射但没有密码的数据库完成授权。
我的计划是通过扩展 JNDIRealm 来实现一个新的 Tomcat Realm,并重写角色方法来调用封装的 JDBCRealm。
我的领域在 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 返回一个 Principal,它没有预期的角色。同一个 Principal 输入 hasResourcePermission() 并失败,因为它没有 require 角色。显然我遗漏了一些关键代码。
我正在寻找解决方案。我可以尝试扩展 JDBCRealm 并添加 LDAP 身份验证,但这似乎需要更多工作。
我也相信这种 LDAP 身份验证/数据库授权并不是一种不常见的模式。是否已经有替代解决方案?
向 LDAP 添加角色或向数据库添加密码在我的控制范围内不,所以这些不是我的解决方案。
【问题讨论】:
-
是的,我正在使用 Tomcat 6.0.18
标签: tomcat jdbc ldap authorization