Java Seam 3-安全模块-使用JPAIdendityStore进行身份管理

Java Seam 3-安全模块-使用JPAIdendityStore进行身份管理,java,identity,seam3,Java,Identity,Seam3,我正在使用带有身份管理的seam 3安全模块和JpaIdentityStore、postgres和Jboss 6在我的数据库上创建用户,但它不起作用。我遵循提供的示例(http://docs.jboss.org/seam/3/security/latest/reference/en-US/html/security-identitymanagement.html) 我刚刚编写了以下简单代码来创建用户: @Model public class MemberRegistration {

我正在使用带有身份管理的seam 3安全模块和JpaIdentityStore、postgres和Jboss 6在我的数据库上创建用户,但它不起作用。我遵循提供的示例(http://docs.jboss.org/seam/3/security/latest/reference/en-US/html/security-identitymanagement.html)

我刚刚编写了以下简单代码来创建用户:

 @Model
    public class MemberRegistration {

    @Inject 
    Identity identity;

    @Inject 
    IdentitySession identitySession;


    public void register() throws Exception {       

        PersistenceManager pm = identitySession.getPersistenceManager();
        pm.createUser("testuser");

    }
}
使用此JSF片段:

<h:commandButton value="#{bundle.defaultHeader_createAccount}" action="#{memberRegistration.register}"/>
在调试seam的源文件时,我注意到在下面的方法中,在JpaIdentityStore类上,EntityManager em为null,这就是引发第一个异常的原因

 protected Object lookupIdentityType(String identityType, EntityManager em)
   {      
      try
      {
         Property<Object> typeNameProp = modelProperties.get(PROPERTY_IDENTITY_TYPE_NAME);

         // If there is no identity type table, just return the name
         if (typeNameProp == null) return identityType;

         Object val = em.createQuery(
               "select t from " + typeNameProp.getDeclaringClass().getName() + 
               " t where t." + typeNameProp.getName() +
                " = :identityType")
               .setParameter("identityType", identityType)
               .getSingleResult();
         return val;
      }
      catch (NoResultException ex)
      {
         return null;
      }      
   }
protectedobjectlookupidentitytype(字符串identityType,EntityManager em)
{      
尝试
{
Property typeNameProp=modelProperties.get(Property\u IDENTITY\u TYPE\u NAME);
//如果没有标识类型表,只需返回名称即可
if(typeNameProp==null)返回identityType;
对象val=em.createQuery(
“从”+typeNameProp.getDeclaringClass().getName()+
“t其中t.”+typeNameProp.getName()+
“=:identityType”)
.setParameter(“identityType”,identityType)
.getSingleResult();
返回val;
}
捕获(noresultex异常)
{
返回null;
}      
}
我的配置文件:

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="bommenuDatabase" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/bommenuDatasource</jta-data-source>

        <properties>

             <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
             <property name="hibernate.hbm2ddl.auto" value="update"/>            
             <property name="hibernate.show_sql" value="true" />
             <property name="hibernate.format_sql" value="true" />

        </properties>

    </persistence-unit>

</persistence>

org.hibernate.ejb.HibernatePersistence
java:/bommenuDatasource
seam-beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:s="urn:java:ee" 
   xmlns:security="urn:java:org.jboss.seam.security"
   xmlns:plidm="urn:java:org.jboss.seam.security.management.picketlink"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">     

   <interceptors>
      <class>org.jboss.seam.transaction.TransactionInterceptor</class>
   </interceptors>


     <plidm:JpaIdentityStoreConfiguration>
      <s:replaces/>
      <plidm:identityClass>com.manzana.bommenu.domain.IdentityObject</plidm:identityClass>
      <plidm:credentialClass>com.manzana.bommenu.domain.IdentityObjectCredential</plidm:credentialClass>
      <plidm:relationshipClass>com.manzana.bommenu.domain.IdentityObjectRelationship</plidm:relationshipClass>
      <plidm:roleTypeClass>com.manzana.bommenu.domain.IdentityRoleName</plidm:roleTypeClass>
      <plidm:attributeClass>com.manzana.bommenu.domain.IdentityObjectAttribute</plidm:attributeClass>
   </plidm:JpaIdentityStoreConfiguration>

</beans>

org.jboss.seam.transaction.TransactionInterceptor
com.manzana.bommenu.domain.IdentityObject
com.manzana.bommenu.domain.IdentityObjectCredential
com.manzana.bommenu.domain.IdentityObjectRelationship
com.manzana.bommenu.domain.IdentityRoleName
com.manzana.bommenu.domain.IdentityObjectAttribute
我赞成任何建议,因为我真的不知道该做什么


自3.1.0.Beta3以来,Seam持久性的配置更加容易。请查看文档和其他示例以获得正确的注释(注释路线现在比Seam配置更受欢迎)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:s="urn:java:ee" 
   xmlns:security="urn:java:org.jboss.seam.security"
   xmlns:plidm="urn:java:org.jboss.seam.security.management.picketlink"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">     

   <interceptors>
      <class>org.jboss.seam.transaction.TransactionInterceptor</class>
   </interceptors>


     <plidm:JpaIdentityStoreConfiguration>
      <s:replaces/>
      <plidm:identityClass>com.manzana.bommenu.domain.IdentityObject</plidm:identityClass>
      <plidm:credentialClass>com.manzana.bommenu.domain.IdentityObjectCredential</plidm:credentialClass>
      <plidm:relationshipClass>com.manzana.bommenu.domain.IdentityObjectRelationship</plidm:relationshipClass>
      <plidm:roleTypeClass>com.manzana.bommenu.domain.IdentityRoleName</plidm:roleTypeClass>
      <plidm:attributeClass>com.manzana.bommenu.domain.IdentityObjectAttribute</plidm:attributeClass>
   </plidm:JpaIdentityStoreConfiguration>

</beans>