首先,我已经在google上进行了广泛的搜索,虽然似乎应该有一个修复程序,但我无法在@Bean内成功引用注入(inject)的PermissionEvaluator:

https://jira.springsource.org/browse/SEC-2136?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

在该问题的评论部分,Rob Winch提供了围绕建议的解决方案



话虽如此,我在实现发布的XML的基于注释的JavaConfig版本时遇到了麻烦。 我正在使用Spring Boot 1.0.0.BUILD-SNAPSHOT和spring-boot-starter-security。

我有一个类来配置方法安全性,如下所示:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {

        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(new MyPermissionEvaluator());
        expressionHandler.setParameterNameDiscoverer(new SimpleParameterDiscoverer());

        return expressionHandler;
    }
}

PermissionEvaluator的开头:
public class MyPermissionEvaluator implements PermissionEvaluator {

    private static final Logger LOG = LoggerFactory.getLogger(MyPermissionEvaluator.class);

    @Autowired
    private UserRepository userRepo;

    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {

    if (authentication == null || !authentication.isAuthenticated()) {
        return false;
    }

    if (permission instanceof String) {

        switch((String) permission) {

        case "findUser":
            return handleUserPermission(authentication, targetDomainObject);

        default:
            LOG.error("No permission handler found for permission: " + permission);
        }
    }

    return false;
}

@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {

    throw new RuntimeException("Id-based permission evaluation not currently supported.");
}

private boolean handleUserPermission(Authentication auth, Object targetDomainObject) {

    if (targetDomainObject instanceof Long) {

        boolean hasPermission = userRepo.canFind((Long) targetDomainObject);

        return hasPermission;
    }

    return false;
}

}

需要做些什么,以便我可以从UserRepository内部获取对PremissionEvaluator的引用?我尝试了各种变通办法,但都没有成功。似乎没有什么可以将@Autowired转换为PermissionEvaluator ...

最佳答案

无法将任何东西自动连接到使用new ...()创建的对象中(除非您使用的是@Configurable和AspectJ)。因此,几乎可以肯定,您需要将PermissionEvaluator提取为@Bean。如果您还需要使其成为惰性代理(由于Spring Security初始化的排序敏感性),则应添加@Lazy @Scope(proxyMode=INTERFACES)(或TARGET_CLASS,如果更适合您)。

08-17 11:34