我正在尝试集成我的GWT应用程序和Spring Security。当我向我的DAO类的方法添加@PreAuthorize("hasRole('ROLE_USER')")
注释时,会出现以下异常:
没有定义[server.dao.ElementServiceDAO]类型的唯一bean: 预计单豆但发现0
DaoServiceLocator找不到DAO bean,但在调试模式下,我在ApplicationContext实例中看到了elementServiceDAO bean。
我的DAO课程如下:
@Service
public class ElementServiceDAO extends EntityDAO {
@PreAuthorize("hasRole('ROLE_USER')")
@SuppressWarnings("unchecked")
public Layer getFullRenderingTopology() {
...
}
}
DAO服务定位器的代码:
public class DaoServiceLocator implements ServiceLocator {
@Override
public Object getInstance(final Class<?> clazz) {
try {
final HttpServletRequest request = RequestFactoryServlet
.getThreadLocalRequest();
final ServletContext servletContext = request.getSession()
.getServletContext();
final ApplicationContext context = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
return context.getBean(clazz);
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
}
applicationContext-security.xml:
<authentication-manager>
<authentication-provider>
<user-service>
<user name="operator" password="operator" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="guest" password="guest" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
<global-method-security pre-post-annotations="enabled" />
请给我任何建议!
答案 0 :(得分:1)
当ElementServiceDAO
实现接口时(在您的情况下 - 通过EntityDAO
传递),Spring默认创建基于接口的代理来应用安全性方面。因此,应用程序上下文中的elementServiceDAO
是不是ElementServiceDAO
实例的代理,因此无法按类型检索它。
您需要
强制创建基于目标类的代理,如下所示
<global-method-security
pre-post-annotations="enabled" proxy-target-class = "true" />
或为ElementServiceDAO
创建业务接口,并使用该接口而不是实现类。
另见: