【问题标题】:How to implement a custom identity model for JBoss Portal?如何为 JBoss Portal 实现自定义身份模型?
【发布时间】:2012-01-01 01:11:06
【问题描述】:

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

我正在使用 JBoss Portal 2.7.2 和 JBoss AS 4.2.3; java版本1.6.0_29

以下是我已完成的步骤:

新建一个maven项目,pom.xml sn -p:

<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 中的更改, 用新的替换现有的用户类型模块(不需要任何配置):

<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.invocation.Invocation.invoke(Invocation.java:157) org.jboss.portal.server.servlet.PortalServlet.service(PortalServlet.java:252) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

即使不部署 jar 文件,我也会遇到相同的异常,只需更改 identity-config.xml 文件即可。所以我假设 我的罐子根本没有装。此外,我的新模块与数据库无关,因此不需要 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(PortletContainerLifeCycle.java:76) 在 org.jboss.portal.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:92) 在 org.jboss.portal.portlet.impl.container.PortletFilterLifeCycle.startDependents(PortletFilterLifeCycle.java:74) 在 org.jboss.portal.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:128) 在 org.jboss.portal.portlet.impl.container.PortletApplicationLifeCycle.startDependents(PortletApplicationLifeCycle.java:339) 在 org.jboss.portal.portlet.impl.container.LifeCycle.managedStart(LifeCycle.java:128) 在 org.jboss.portal.portlet.deployment.jboss.PortletAppDeployment.start(PortletAppDeployment.java:226) 在 org.jboss.portal.core.deployment.jboss.PortletAppDeployment.start(PortletAppDeployment.java:94) 在 org.jboss.portal.server.deployment.jboss.DeploymentContext.start(DeploymentContext.java:99) 在 org.jboss.portal.server.deployment.jboss.PortalDeploymentInfoContext.add(PortalDeploymentInfoContext.java:86) 在 org.jboss.portal.server.deployment.jboss.ServerDeployer.registerFactory(ServerDeployer.java:134) 在 org.jboss.portal.server.deployment.jboss.AbstractDeploymentFactory.registerFactory(AbstractDeploymentFactory.java:113) 在 org.jboss.portal.server.deployment.jboss.AbstractDeploymentFactory.start(AbstractDeploymentFactory.java:152) 在 org.jboss.portal.portlet.deployment.jboss.PortletAppDeploymentFactory.start(PortletAppDeploymentFactory.java:147) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.portal.jems.as.system.JBossServiceModelMBean$ServiceMixin.execute(JBossServiceModelMBean.java:486) 在 org.jboss.portal.jems.as.system.JBossServiceModelMBean$ServiceMixin.startService(JBossServiceModelMBean.java:452) 在 org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289) 在 org.jboss.system.ServiceMBeanSupport.start(ServiceMBeanSupport.java:196) 在 org.jboss.portal.jems.as.system.JBossServiceModelMBean$6.invoke(JBossServiceModelMBean.java:374) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:88) 在 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.system.ServiceController$ServiceProxy.invoke(ServiceController.java:995) 在 $Proxy0.start(未知来源) org.jboss.system.ServiceController.start(ServiceController.java:417) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 org.jboss.system.ServiceController.start(ServiceController.java:435) 在 sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:86) 在 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) 在 $Proxy4.start(未知来源)在 org.jboss.deployment.SARDeployer.start(SARDeployer.java:304) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:88) 在 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.XSLSubDeployer.start(XSLSubDeployer.java:197) 在 org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025) 在 org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819) 在 org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782) 在 sun.reflect.GeneratedMethodAccessor26.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:88) 在 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.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421) 在 org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634) 在 org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263) 在 org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:336) 在 org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289) 在 org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245) 在 sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:86) 在 org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) 在 org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659) 在 org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978) 在 $Proxy0.start(未知来源) org.jboss.system.ServiceController.start(ServiceController.java:417) 在 sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:86) 在 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) 在 $Proxy4.start(未知来源)在 org.jboss.deployment.SARDeployer.start(SARDeployer.java:304) 在 org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025) 在 org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819) 在 org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782) 在 org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) 在 org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133) 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:88) 在 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) 在 $Proxy5.deploy(未知来源)在 org.jboss.system.server.ServerImpl.doStart(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.CMSAdminPortlet.init(CMSAdminPortlet.java:140) 在 org.jboss.portlet.JBossPortlet.init(JBossPortlet.java:387) 在 org.jboss.portal.core.cms.ui.admin.CMSAdminPortlet.init(CMSAdminPortlet.java:151) 在 org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.initPortlet(PortletContainerImpl.java:417) 在 org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.start(PortletContainerImpl.java:256) ... 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 门户:服务=IdentityEventManager 取决于我: 门户:服务=AuthorizationProvider,类型=cms 门户:服务=拦截器,类型=Cms,名称=ACL 门户:服务=批准发布,类型=工作流 门户:服务=IdentityUIConfigurationService,类型=I​​dentityUI 门户:服务=IdentityUserManagementService,类型=I​​dentityUI portal.management:service=管理,类型=身份,名称=默认 门户:服务=拦截器,类型=服务器,名称=用户 门户:服务=模块,类型=邮件门户:服务=自定义管理器

--- MBean 是问题的根本原因--- ObjectName:portal:service=Module,type=IdentityServiceController 状态:FAILED 原因:org.jboss.portal.identity.IdentityException:无法启动 身份模块:我依赖:portal:service=Hibernate 门户:服务=IdentityEventManager 取决于我: 门户:服务=AuthorizationProvider,类型=cms 门户:服务=拦截器,类型=Cms,名称=ACL 门户:服务=批准发布,类型=工作流 门户:服务=IdentityUIConfigurationService,类型=I​​dentityUI 门户:服务=IdentityUserManagementService,类型=I​​dentityUI portal.management:service=管理,类型=身份,名称=默认 门户:服务=拦截器,类型=服务器,名称=用户 门户:服务=模块,类型=邮件门户:服务=自定义管理器

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

【问题讨论】:

    标签: java api jboss customization jboss-portal


    【解决方案1】:

    standardidentity-config.xml 的元素“class”必须引用相应的模块,例如对于用户,它必须 引用 UserModule 的实现(而不是 User 本身的实现:MyUserImpl !!!), Role、Membership 和 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>
    

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多