If Spring Security's method security is used on a final class that implements an interface it fails. Instead it should create an interface based proxy

For example:

public interface BankAccountService {
    BankAccount findById(int id);
}

@Service
public final class BankAccountServiceImpl implements BankAccountService {
    @PostAuthorize("returnObject?.owner == authentication?.name")
    @Override
    public BankAccount findById(int id) {
        return null;
    }
}

@SpringBootApplication
@EnableMethodSecurity
public class BankAccountApplication {

    public static void main(String[] args) {
        SpringApplication.run(BankAccountApplication.class, args);
    }

}

// fails due to final class being proxied as class based proxy instead of interface based proxy
@SpringBootTest
class BankAccountServiceTest {
    @Autowired
    BankAccountService accounts;

    @Test
    void loads() {}
}

Comment From: rwinch

cc @jzheaux