मैं एक विरासत वातावरण में काम कर रहा हूं जहां एक एलडीएपी सर्वर केवल प्रमाणीकरण के लिए उपयोग किया जाता है और इसमें कोई भूमिका नहीं होती है, और डेटाबेस के खिलाफ प्रमाणीकरण किया जाता है जिसमें उपयोगकर्ता-भूमिका मैपिंग होती है, लेकिन कोई पासवर्ड नहीं।एलडीएपी प्रमाणीकरण और जेडीबीसी प्रमाणीकरण के साथ एक टोमकैट दायरे को कार्यान्वित करें
मेरी योजना जेएनडीआईआरएलएएम को विस्तारित करके एक नई टोमकैट दायरे को लागू करना है, और एक एन्सेप्लेटेड जेडीबीसीआरम कॉल करने के लिए भूमिका विधियों को ओवरराइड करना है।
मेरे दायरे 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);
}
}
यह ज्यादातर काम करने के लिए लगता है, प्राधिकरण एलडीएपी, अपेक्षा के अनुरूप जो कोई भूमिका नहीं है से एक प्रधान देता है। वही प्रिंसिपल hasResourcePermission()
में प्रवेश करता है और विफल रहता है क्योंकि इसमें इसकी आवश्यकता नहीं होती है। स्पष्ट रूप से मुझे कुछ महत्वपूर्ण कोड याद आ रहा है।
मैं समाधान ढूंढ रहा हूं। मैं जेडीबीसीआरईएल को विस्तारित करने और एलडीएपी प्रमाणीकरण जोड़ने की कोशिश कर सकता हूं, लेकिन यह अधिक काम की तरह लगता है।
मुझे यह भी विश्वास है कि यह एलडीएपी प्रमाणीकरण/डीबी प्रमाणीकरण असामान्य पैटर्न नहीं है। क्या कोई वैकल्पिक समाधान पहले से उपलब्ध है?
यह पर नियंत्रण नहीं है ताकि एलडीएपी या डीबी में पासवर्ड जोड़ने के लिए मेरे नियंत्रण में, इसलिए वे मेरे लिए समाधान नहीं हैं।
हाँ, मैं बिलाव 6.0.18 –