通过 com.filenet.api.util.UserContext 进行文件网身份验证

Posted

技术标签:

【中文标题】通过 com.filenet.api.util.UserContext 进行文件网身份验证【英文标题】:Filenet authentication via com.filenet.api.util.UserContext 【发布时间】:2017-10-02 07:57:17 【问题描述】:

我有演示示例 CeConnection.java 类,可从 IBM 网站 (http://www-01.ibm.com/support/docview.wss?uid=swg24028788) 您可以在消息顶部找到此类的列表。

所以,我的 web 应用程序使用单个用户与 Content Engine 进行通信(是的,单个“ce_user”和“passw123”)。 您能否解释一下在我的 Vaadin webapp 中为每个用户的会话使用这个 CeConnection 类的好做法和好方法(vaadin 的入口点 - AppMain.java 类可以有 CeConnection 字段)。

以下哪种方法可以?

1. When the webapp starts I establish connection: 
  void init()   // this is vaadins entry point

  ceConnection  = new CeConnection();

  ceConnection.establishConnection(...);

  



OR

2. Create new CeConnection for every request to Content Engine. like:

    Document getDoc(String id) 
         CeConnection ceConnection = new CeConnection(...) 
         try 
         ceConnection.establish(); // (contains UserContext.pushSubject)

         ...get data from CE....
          finally 
         ceConenction.logofMethod();  (contains UserContext.popSubject)
         
        

谢谢!

/**
    IBM grants you a nonexclusive copyright license to use all programming code 
    examples from which you can generate similar function tailored to your own 
    specific needs.

    All sample code is provided by IBM for illustrative purposes only.
    These examples have not been thoroughly tested under all conditions.  IBM, 
    therefore cannot guarantee or imply reliability, serviceability, or function of 
    these programs.

    All Programs or code component contained herein are provided to you �AS IS � 
    without any warranties of any kind.
    The implied warranties of non-infringement, merchantability and fitness for a 
    particular purpose are expressly disclaimed.

    � Copyright IBM Corporation 2007, ALL RIGHTS RESERVED.
 */

package cesample;

import java.util.Iterator;
import java.util.Vector;
import javax.security.auth.Subject;
import com.filenet.api.collection.ObjectStoreSet;
import com.filenet.api.core.Connection;
import com.filenet.api.core.Domain;
import com.filenet.api.core.Factory;
import com.filenet.api.core.ObjectStore;
import com.filenet.api.util.UserContext;

/**
 * This object represents the connection with
 * the Content Engine. Once connection is established
 * it intializes Domain and ObjectStoreSet with
 * available Domain and ObjectStoreSet.
 * 
 */
public class CEConnection 

    private Connection con;
    private Domain dom;
    private String domainName;
    private ObjectStoreSet ost;
    private Vector osnames;
    private boolean isConnected;
    private UserContext uc;

    /*
     * constructor
     */
    public CEConnection()
    
        con = null;
        uc = UserContext.get();
        dom = null;
        domainName = null;
        ost = null;
        osnames = new Vector();
        isConnected = false;
    

    /*
     * Establishes connection with Content Engine using
     * supplied username, password, JAAS stanza and CE Uri.
     */
    public void establishConnection(String userName, String password, String stanza, String uri)
    
        con = Factory.Connection.getConnection(uri);
        Subject sub = UserContext.createSubject(con,userName,password,stanza);
        uc.pushSubject(sub);
        dom = fetchDomain();
        domainName = dom.get_Name();
        ost = getOSSet();
        isConnected = true;
    

    /*
     * Returns Domain object.
     */
    public Domain fetchDomain()
    
        dom = Factory.Domain.fetchInstance(con, null, null);
        return dom;
    

    /*
     * Returns ObjectStoreSet from Domain
     */
    public ObjectStoreSet getOSSet()
    
        ost = dom.get_ObjectStores();
        return ost;
    

    /*
     * Returns vector containing ObjectStore
     * names from object stores available in
     * ObjectStoreSet.
     */
    public Vector getOSNames()
    
        if(osnames.isEmpty())
        
            Iterator it = ost.iterator();
            while(it.hasNext())
            
                ObjectStore os = (ObjectStore) it.next();
                osnames.add(os.get_DisplayName());
            
        
        return osnames;
    

    /*
     * Checks whether connection has established
     * with the Content Engine or not.
     */
    public boolean isConnected() 
    
        return isConnected;
    

    /*
     * Returns ObjectStore object for supplied
     * object store name.
     */
    public ObjectStore fetchOS(String name)
    
        ObjectStore os = Factory.ObjectStore.fetchInstance(dom, name, null);
        return os;
    

    /*
     * Returns the domain name.
     */
    public String getDomainName()
    
        return domainName;
    

编辑:添加

我想知道,如果两个客户端几乎同时调用 servlet 方法,而一个客户端首先调用 PopSubject 会发生什么? com.filenet.api.util.UserContext 类是线程安全的吗?

servlet 方法:

public String getDocumentNumber(String id) 

 UserContext.get().pushSubject(mySubject);
 try 
   ....
   ....
   ....
   ....
  finally 
   UserContext.get().popSubject();
 


//com.filenet.api.util.UserContext 类

public static UserContext get() 
        UserContext cntx = (UserContext)tl.get();
        if(cntx == null) 
            cntx = new UserContext();
            tl.set(cntx);
        

        return cntx;
    


public synchronized void pushSubject(Subject sub) 

        if(sub == null) 
            throw new EngineRuntimeException(ExceptionCode.E_NULL_OR_INVALID_PARAM_VALUE, "Subject");
         else 
            this.subjects.add(sub);
        



public synchronized Subject popSubject() 

        return this.subjects.isEmpty()?null:(Subject)this.subjects.remove(this.subjects.size() - 1);

【问题讨论】:

【参考方案1】:

我建议在需要时连接到 CE,而不是在应用程序加载期间。在应用程序启动时连接并没有什么坏处,因为 CE 对象存储只是一个 POJO,但我更喜欢在需要时。

另外,从您的代码中,我可以看到您使用了ceConenction.logofMethod();,请注意,您需要在完成所有 CE 操作后调用此方法,否则会出错。举个例子吧

    用户登录 用户想添加一个文档以便建立连接 您的代码添加了文档 然后你的 finally 块执行和ceConenction.logofMethod(); 紧接着,如果您希望用户执行任何 CE 操作,如删除或更新,您将收到异常。所以你需要重新获取objectstore。

希望这会有所帮助。

【讨论】:

感谢您的回答。我已经编辑了我的问题,你能复习一下吗? “我想知道,如果两个客户端几乎同时调用 servlet 方法,而一个客户端先调用 PopSubject 会发生什么?com.filenet.api.util.UserContext 类是线程安全的吗?” 这个链接应该可以清除你的疑惑ibm.com/support/knowledgecenter/en/SSNW2F_5.2.1/…

以上是关于通过 com.filenet.api.util.UserContext 进行文件网身份验证的主要内容,如果未能解决你的问题,请参考以下文章

下拉框多选框单选框 通过TagHelper绑定数据

酶:测试孩子通过安装渲染失败,但通过浅时通过

java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解

通过代码进行 Spring 配置与通过注释进行配置

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?

通过邮递员通过 API 使用 Rails 主动存储上传文件(.pdf、.jpg 等)? (不通过 Rails 视图)