使用自定义方法的@PreAuthorization注释不起作用

时间:2014-03-05 17:52:37

标签: spring-security

我尝试在服务层的方法级别使用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需要一个接口来查看底层实现。

1 个答案:

答案 0 :(得分:1)

Spring Security通过创建使用安全注释(即@PreAuthorize)注释的类的代理来工作。为了代理它,具有安全性注释的类必须由Spring创建,并且必须在Spring创建的实例上进行任何调用。

验证具有public Customer getCustomerInfo的类是由Spring创建的,而不是以其他方式创建的。