javax.naming.NoPermissionException:用户<anonymous>没有jndi.dataSource的权限来执行查找操作

时间:2016-05-19 15:10:51

标签: java weblogic datasource jndi weblogic12c

我最近在Weblogic实例上对数据源的JNDI查找添加了安全限制 - 一个封装了一些组的角色和一个系统用户,供应用程序中的后台进程使用。

服务器正常启动,但经过一段时间(上次重启后大约2天),它开始抛出此错误,数据源无法访问:

  

调用init方法失败;嵌套异常是 javax.naming.NoPermissionException:用户<anonymous>没有jndi.dataSource的权限来执行查找操作。

就此而言,我还在数据源本身上添加了安全限制,并在应用程序使用的安全领域中创建了用户,并进行了一些应用程序端更改:

    {li>

    weblogic descriptor file中,我添加了以下行,以便默认情况下使用上述系统用户运行应用程序:

    <wls:run-as-role-assignment>
        <wls:role-name>systemUser</wls:role-name>
        <wls:run-as-principal-name>systemUser</wls:run-as-principal-name>
    </wls:run-as-role-assignment>
    
  • 将此security-role添加到web.xml:

    <security-role>
        <role-name>systemUser</role-name>
    </security-role>
    
  • 并在servlet定义中指定了这一点,也在web.xml中指定了

    <run-as>
        <role-name>systemUser</role-name>
    </run-as>
    
  • 使用配置系统用户的jndiTemplate访问JNDI资源:

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                <prop key="java.naming.security.principal">systemUser</prop>
                <prop key="java.naming.security.credentials">systemUserPassword</prop>
            </props>
        </property>
    </bean>
    

Weblogic版本: 12.1.3.0.7

Java版: jdk1.8.0_91_unlimited

之前有没有人遇到过这种行为?为什么在某些Weblogic实例上抱怨虚拟用户(匿名)而在其他人上抱怨管理员?我怎么能缓解这个?

1 个答案:

答案 0 :(得分:0)

嘿,我之前遇到过类似的问题。以下是我查找安全jndis的方法。

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
            <prop key="java.naming.security.principal">systemUser</prop>
            <prop key="java.naming.security.credentials">systemUserPassword</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"></property>
    <property name="jndiName" value="myJndiName"></property>
    <property name="exposeAccessContext" value="true"></property>

</bean>