2016-08-26 8 views
1

で、一般的なリポジトリのためのSpeIでエンティティネームまたはインタフェース名を取得するにはどのように私はしかし、私はエンティティクラス名を取得する方法を取得することはできません、事前認証を持つ各メソッドを、一般的なセキュリティCRUDリポジトリを作成し、注釈を付けたいのですが事前認証

@NoRepositoryBean 
public interface AbstractEntityRepository<T extends AbstractEntity> extends CrudRepository<T, String> { 
    @Override 
    @PreAuthorize("hasPermission(null, #entityName, 'find'); 
    Iterable<T> findAll(); 
} 

public interface UserRepository extends AbstractEntityRepository<User> {} 

この場合、entityNameは常にnullです。

@Component 
@Log 
public class CustomPermissionEvaluator implements PermissionEvaluator { 
    @Override 
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) 
     log.fine("type " + targetType); // <- null 
     return true; 
    } 
... 

"User"または "UserRepository"を取得するにはどうすればよいですか?

+0

私はカスタムクラス名リゾルバをコード化することができましたが、それが最善のアプローチであるとは確信していません – alex

答えて

0
@Component 
public class ClassTypeResolver { 
    public static String resolve(Object object) { 
     if (AopUtils.isJdkDynamicProxy(object)) { 
      try { 
       return ((SimpleJpaRepository) ((Advised)object).getTargetSource().getTarget()).getDomainClass().getCanonicalName(); 
      } catch (Exception e) { 
       return null; 
      } 
     } else { 
      return ((SimpleJpaRepository) object).getDomainClass().getCanonicalName(); 
     } 
    } 
} 
関連する問題