扩展WebLogic Server Admin Console的功能可使具备把自定义应用程序的管理结合到中央位置上的能力。
我们将讨论这样一种情况:通过添加MBean属性来修改dev2dev中提供的Custom Security Provider,这些属性可以管理目前很难被硬编码到Custom Security Provider MBean中的 TxDataSource、DatabaseUser、DatabaseUserPassword、DatabaseDriver和DatabaseURL。
扩展控制台有两种方式:第一种方式是让WebLogic Server控制台试图呈现一个细节窗口,该窗口基于添加到DbSampleAuthenticator.xml文件的自定义MBean属性,该文件可以用来创建MBean。第二种方式是创建一个web应用程序,其中包含了控制台在调用Custom Security Provider MBean时需要显示的类文件和JSP。本文将对这两种方法加以详细讨论。
添加简单的数据类型
首先,让我们讨论一下仅把代表简单数据类型的自定义属性添加到DbSampleAuthenticator xml文件中的情况,并看一看当我们想访问数据库的时候如何访问这些属性值,不管是在WebLogic Server初始化期间(此时数据源不可用)还是在随后期间(用户访问安全资源时已经通过了认证)。
我将从添加到一个从http://dev2dev/codelibrary/code/sec_rdbms.jsp中找到的实例开始。首先要做的是给MBean添加属性,这样我们才可以通过weblogic.Admin命令行,或者通过 JavaBean或JSP中的JMX代码访问这些属性。
在DbSampleAuthenticator.xml文件中,添加以下可写入的String属性:
- DatabaseUser
- DatabaseUserPassword
- DatabaseURL
- DatabaseJDBCDriver
- DataSourceName
<MBEANATTRIBUTE Name = "DatabaseUser" Type = "java.lang.String"
Writeable = "true" Default = ""scott""/>
属性添加完成之后,您可以运行ant来检验根目录中的build.xml。build.xml会出现很多种情况,花费一些时间来深入研究一下这个文件是非常值得的,因为MBeans被创建、jar并复制到 /server/lib/mbeantypes目录。如果WebLogic Server已经在运行,必须重新启动才可以验证自定义MBean。只要WebLogic Server在运行,您就会看到一个类似于图1的窗口,它是控制台中一种新增的Custom Security Authenticator,叫做 DbSampleAuthenticator(注意:这是WebLogic Server 8.1)。当您选择DbSampleAuthenticator时,您就会看到类似于图2的窗口。

图1

图2
在创建了DbSampleAuthenticator之后,点击Details选项卡,您应该看到图3。

图3
如果您查看为DbSampleAuthenticatorMBean生成的Java代码,您就会看到所添加各种属性的 getter和setter。
(到底如何访问这些新的MBean属性呢?为了更好地了解MBeanMaker的工作方式, 请参看《Developing Security Providers for Weblogic Server》[http://edocs/wls/docs81/dvspisec/ design.html#1171038])。
我们如何传送该MBean?
诚然,访问这些新属性的方法有很多种。第一种方法是通过JMX调用,这将在后面加以讨论;第二种是通过Security Provider的LoginModule。第一个需要检验和修改的文件是DbSampleAuthenticationProviderImpl.java,WebLogic Server初始化时会调用该文件。
public void initialize(ProviderMBean providermbean,
SecurityServices securityservices)
我们将修改AppConfigurationEntry getConfiguration,通过公共的AppConfigurationEntry getLoginModuleConfiguration()调用。一种配置选项映射被传递到LoginModule中,LoginModule 是添加新MBean的最佳位置,因此随后可以访问属性。上述就是我们在将MBean传递到 LoginModule的initialize方法时所需要做的工作。现在我们将看看如何访问属性。
访问MBean的属性
LoginModule的实现将被更改为检索Map变量中所传递的ProviderMBean。(参看http://edocs/wls/docs81/dvspisec/atn.html#1153042 《Implement the JAAS LoginModule Interface》)。从这里,我将MBean属性传递给负责认证用户的方法(参见清单1和2)。
清单1:DbSample AuthenticationProviderImpl.java
public void initialize(ProviderMBean providermbean, SecurityServices securityservices)
{
:
myMBean = (DbSampleAuthenticatorMBean)providermbean;
:
}
public AppConfigurationEntry getLoginModuleConfiguration()
{
HashMap hashmap = new HashMap();
return getConfiguration(hashmap);
}
private AppConfigurationEntry getConfiguration(HashMap hashmap)
{
sLogger.debug("Requesting login module configurations");
hashmap.put("myMBean", myMBean);
return new AppConfigurationEntry("examples.db.security.providers.
authentication.DbSampleLoginModuleImpl", controlFlag, hashmap);
}
清单2:DbSampleLoginModuleImpl.java
public void initialize(Subject subject1,
CallbackHandler callbackhandler, Map map, Map map1) {
:
DbSampleAuthenticatorMBean dbsampleauthenticatormbean =
(DbSampleAuthenticatorMBean)map1.get("myMBean");
:
String databaseURL = dbsampleauthenticatormbean.getDatabaseURL();
String databaseUser = dbsampleauthenticatormbean.getDatabaseUser();
String databaseUserPassword =
dbsampleauthenticatormbean.getDatabaseUserPassword();
String databaseJDBCDriver =
dbsampleauthenticatormbean.getDatabaseJDBCDriver();
String DataSourceName = dbsampleauthenticatormbean.getDataSourceName();
DbSampleAuthenticatorDatabase database = new DbSampleAuthenticatorDatabase
(databaseURL, databaseUser, databaseUserPassword, databaseJDBCDriver, DataSourceName);
:
}
MBean属性就是这样访问!要了解如何使用这些内容,请参看DbSampleAuthenticatorDatabase.java,当WebLogic Server进行初始化、JNDI未被设置以及不能访问JDBC数据源的时候,我们使用驱动程序、用户id、密码和URL来实现数据库连接。
扩展控制台来显示自定义页面
现在,趣事开始了;我们需要做什么才能达到这个目标呢?事实上不需要太多。您需要Web 应用程序,它具有web.xml文件中的一些默认值,以及调用类来把控制台使用的JSP页面返回给默认详细页面中的翻译器(render)(参见清单3)。在本例中,JSP必须可以通过JMX查询Security MBean和设置属性,从而使LoginModule在随后依然可以访问他们。您或许会问,我需要为每一security provider自定义Web应用程序吗?不,这个Web应用程序和Java类可以处理每一种security provider,并且会在认证每一位用户的时候被调用;这种类可以判断调用哪一种Security MBean并返回null,或者没有JSP页面需要呈现,或者返回控制台显示的JSP页面。您可以拥有一个Authentication提供商,它可以有一个自定义的JSP页面,或者是具有默认控制台页面的另一家提供商。
清单3:写入用于返回控制台将要呈现的JSP页面的Console Extension类
public final class DbSampleConsoleExtension extends Extension
implements SecurityExtensionV2
{
public DbSampleConsoleExtension()
{
}
public String getExtensionForProvider
(ObjectName objectname, String s, ObjectName objectname1)
{
sLogger.debug("DbSampleConsoleExtension.getExtensionForProvider");
if(s.equals("examples.db.security.providers.
authentication.DbSampleAuthenticatorMBean"))
{
return "DbSampleConsolePage.jsp";
// This jsp must be in this web-app or a 404 will be returned
} else
{
return null;
// for all other Providers, have the console use default behavior
}
}
这就是我们在判断调用哪一个MBean时所需要做的工作,当您点击自定义按钮或者其他安全性提供商时,这个类就会被调用,您可以覆盖默认生成的页面或者返回您自己的页面。
当您点击DbSampleAuthenticator链接时,就会显示图4。

图4
创建JSP
我使用控制台扩展标签库来使格式和其他默认的WLS Console页面更加一致。我还使用了一些小花招来使这个例子更加容易摹仿,即在我呈现form时使用相同的JSP。毫无疑问,创建JSP在这里可以被优化,但是它可以满足这个例子的要求。
- 获取当前的属性值,您就可以在form上显示这些属性值。
- 显示form并添加提交按钮。
- 处理form值和设置MBean属性。
获取属性
在我的JSP中,我创建并调用了一种小型的方法来传播HashMap,并在随后设置form默认值时使用HashMap(参见清单4,由于空间限制,清单4~6 在www.syscon.com/weblogic/sourcec.cfm 中提供)。获取MBean和检索当前的属性值就非常简单了。
设置属性
设置属性就像获取属性一样直接,您仍然必须得到MBean对象,但是现在您需要创建一个基于 Attribute Name的新属性和从form输入的新属性值,然后设置属性。清单5是在POS操作中传递的所有form元素的循环,以及设置那些匹配我们希望设置的属性名称。
最后一件需要注意的事情是,既然JSP实例化MBean,您就需要导入MBean类bSampleAuthenticatorMBean,这意味着类examples.db.security.providers.authentication. DbSampleAuthenticatorMBean必须存放在web-app/WEB-INF/classes目录中。
要从命令行设置MBean,使用清单 6。(清单4~6 在www.syscon.com/weblogic/sourcec.cfm 中提供)
结束语
在本文中,我试着论证如何通过添加MBean新属性和访问他们需要的代码来为Custom Security Providers 扩展控制台。为自定义安全性提供商扩展控制台的功能有两种方式。您可以简单地为SecurityProvider.xml文件添加可写入属性并重编译Security Provider jar文件,这样WebLogic Server Console就可以试着把窗口当做一个详细页面来呈现;或者,您可以使用一个控制台扩展类以及自定义JSP文件来编写自己的Web应用程序,以供控制台使用。
致谢
我要感谢WebLogic Server OA&M团队的Chris Chiodo,他解决了我在开发这些例子时遇到的一些问题。
尽管这个例子使用了TxDataSource,我们[BEA]不支持通过安全性提供商来使用WLS资源。任何涉及WLS受保护资源的操作都是禁止的,如连接池。您可以并且应当通过JDBC直接访问数据库。
本文其他代码的ZIP文件(316K)位于:http://www.sys-con.com/weblogic/archives/0208/kennedy0208.zip
原文出处
http://www.sys-con.com/story/?storyid=42957&DE=1
|