我尝试在服务层的方法级别使用Spring @PreAuthorize调用自定义方法,但我的自定义方法未被调用。我的代码:
弹簧应用context.xml中:
<context:component-scan base-package="com.dice" />
<sec:global-method-security pre-post-annotations="enabled"/>
组件定义:
@Component(value="authorizationService")
public class AuthorizationService implements AuthorizationServiceInt {
public boolean test(String key) {
logger.debug("AUTHORIZATION CALLED: " + key);
return false;
}
}
调用util类的控制器:
@InjectParam
CustomerUtil customerUtil;
@GET
@Path("/{customerId}/")
@Produces(MediaType.APPLICATION_JSON)
public Response getCustomerInfo(@PathParam("customerId") Integer customerId,
@DefaultValue("") @QueryParam("fields") String partialResponseFields) {
logger.debug("getCustomerInfo called: id: " + customerId + ", uriInfo = " + uriInfo.getPath());
try {
return buildOKResourceResponse(new CustomerActionResource(customerUtil.getCustomerInfo(uriInfo, customerId)),partialResponseFields);
组件的用法:
@InjectParam
AuthorizationService svc;
@PreAuthorize("@authorizationService.test('special')")
public Customer getCustomerInfo(UriInfo uriInfo, Integer id) {
logger.debug("svc: " + svc.hasPermission("x"));
return populateCustomerInfo(uriInfo, PstUserModelServiceUtil.getPstUserModelByPstUserId(id));
}
我包含InjectParam只是为了确保Spring识别AuthorizationService类。果然,“AUTHORIZATION CALLED&C 39。当我通过注入的类调用时出现debug语句,但是在通过@PreAuthorization调用调用时不会出现。
我的春天罐子:
spring-aop-3.2.0.RELEASE.jar
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-context-support-3.2.2.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-data-commons-1.5.0.RELEASE.jar
spring-data-solr-1.0.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
spring-jdbc-3.2.0.RELEASE.jar
spring-orm-3.2.0.RELEASE.jar
spring-security-acl-3.1.4.RELEASE.jar
spring-security-config-3.1.4.RELEASE.jar
spring-security-core-3.1.4.RELEASE.jar
spring-security-oauth2-1.1.0.BUILD-SNAPSHOT.jar
spring-security-taglibs-3.1.4.RELEASE.jar
spring-security-web-3.1.4.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
spring-web-3.2.2.RELEASE.jar
spring-webmvc-3.2.2.RELEASE.jar
我做错了什么?我使用组件在组件类和类上都有接口,因为我用aop读取,Spring装饰了一个impl类,即spring需要一个接口来查看底层实现。
答案 0 :(得分:1)
Spring Security通过创建使用安全注释(即@PreAuthorize
)注释的类的代理来工作。为了代理它,具有安全性注释的类必须由Spring创建,并且必须在Spring创建的实例上进行任何调用。
验证具有public Customer getCustomerInfo
的类是由Spring创建的,而不是以其他方式创建的。