繁体   English   中英

如何为JBoss Portal实施自定义身份模型?

[英]How to implement a custom identity model for JBoss Portal?

我想实现一个自定义身份模型,以便连接到提供用户信息的专有Web服务。 因此,我按照http://docs.jboss.com/jbportal/v2.7.1/referenceGuide/html/identity.html上的说明进行操作。

我在JBoss AS 4.2.3中使用JBoss Portal 2.7.2; Java版本1.6.0_29

这是我已完成的步骤:

创建一个新的maven项目pom.xml片段:

<dependency>
    <groupId>org.jboss.portal.identity</groupId>
    <artifactId>identity-identity</artifactId>
    <version>1.0.7</version>
    <scope>provided</scope>
</dependency>

用户界面的实现:

package com.mycompany.myIdentity;

import org.jboss.portal.identity.IdentityException;
import org.jboss.portal.identity.User;

public class MyUserImpl implements User {
...
}

打包到一个jar文件中,并部署(=复制)到\\ jboss-portal-2.7.2 \\ server \\ default \\ deploy \\ jboss-portal.sar \\ lib。

\\ jboss-portal-2.7.2 \\ server \\ default \\ deploy \\ jboss-portal.sar \\ conf \\ identity \\ identity-config.xml中的更改,用新的替换了现有的User-type模块(不需要任何配置):

<module>
    <type>User</type>

    <service-name>portal:service=Module,type=User</service-name>
    <class>com.mycompany.myIdentity.MyUserImpl</class>

    <config/>
</module>

通过双击run.bat和浏览站点http:// localhost:8080 / portal启动服务器后,出现以下异常:

例外

javax.servlet.ServletException:org.hibernate.HibernateException:无法找到当前的JTA事务org.jboss.portal.server.servlet.PortalServlet.service(PortalServlet.java:278)javax.servlet.http.HttpServlet.service(HttpServlet。 java:803)org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

根本原因

org.hibernate.HibernateException:无法找到当前的JTA事务。org.hibernate.context.JTASessionContext.currentSession(JTASessionContext.java:61)org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:544)org.jboss.portal。 core.impl.model.portal.PersistentPortalObjectContainer.getObjectNode(PersistentPortalObjectContainer.java:252)org.jboss.portal.core.impl.model.portal.AbstractPortalObjectContainer.getContext(AbstractPortalObjectContainer.java:112)org.jboss.portal.core。 impl.model.portal.AbstractPortalObjectContainer.getContext(AbstractPortalObjectContainer.java:81)org.jboss.portal.core.model.portal.DefaultPortalCommandFactory.doMapping(DefaultPortalCommandFactory.java:72)org.jboss.portal.core.controller.Controller。 handle(Controller.java:252)org.jboss.portal.server.RequestControllerDispatcher.invoke(RequestControllerDispatcher.java:51)org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:131)org.jboss。 portal.common.invocatio n.Invocation.invoke(Invocation.java:157)org.jboss.portal.server.servlet.PortalServlet.service(PortalServlet.java:252)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)组织。 jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

即使没有部署jar文件,也只是通过更改identity-config.xml文件,我得到了相同的异常。 因此,我假设我的jar根本没有加载。 此外,我的新模块与数据库无关,因此不需要JTA事务。

那么,我想让这个东西正常工作了吗?

在此先感谢您的帮助。

更新1:

再次问好!

通过仔细检查服务器日志文件,我可以取得一些进步。 服务器无法解析xml文件identity-config.xml,因此经过一些试验后,我可以使其解析这个新文件:

<identity-configuration>
    <datasources/>
    <modules>
        <module>
            <type>User</type>
            <implementation>CUSTOM</implementation>
            <config/>
        </module>
        <module>
            <type>Role</type>
            <implementation>CUSTOM</implementation>
            <config/>
        </module>
        <module>
            <type>Membership</type>
            <implementation>CUSTOM</implementation>
            <config/>
        </module>
        <module>
            <type>UserProfile</type>
            <implementation>CUSTOM</implementation>
            <config/>
        </module>
    </modules
    <options/>
</identity-configuration>

我必须将以下代码添加到\\ jboss-portal-2.7.2 \\ server \\ default \\ deploy \\ jboss-portal.sar \\ conf \\ identity \\ standardidentity-config.xml

<module>
    <type>User</type>
    <implementation>CUSTOM</implementation>

    <service-name>portal:service=Module,type=User</service-name>
    <class>com.myCompany.MyUser</class>

    <config />
