春天安全没有在preAuthorize上工作

时间:2015-07-22 13:08:44

标签: spring-security

配置Spring Security看起来像是一个黑暗的艺术!

我正在尝试实现方法级安全性。我已经尝试了一切来让这个方法解决它的preAuthorize。

任何人都可以解释为什么第一种方法正常工作并评估任何表达式对它的反对,但第二种方法不能。在日志中,我没有看到对该方法的安全框架的任何调用(我已经重启服务器可能20次,并且尝试了在父方法上有和没有任何preAuthorize的各种版本)...

这很有挑战性,我没有任何信息可用,SPEL表达式没有调试功能......我似乎在这个试验和错误循环中无处可去!

第二种方法肯定是输入的,因为我可以调试它并在日志中查看输出。

 @PreAuthorize("hasAnyRole('ROLE_REGISTERED_CUSTOMER', 'ROLE_ADMIN')")
    public void updateAddress(CustomerAddress customerAddress) {

        logger.entry();

        geocodingService.geoCodeAddress(customerAddress);

        if (customerAddress.getId() != null)
        {
            CustomerAddress oldAddress = customerAddressRepository.findForReference(customerAddress.getId());
            updateExistingAddress(customerAddress, oldAddress);
            customerSearchService.reindexCustomer(oldAddress.getCustomer(), true);
        }else
        {
            updateNewAddress(customerAddress);
            customerSearchService.reindexCustomer(customerAddress.getCustomer(), true);
        }
        logger.exit();
    }

    /**
     * A secured method for updating the existing address.
     * @param newAddress the new address
     * @param oldAddress the existing database address
     */
    @PreAuthorize("denyAll")
    public void updateExistingAddress(CustomerAddress newAddress, CustomerAddress oldAddress)
    {
        logger.entry();

        logger.debug("Updating an existing address.");


        oldAddress.mergeEdit(newAddress);
        saveAddress(oldAddress);

        logger.exit();
    }

1 个答案:

答案 0 :(得分:1)

正如@ M.Deinum所说,代理确实会被内部方法调用调用。如果您需要此支持,则需要使用AspectJ。您可以在示例中的xmljava config中找到使用AspectJ的示例。