【问题标题】:javax.naming.NoPermissionException: User <anonymous> does not have permission on jndi.dataSource to perform lookup operationjavax.naming.NoPermissionException:用户 <anonymous> 对 jndi.dataSource 没有执行查找操作的权限
【发布时间】:2016-09-16 13:52:44
【问题描述】:

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

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

init 方法调用失败;嵌套异常是 javax.naming.NoPermissionException: User &lt;anonymous&gt; 没有权限对 jndi.dataSource 执行查找操作。

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

  • 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 实例上抱怨虚拟用户(匿名)而在其他实例上抱怨管理员?我怎样才能减轻这种情况?

【问题讨论】:

  • 验证域/安全/常规是否“启用匿名管理员查找”
  • 不是。我已经进行了更改,直到现在问题还没有出现。
  • 是否已经过了通常的错误重现期?
  • 还没有。很难跟踪,因为它发生的不可预测 - 它发生在最后一次重启后 3 天(最早)和最后一次服务器重启后 7 天(最晚)。仍然对其进行监视 2-3 天,如果不再发生,那一定是正确的解决方法。
  • 我明白了,有道理。

标签: java weblogic datasource jndi weblogic12c


【解决方案1】:

嘿,我以前也遇到过类似的问题。这是我查找安全 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多