</module>
<module>
    <type>Role</type>
    <implementation>CUSTOM</implementation>

    <service-name>portal:service=Module,type=Role</service-name>
    <class>com.myCompany.MyRole</class>

    <config />
</module>
<module>
    <type>Membership</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=Membership</service-name>
    <class>com.myCompany.MyMembership</class>
    <config />
</module>
<module>
    <type>UserProfile</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=UserProfile</service-name>
    <class>com.myCompany.MyUserProfile</class>
    <config />
</module>

如您所见,我还实现了Role,Membership和UserProfile。 此后,服务器抱怨这些类需要缺少某些属性。 因此,我将以下内容添加到了这四个类中的每个类中:

IdentityContext identityContext;
ServiceJNDIBinder jndiBinder;
String moduleType;

public String getModuleType() {
    return moduleType;
}

public void setModuleType(String moduleType) {
    this.moduleType = moduleType;
}

public ServiceJNDIBinder getJndiBinder() {
    return jndiBinder;
}

public void setJndiBinder(ServiceJNDIBinder jndiBinder) {
    this.jndiBinder = jndiBinder;
}

public IdentityContext getIdentityContext() {
    return identityContext;
}

public void setIdentityContext(IdentityContext identityContext) {
    this.identityContext = identityContext;
}

不幸的是,服务器仍然对此不满意。 现在,我在服务器日志中发现以下异常,而且我不知道如何解决此问题:

