将自定义RoleMapper部署到WebLogic

时间:2015-10-12 15:52:37

标签: authentication weblogic roles

我正在尝试在WebLogic 10.3.5.0中部署自定义角色映射器 - 这与此问题非常相似 - Weblogic Providers,但我无法让提供程序出现在弹出列表中。

配置文件:

<MBeanType Name="DatabaseRoleMapping" 
       DisplayName="DatabaseRoleMapping" 
       Package="com.bynx.weblogic.mbean.rolemapping"
       Extends="weblogic.management.security.authorization.RoleMapper"
       PersistPolicy = "OnUpdate"> 
<MBeanAttribute
 Name = "ProviderClassName"
 Type = "java.lang.String"
 Writeable = "false"
 Preprocessor  = "weblogic.management.configuration.LegalHelper.checkClassName(value)"
 Default = "&quot;com.bynx.weblogic.mbean.rolemapping.DatabaseRoleMappingProvider&quot;"
/>

<MBeanAttribute
 Name = "Description"
 Type = "java.lang.String"
 Writeable = "false"
 Default = "&quot;Provider that performs Role Mapping held in a database&quot;"
/>

<MBeanAttribute
 Name = "Version"
 Type = "java.lang.String"
 Writeable = "false"
 Default = "&quot;1.0&quot;"
/>
<!-- 
<MBeanAttribute
 Name = "DataSourceJNDI"
 Type = "java.lang.String"
 Default = "&quot;UserDataSource&quot;"
 Description = "DataSource JNDI name"
/> -->
</MBeanType>

提供者实施:

package com.bynx.weblogic.mbean.rolemapping;

import weblogic.management.security.ProviderMBean;
import weblogic.security.spi.RoleMapper;
import weblogic.security.spi.RoleProvider;
import weblogic.security.spi.SecurityServices;

public class DatabaseRoleMappingProvider implements RoleProvider
{
    DatabaseRoleMapper mapper;
    private String description;

    @Override
    public String getDescription()
    {
        return description;
    }

    @Override
    public void initialize(ProviderMBean provider, SecurityServices services)
    {
        //DatabaseRoleMappingProviderMBean mBean = (DatabaseRoleMappingProviderMBean)provider;
        //mapper = new DatabaseRoleMapper(mBean.getDataSourceJNDI());
        mapper = new DatabaseRoleMapper("UserDataSource");
        description = provider.getName() + " " + provider.getVersion();
    }

    @Override
    public void shutdown()
    {

    }


    @Override
    public RoleMapper getRoleMapper()
    {
        return mapper;
    }
}

构建文件:

<?xml version="1.0"?>

  <project name="dbuser_authentication_provider" default="all" basedir=".">

  <!-- global properties -->
  <property environment="env"/>
  <property name="jdk"                 value="C:/Program Files (x86)/Java/jdk1.6.0_26"/>
  <property name="lib"                 value="P:/Web_Dev/Projects/WebLogic_Home/wlserver_10.3/server/lib"/>
  <property name="mbeantypes"          value="${lib}/mbeantypes"/>
  <property name="sampleprovidersjar"  value="databaseRoleMapping.jar"/>
  <property name="sample_dir"          location="."/>
  <property name="src_dir"             value="${sample_dir}/src"/>
  <property name="provider_src_dir"    value="${src_dir}/com"/>
  <property name="build_dir"           value="${sample_dir}/build"/>
  <property name="class_dir"           value="${sample_dir}/classes"/>
  <property name="namespace"           value="http://www.bea.com/ns/90/weblogic/security/samples"/>

  <target name="all" depends="clean">

    <!-- Set up the build directories -->
    <mkdir dir="${build_dir}"/>
    <mkdir dir="${class_dir}"/>

    <!-- Only copy over the commo dtd and sample provider xml files for now -->
    <copy todir="${build_dir}" flatten="true">
      <fileset dir="${lib}">
        <include name="commo.dtd"/>
      </fileset>
    </copy>
    <copy todir="${build_dir}" flatten="true">
      <fileset dir="${provider_src_dir}">
        <include name="**/*.xml"/>
        <include name="**/*.java"/>
      </fileset>
    </copy>

    <!-- Build the sample security providers' jar file -->
    <java classname="weblogic.management.commo.WebLogicMBeanMaker" fork="true" failonerror="true">
      <jvmarg line="-cp '${jdk}/lib/tools.jar';${lib}/weblogic.jar -Dfiles=${build_dir}  -DMDFDIR=${build_dir} -DMJF=${build_dir}/${sampleprovidersjar} -DtargetNameSpace=${namespace} -DpreserveStubs=true -DcreateStubs=true"/>
    </java>

  </target>

  <target name="clean">
    <delete quiet="true" dir="${build_dir}"/>
    <delete quiet="true" dir="${class_dir}"/>
  </target>
</project>

所有内容编译都很好,并且在生成的jar中似乎没有任何缺少的类文件,但是将jar放在mbeantypes目录中并重新启动它并不会出现在列表中。它最终将会查看一个数据库,但我已将其剥离到最低限度以尝试使其正常工作。任何建议 - 或者在日志中查找任何问题都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我已经设法让这个工作,所以我想我会分享我的解决方案以防万一其他人偶然发现这个。

首先是文档中的陈述:

  

但是,如果希望WebLogic Server在其他目录中查找MBean类型,请在启动服务器时使用-Dweblogic.alternateTypesDirectory =命令行标志,其中以逗号分隔的目录名列表。使用此标志时,WebLogic Server将始终首先从WL_HOME \ server \ lib \ mbeantypes加载MBean类型,然后查看其他目录并加载这些目录中存在的所有有效存档(无论其扩展名如何)。

似乎不正确。我们正在使用alternateTypesDirectory参数,如果我将jar放在命令行标志的其中一个目录中,我只能让WebLogic获取我的自定义MBean。

其次,如果您部署了任何使用版本控制的内容(例如,一个或多个可选的可部署库),则您的自定义提供程序必须实现weblogic.security.spi.VersionableApplicationProvider接口并在MBeanType元素中具有Implements = "weblogic.management.security.ApplicationVersioner"定义XML。