Question about @Read annotation using with entityListener
mroeoesli Oct 24, 2008 6:01 PMI want to protect my DummyUser entity for the action update
 using the permissionStore and the PersistentPermissionResolver.
I did this:
  @Transactional
   public DummyUser updateDummyUser(DummyUser dummyUser) {
     
      PersistentPermissionResolver pr = (PersistentPermissionResolver) Component.getInstance(
      PersistentPermissionResolver.class, false);
          
      if (pr.hasPermission(dummyUser, "update")==false)
      {
         Identity identity = (Identity) Component.getInstance(
              Identity.class, false);
        throw new AuthorizationException("access denied for principal "+identity.getPrincipal().getName()+" for action=update");
      }
     
     return entityManager.merge(dummyUser);
   }that worked fine. 
I also tryed this:
   public DummyUser updateDummyUser(@Update DummyUser dummyUser) {
     return entityManager.merge(dummyUser);
   }that worked fine too but that is not that what I want. I want protect any update action on this entity. I don't want to set the annotation on all methods what can update this entity.
So I began to try this (using the entityListener):
@Entity
@Table(name = "DUMMY_USER")
@Identifier(value = EntityIdentifierStrategy.class)
@Name("dummyUser")
public class DummyUser implements Serializable {
   private static final long serialVersionUID = -3134097431661355175L;
   @Id
   @Column(name = "ID")
   @GeneratedValue(generator = "pomopSequenceGenerator")
   @GenericGenerator(name = "pomopSequenceGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
        @Parameter(name = "sequence_name", value = "POMOP_SEQUENCE"),
        @Parameter(name = "initial_value", value = "1000"), @Parameter(name = "increment_size", value = "1") })
   public Long id;
   @Column(name = "FIRSTNAME", length = 63, nullable = false)
   private String firstname;
   @Length(max = 20)
   @Column(name = "LASTNAME", length = 63, nullable = false)
   private String lastname;
   @Column(name = "EMAIL", length = 255, nullable = true)
   private String email;
   @OneToMany(cascade = CascadeType.ALL)
   private List<DummySettings> settings;
   @OneToOne(cascade = CascadeType.ALL)
   private DummySettings setting = new DummySettings("test");
   @PostLoad
   public void postLoad() {
   }
   @PreUpdate
   public void preUpdate() {
     
     
      PersistentPermissionResolver pr = (PersistentPermissionResolver) Component.getInstance(
           PersistentPermissionResolver.class, false);
               
           if (pr.hasPermission(this, "update")==false)
           {
              Identity identity = (Identity) Component.getInstance(
                   Identity.class, false);
             throw new AuthorizationException("access denied for principal "+identity.getPrincipal().getName()+" for action=update");
           }
    }
....that was not working I'had got a loop because somewhere inside the hasPermission(..) method something happend that raised the PreUpdate event again.
then I began to try this
@PreUpdate
@Update(DummyUser.class)
   public void preUpdate() {
     
    }
that had no effect everybody was able to update my entity.
then i tryed this.
....
@PreUpdate
@Restrict("#{persistentPermissionResolver.hasPermission(dummyUser,'update')}"
   public void preUpdate() {
     
    }
....
there was the problem that the target object was not the right object it was a dummyUser object but with id null and the values was null also.
I also tryed this
....
@PreUpdate
@Restrict("update")
   public void preUpdate() {
     
    }
....
that gets me this exception in any cases even if the principle should be able to update the entity. It looks like its looking in my drools file but I dont want to add this rules there. how can I tell them to look in my permissionStore ?
Caused by: org.jboss.seam.security.AuthorizationException: Authorization check failed for expression [update]
Is it possible to protect the update acction on this enitty using the entityListener and the permissionStore for looking up the rules ?
Thx for your help
Greetz Marco