2011-11-21 08:55:54,696错误[org.jboss.portal.portlet.impl.container.LifeCycle]无法启动对象org.jboss.portal.portlet.container.PortletInitializationException:Portlet CMSAdminPortlet在初始化期间引发了Portlet异常在org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.start(PortletContainerImpl.java:284)在org.jboss.portal.portlet.impl.container.PortletContainerLifeCycle.invokeStart(PortletContainerLifesingsbos.java:76)在org。 org.jboss.portal.portlet.impl.container.PortletFilterLifeCycle.startDependents(PortletFilterLifeCycle.java:74)上的.portal.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:92)在org.jboss.portal.portlet上org.jboss.portal.portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339)上的.impl.container.LifeCycle.managedStart(LifeCycle.java:128)在org.jboss.portal.portlet.impl.container .LifeCycle.managedStart(LifeCycle.java:128)在org.jboss.portal.portlet.deployment.jboss.PortletApp中 org.jboss.portal.core.deployment.jboss.PortletAppDeployment.start(PortletAppDeployment.java:94)处的Deployment.start(PortletAppDeployment.java:226)org.jboss.portal.server.deployment.jboss.DeploymentContext.start( org.jboss.portal.server.deployment.jboss.PortalDeploymentInfoContext.add(PortalDeploymentInfoContext.java:86)的DeploymentContext.java:99)org.jboss.portal.server.deployment.jboss.ServerDeployer.registerFactory(ServerDeployer.java: 134)在org.org.jboss.portal.server.deployment.jboss.AbstractDeploymentFactory.registerFactory(AbstractDeploymentFactory.java:113)在org.jboss.portal.server.deployment.jboss.AbstractDeploymentFactory.start(AbstractDeploymentFactory.java:152)在org.org .jboss.portal.portlet.deployment.jboss.PortletAppDeploymentFactory.start(PortletAppDeploymentFactory.java:147)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) .reflect.DelegatingMethodAccessorImpl.invoke (org.jboss.portal.jems.as.system.JBossServiceModelMBean $ ServiceMixin.execute(JBossServiceModelMBean.java:486)上的java.lang.reflect.Method.invoke(Method.java:597)上的(DelegatingMethodAccessorImpl.java:25) org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)上的org.jboss.portal.jems.as.system.JBossServiceModelMBean $ ServiceMixin.startService(JBossServiceModelMBean.java:452)在org.jboss.system.ServiceMBeanSupport上在org.jboss.portal.jems.as.system.JBossServiceModelMBean $ 6.invoke(JBossServiceModelMBean.java:374)处org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)处启动(ServiceMBeanSupport.java:196) )在org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)在org.jboss.mx.server.Invocation.invoke(Invocation.java:88)在org.jboss.mx.interceptor.ModelMBeanOperationInterceptor。在org.jboss.mx.server.AbstractMBeanIn处调用(ModelMBeanOperationInterceptor.java:142)在org.jboss.mx.server.Invocation.invoke(Invocation.java:88) org.jboss.system.ServiceController $ ServiceProxy.invoke(ServiceController.java:995)的org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)的voker.invoke(AbstractMBeanInvoker.java:264)在$ org.jboss.system.ServiceController.start(ServiceController.java:417)上的Proxy0.start(未知源)org.jboss.system.ServiceController上org.jboss.system.ServiceController.start(ServiceController.java:435)上的。在org.jboss.system.ServiceController处start(ServiceController.java:435)在org.jboss.system.ServiceController处org.jboss.system.ServiceController.start(ServiceController.java:435)处org.jboss.system.ServiceController.start(ServiceController.java:435)处的org.jboss.system.ServiceController.start(ServiceController.java:435)处的.start(ServiceController.java:435)。位于sun.reflect.GeneratedMethodAccessor9.invoke的ServiceController.start(ServiceController.java:435)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(Del的源) org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)的java.lang.reflect.Method.invoke(Method.java:597)的egatingMethodAccessorImpl.java:25) org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)org.org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)的Invocation.invoke(Invocation.java:86) org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)处的org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)org.jboss处的$ Proxy4.start的MBeanProxyExt.invoke(MBeanProxyExt.java:210) .deployment.SARDeployer.start(SARDeployer.java:304)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:39) .java:25),位于org.jboss.mx.interceptor.ReflectedDispatcher.invoke(Reflect.Dispatcher.java:155),位于org.jboss.mx.s处,java.lang.reflect.Method.invoke(Method.java:597) org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)的erver.Invocation.dispatch(Invocation.java:94)在org.jboss.mx.server.Invocation.invoke(Invocation.java:88)的erver.Invocation.dispatch(Invocation.java:94)在org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)在org.jboss.mx.server.Invocation.invoke(Invocation.java:88)在org.jboss.mx.server.AbstractMBeanInvoker.invoke (AbstractMBeanInvoker.java:264)在org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)在org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)在$ Proxy199.start (来源不明),位于org.jboss.deployment.MainDeployer.deploy(MainDeployer)的org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)的org.jboss.deployment.XSLSubDeployer.start(XSLSubDeployer.java:197)。 .java:819),位于org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782),位于sun.reflect.GeneratedMethodAccessor26.invoke(未知源),位于sun.reflect.DelegatingMethodAccessorImpl.invoke (org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)处java.lang.reflect.Method.invoke(Method.java:597)处的DelegatingMethodAccessorImpl.java:25) org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)的server.Invocation.dispatch(Invocation.java:94)org.jboss.mx.server.Invocation.invoke(Invocation.java:88)的server.Invocation.dispatch(Invocation.java:94)在org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)在org.jboss.mx.server.Invocation.invoke(Invocation.java:88)在org.jboss.mx.server.AbstractMBeanInvoker.invoke (AbstractMBeanInvoker.java:264)在org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)在org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)在$ Proxy9.deploy (来源不明),位于org.jboss的org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634)的org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)。 org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:336)处的deployment.scanner.AbstractDeploymentScanner $ ScannerThread.doScan(AbstractDeploymentScanner.java:263)在org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java: 289)在org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)在sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)的org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)的.reflect.Method.invoke(Method.java:597) )在org.jboss.mx.server.Invoke(Invocation.java:86)(在org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)在org.jboss.mx.server.MBeanServerImpl。在org.jboss.system.ServiceController $ Serv上调用(MBeanServerImpl.java:659) org.jboss.system.ServiceController.start(ServiceController.java:417)处的$ Proxy0.start(未知源)处的iceProxy.invoke(ServiceController.java:978)在sun处的sun.reflect.GeneratedMethodAccessor9.invoke(未知源)处的org.jboss.system.ServiceController.start(ServiceController.java:417) org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)上的java.lang.reflect.Method.invoke(Method.java:597)上的.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) org.jboss.mx.server.Invocation.invoke(Invocation.java:86)上的org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)(org.jboss.mx.server.AbstractMBeanInvoker.invoke(Invocation.java:86) org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)处的org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)处的AbstractMBeanInvoker.java:264)($ Proxy4.start(未知源),位于org.jboss.deployment.SARDeployer.start(SARDeployer.java:304)(位于org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025),位于org.jboss.deployment.MainDeployer.deploy(MainDeploy) er.java:819)org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)位于java.lang.reflect.Method.invoke(Method.java:597)处sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)在org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)在org.jboss.mx.interceptor.AbstractInterceptor.invoke( org.jboss.mx.server.Invocation.invoke(Invocation.java:88)处的org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)处的org.jboss.mx org.jboss.mx.server.M上的.server.Invocation.invoke(Invocation.java:88)在org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)在org.jboss.mx.server.M org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)处的BeanServerImpl.invoke(MBeanServerImpl.java:659)在org.jboss.system.server.ServerImpl.doStart处的$ Proxy5.deploy(未知源)处(ServerImpl.java:482)在org.jboss.system.server.ServerImpl.start(ServerImpl.java:362)在org.jboss.Main.boot(Main.java:200)在org.jboss.Main $ 1.run (Main.java:508)在java.lang.Thread.run(Thread.java:662)原因:javax.portlet.PortletException:在org.jboss.portal.core.cms.ui.admin上找不到授权服务。 org.jboss.portlet的CMSAdminPortlet.init(CMSAdminPortlet.java:140)。org.jboss.portal.core.cms.ui.admin.CMS.CMSAdminPortlet.init(CMSAdminPortlet.java :)的JBossPortlet.init(JBossPortlet.java:387): 151),位于org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.start(PortletContainerImpl.start(PortletContainerImpl.java:256)的org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.initPortlet(PortletContainerImpl.java:417)。 。134更多

2011-11-21 08:55:54,977错误[org.jboss.deployment.scanner.URLDeploymentScanner]不完整的部署清单:

---等待其他MBean的MBean --- ObjectName:portal:service = Module,type = IdentityServiceController状态:FAILED原因:org.jboss.portal.identity.IdentityException:无法启动身份模块:我依赖:portal:service = Hibernate portal:service = IdentityEventManager取决于我:portal:service = AuthorizationProvider,type = cms portal:service = Interceptor,type = Cms,name = ACL portal:service = ApprovePublish,type = Workflow portal:service = IdentityUIConfigurationService,type = IdentityUI portal:service = IdentityUserManagementService,type = IdentityUI portal.management:service=Management,type=Identity,name=默认portal:service =拦截器,type = Server,name = User portal:service = Module,type = Mail portal:service =定制管理器

---导致问题根源的MBEAN --- ObjectName:portal:service = Module,type = IdentityServiceController状态:FAILED原因:org.jboss.portal.identity.IdentityException:无法启动身份模块:我依赖: portal:service =休眠portal:service = IdentityEventManager依赖于我:portal:service = AuthorizationProvider,type = cms portal:service = Interceptor,type = Cms,name = ACL portal:service = ApprovePublish,type = Workflow portal:service = IdentityUIConfigurationService ,type = IdentityUI门户:服务= IdentityUserManagementService,类型= IdentityUI门户。管理:服务=管理,类型= Identity,名称=默认门户:服务=拦截器,类型=服务器,名称=用户门户:服务=模块,类型=邮件portal:service = CustomizationManager

也许你们中的任何人已经遇到过这样的错误?

standardidentity-config.xml的元素“类”必须引用相应的模块,例如对于User,它必须引用UserModule的实现(而不是User本身的实现:MyUserImpl !!!),而Role则相同。成员资格和UserProfile。

因此,我实现了UserModule,RoleModule等接口。但不是直接实现,而是扩展了UserModuleService,RoleModuleService等以节省一些工作。 我在上一篇文章中提到的缺失属性不再需要,可以将其删除。

现在,standardidentity-config.xml如下所示:

<module>
    <type>User</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=User</service-name>
    <class>com.myCompany.MyUserModuleImpl</class>
    <config>
        <option>
            <name>jNDIName</name>
            <value>java:/portal/UserModule</value>
        </option>
    </config>
</module>
<module>
    <type>Role</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=Role</service-name>
    <class>com.myCompany.MyRoleModuleImpl</class>
    <config>
        <option>
            <name>jNDIName</name>
            <value>java:/portal/RoleModule</value>
        </option>
    </config>
</module>
<module>
    <type>Membership</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=Membership</service-name>
    <class>com.myCompany.MyMembershipModuleImpl</class>
    <config>
        <option>
            <name>jNDIName</name>
            <value>java:/portal/MembershipModule</value>
        </option>
    </config>
</module>
<module>
    <type>UserProfile</type>
    <implementation>CUSTOM</implementation>
    <service-name>portal:service=Module,type=UserProfile</service-name>
    <class>com.myCompany.MyUserProfileModuleImpl</class>
    <config>
        <option>
            <name>jNDIName</name>
            <value>java:/portal/UserProfileModule</value>
        </option>
    </config>
</module>

为了实现这些接口,我必须将以下依赖项添加到pom.xml中:

<dependency>
    <groupId>org.jboss.portal.common</groupId>
    <artifactId>common-common</artifactId>
    <version>1.2.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>jboss</groupId>
    <artifactId>jboss-common-client</artifactId>
    <version>3.2.3</version>
    <scope>provided</scope>
</dependency>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM