`
新来的菜鸟
  • 浏览: 132672 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于 Invalid Subject

 
阅读更多

1.【问题描述】:

java.lang.SecurityException: [Security:090398]Invalid Subject: V_EGIS_IMAGE_EGIS_GENERAL_QUERY_001

 

2.【原因分析】

client JVM把错误的subject传递给了Remote JVM

什么是subject subject就像是一个经过了Remote JVM数字签名的身份文件。

Subject是怎么生成的?是把用户密码送给Remote JVM,经过Remote JVM验证并进行数字签名后发送给Client JVM

Invalid Subject是什么意思?就是Remote JVM收到了不是自己签过名的Subject数据。

为什么Remote JVM收到了不是自己签名的Subject数据? Client JVM的应用代码没有控制好EJB 调用的Context

远程调用很多,Client JVM怎么选择使用哪个Subject?如果在建立EJBInitialContext的时候提供了用户、密码那么就会登陆到远程JVM生成新的subjectClient JVM的线程就会和这个subject绑定。如果建立EJBInitialContext的时候没有提供用户、密码,那么线程就会使用线程当前运行身份的subject传递给Remote Subject。注意:如果存在Context嵌套,那么线程的subject就会以堆栈的形式存放起来,如果没有程序的控制,线程永远都会使用栈顶的subject来作为运行身份。进行Context Close的时候永远都是把栈顶的subject pop出来。当Context嵌套而且没有遵循使用完成马上关闭的原则,那么当前栈顶的Subject就会存在很多种可能,如果当前的调用Context没有重新登陆到Remote JVM,那么就会使用栈顶的subject传递给Remote JVM,这个subject是什么?有多种可能,那么就会Invalid Subject了。

其次,在本地线程派发子进程打开ctx的过程中也会产生类似的问题。但是pafa3.5.4已经解决。

 

3. 【解决方案】

首先可以借用pafaAC的标准,配置成普通的bean实例,在使用的过程中只需要按照配置的名字引用实例即可。

配置如下:

    Map result=null;

        try {

            // 取得Initial Context

     

        

           ImageRemote imageRemote = (ImageRemote) context

           .getBean("viewImageEJB");

            // 查找EJB

           //ImageHome imageHome = (ImageHome) ctx.lookup("com.palic.image.application.app.facade.Image");

          

           result=imageRemote.getImageTicket(imageMap);

          

<bean id="viewImageJndiTemplate"

       class="com.paic.pafa.app.lwc.core.naming.JndiTemplate"

       lazy-init="true">

       <description>

           访问影像系统模板,参数值在context-gccps.properties.xml配置

       </description>

       <property name="environment">

           <props>

              <prop key="java.naming.provider.url">

                  ${viewimage.jndi.url}

              </prop>

              <prop key="java.naming.factory.initial">

                  weblogic.jndi.WLInitialContextFactory

              </prop>

              <prop key="java.naming.security.principal">

                  ${viewimage.jndi.principal}

              </prop>

              <prop key="java.naming.security.credentials">

                  ${viewimage.jndi.credentials}

              </prop>

           </props>

       </property>

    </bean>   

   

   

    <bean id="viewImageEJB"

        class="com.paic.pafa.app.lwc.service.remoting.access.ejb.SmartRemoteStatelessSessionProxyFactoryBean"

       lazy-init="true">

       <property name="jndiName">

           <value>com.palic.image.application.app.facade.Image</value>

       </property>

       <property name="businessInterface">

           <value>

              com.palic.image.application.app.facade.ImageRemote

           </value>

       </property>

       <property name="jndiTemplate">

           <ref local="viewImageJndiTemplate" />

       </property>

    </bean>

此处的仿照pafaAC可以使用自己的ejb接口,例如ima接口

其次,可以自己获取context,但是切记在打开的过程中如果获得远程的remote接口后一定要close掉防止在close的时候篡改栈顶的内容。请注意的是:之前提供的解决方案由于个人水平的有限,是存在一定的问题的,因为在获得remote接口后关闭ctx后调用远程方法时是需要wls的认证信息的,也就是要缓存subject传入调用的方法,此处引用了一部同事的代码提供给大家参考:

是使用了反射的机制获取method,调用wlsSecurity.runAs(internalSubject, action);其中internalSubject,是缓存的wlssubjectaction调用run方法执行的结果通过函数返回,此处使用了java的一个动态代理的技术,就是InvocationHandlerEJBHomeInvocationHandler其实是一个处理类,他代理的类作为参数传进来,并在调用被代理类的方法的时候调用invoke方法执行函数并回调action接口的run方法,返回结果。

EJBHomeInvocationHandler处理时发现被代理类执行的是create的时候(也就是拿remote接口的时候)将再次生成EJBInvocationHandler处理类,代理执行过程中的result对象也就是remote对象,并处理此对象调用的方法。执行invoke方法并回调run方法。

分享到:
评论
1 楼 toopoo 2012-07-03  
平安的              

相关推荐

    swatchrc 过滤策略文件

    mail address=root, subject=warning: Invalid user throttle 01:00 watchfor /authentication failure/ mail address=root, subject=warning: authentication failure throttle 01:00 watchfor /...

    发送邮件发送,先提一下SMTP

    - `Subject`:邮件的主题。 - `Priority`:邮件的优先级(有效值包括 High、Low 和 Normal)。 - `Attachments`:返回一个集合,表示邮件的附件。 - `Bcc`:密送地址。 - `Cc`:抄送地址。 - `Body`:获取或...

    关于JAAS的一些学习资料

    在这个关于JAAS的学习资料中,我们将探讨如何使用JAAS实现一个简单的登录模块。 首先,我们看到一个名为"simp.config"的文件,这通常是JAAS配置文件。在JAAS中,配置文件定义了认证系统的行为,包括用于认证的模块...

    QuartusII常见错误

    1. 错误信息:Warning: FLEXlm software error: Invalid (inconsistent) license key 解决方法:检查 License 文件是否正确,检查 License 文件的路径是否正确,检查 License 文件是否被修改过。 2. 错误信息:...

    Cody‘s_Data_Cleaning_Techniques_Using_SAS_(Second_Edtion)

    #### Looking for Duplicates and "n" Observations per Subject This chapter focuses on identifying duplicates and specific observation counts, including: - **Eliminating Duplicates by Using PROC SORT*...

    javascript的oop思想以及单例,工厂,观察者模式简例

    throw new Error('Invalid type'); } return object; } var person = createObject('person'); var car = createObject('car'); ``` 最后是观察者模式。它定义了对象之间的一对多依赖关系,当一个对象的状态...

    Shiro + JWT + SpringBoot应用示例代码详解

    log.info("token is invalid{}", e.getMessage()); return false; } } } ``` 最后,我们可以使用 Shiro + JWT + SpringBoot 来实现身份验证和授权。 这篇文章主要介绍了 Shiro + JWT + SpringBoot 应用示例代码...

    shiro spring简单应用

    model.addAttribute("error", "Invalid username or password"); return "login"; } } ``` 登出操作则简单地调用 `Subject.logout()`: ```java @RequestMapping(value = "/logout", method = RequestMethod....

    SMTP 邮件代码库 - MetaTrader 5程序库.zip

    3. **邮件结构**:了解如何构建一个符合SMTP标准的邮件,包括必要的头部信息(如From, To, Subject等),以及HTML或纯文本的邮件正文。 4. **认证机制**:SMTP服务器通常需要用户进行身份验证,这可能涉及用户名和...

    JWT

    注册声明是预定义的,如`iss`(issuer)表示签发者,`exp`(expiration time)表示过期时间,`sub`(subject)表示主题等。公共声明可以自由使用,但建议避免冲突。私有声明是发件人和接收人之间协商的声明。 3. **签名...

    三步实现Django Paginator分页的方法

    {% elif page_num &gt; subject_list.number|add:"-3" and page_num &lt; subject_list.number|add:"3" %} &lt;li&gt;&lt;a href="?page={{ page_num }}"&gt;{{ page_num }}&lt;/a&gt;&lt;/li&gt; {% endif %} {% endfor %} &lt;!-- 分页功能的...

    C#设计模式DEMO

    throw new ArgumentException("Invalid shape"); } } ``` 再者,“观察者模式”使得一个对象能够订阅另一个对象的事件,当被观察的对象状态发生改变时,所有订阅者都会收到通知。C#中的事件就是观察者模式的一个...

    RegexBuddy3.6.0最新注册版

    Test: Debug Here and Debug Till End triggered an "invalid class typecast" error if the test subject editor was in hexadecimal mode. Test: If a regular expression contained an inverted range with a \...

    NBU mysql备份管理

    DISCLAIMERS ARE HELD TO BE LEGALLY INVALID. VERITAS TECHNOLOGIES LLC SHALL NOT BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES IN CONNECTION WITH THE FURNISHING, PERFORMANCE, OR USE OF THIS ...

    Csharp设计模式

    throw new ArgumentException("Invalid shape type."); } } ``` 三、观察者模式 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C#中,...

    TypeScript.zip

    throw new Error('Invalid shape type.'); } } } ``` 3. 观察者模式:观察者模式定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。TypeScript中的...

    JavaScript模式

    - **提升编程技能**:本书不仅是一本关于JavaScript设计模式的手册,同时也涵盖了大量实用的编程技巧和高级概念。 ### 设计模式详解 #### 3. **工厂模式** - **定义**:工厂模式是一种创建型设计模式,提供了一...

    php 邮件发送问题解决

    $mail-&gt;Subject = 'Subject of the Email'; $mail-&gt;Body = 'This is the body in plain text for non-HTML mail clients'; $mail-&gt;AltBody = 'This is the body in plain text for non-HTML mail clients'; // 可...

Global site tag (gtag.js) - Google Analytics