Spring和手动创建的DAOs如何重构以在此类DAOs对象上启用HasPermission

Spring和手动创建的DAOs如何重构以在此类DAOs对象上启用HasPermission,spring,spring-security,Spring,Spring Security,我有这样的道术 public class EntityDao<T> { private Class clazz; private SessionFactory sessFactory; public EntityDao(Class clazz, SessionFactory sessFactory) { this.clazz = clazz; this.sessFactory = sessFactory; } ..

我有这样的道术

public class EntityDao<T> {

    private Class clazz;
    private SessionFactory sessFactory;

    public EntityDao(Class clazz, SessionFactory sessFactory) {
        this.clazz = clazz;
        this.sessFactory = sessFactory;

    }
.... dao methods 
}
     if (!daoMap.containsKey(entityType)) {
         EntityDao<Class> dao = (EntityDao<Class>) AppContext.getApplicationContext().getBean("mySpecialDao");
                daoMap.put(entityType, dao);
            }
公共类EntityDao{
私人课堂;
私人SessionFactory sessFactory;
公共实体DAO(课堂、会话工厂sessFactory){
this.clazz=clazz;
this.sessFactory=sessFactory;
}
……道方法
}
以及用于检索和存储特定dao的工厂

EntityBeanDaoFactory {

private HashMap<EntityDaoType, EntityDao> daoMap = new HashMap<EntityDaoType, EntityDao>();
// return dao from daoMap if exists a if not create it and put it in the map then return dao
public EntityDao createDao(EntityDaoType entityType)  {
 switch (entityType) {
        case mySpecialDaoTYPE:
            if (!daoMap.containsKey(entityType)) {
                    EntityDao<Type> mySpecialDao = new EntityDao(Type.class, sessFactory);
                    daoMap.put(entityType, mySpecialDao);
                }
                 return daoMap.get(entityType);
}

}
entitybeandofactory{
私有HashMap daoMap=新HashMap();
//从daoMap返回dao如果存在,则创建它并将其放入映射中,然后返回dao
公共EntityDao createDao(EntityDaoType entityType){
开关(实体类型){
案例mySpecialDaoTYPE:
如果(!daoMap.containsKey(entityType)){
EntityDao mySpecialDao=新的EntityDao(Type.class,sessFactory);
put(entityType,mySpecialDao);
}
返回daoMap.get(entityType);
}
}
现在我想用@PreAuthorize(“hasPermission()”)来注释dao方法,但是spring不知道用这种方式创建的dao,而且我不能一次重构整个项目,所以我创建了dao,在它上面我需要使用注释,在aplicationContectxt.xml中

<bean id="mySpecialDao" class="..EntityDao" >
    <constructor-arg>
        <value>myClass</value> 
    </constructor-arg>
    <constructor-arg ref="sessionFactory" />
</bean>

我的班级
在工厂里,我改变了创建这种特殊dao的行为

public class EntityDao<T> {

    private Class clazz;
    private SessionFactory sessFactory;

    public EntityDao(Class clazz, SessionFactory sessFactory) {
        this.clazz = clazz;
        this.sessFactory = sessFactory;

    }
.... dao methods 
}
     if (!daoMap.containsKey(entityType)) {
         EntityDao<Class> dao = (EntityDao<Class>) AppContext.getApplicationContext().getBean("mySpecialDao");
                daoMap.put(entityType, dao);
            }
if(!daoMap.containsKey(entityType)){
EntityDao=(EntityDao)AppContext.getApplicationContext().getBean(“mySpecialDao”);
daoMap.put(entityType,dao);
}

有没有更好的办法让spring知道我的DAO?我的意思是有没有办法让spring知道手动创建的instancess?

为什么需要工厂来创建DAO?这就是spring应用程序上下文


您似乎想限制使用基于角色的安全性调用DAO方法的能力。我认为这很好,而且是可以做到的,但您不需要限制DAO的创建。使用Spring创建DAO,然后限制访问。您的方法太过繁琐,没有必要。

为什么需要工厂来创建DAO?Spring就是这么做的应用程序上下文是


您似乎想限制使用基于角色的安全性调用DAO方法的能力。我认为这很好,而且是可以做到的,但您不需要限制DAO的创建。使用Spring创建DAO,然后限制访问。您的方法太过繁琐,不必要。

您可以使用AspectJ使用Spring AOP支持来实现这一点。阅读更多信息在这里:


启用此功能后,Spring将知道使用可配置注释创建的类的任何实例。然后,Spring将能够识别预授权注释。

您可以使用AspectJ使用Spring AOP支持来完成此操作。请阅读以下内容:


启用此功能后,Spring会意识到使用可配置注释创建的类的任何实例。然后Spring将能够识别预授权注释。

工厂在那里都是红色的,而且它在很多地方都是硬编码的,因此很难将其删除(不是我:-))。我不需要限制对dao或其方法的调用,而是基于当前用户的目标实体ID实现某种ACL,因此我有自己的权限计算器(hasPermission(身份验证、可序列化的targetId、字符串targetType、对象权限))工厂在很多地方都是硬编码的,所以很难摆脱它(不是我:-)。我不需要限制对dao或其方法的调用,而是基于当前用户的目标实体ID实现某种ACL,所以我有自己的PermissionEvaluator(hasPermission(身份验证、可序列化的targetId、字符串targetType、对象权限))