Spring Method Security вызывает нулевые значения для объектов с автопроводкой - PullRequest
2 голосов
/ 21 мая 2019

Я немного поиграл с пружинным безопасным методом и получил очень странное поведение.У меня есть несколько классов контроллеров, и методы помечены @PreAuthorize, чтобы ограничить доступ для определенных пользовательских ролей.

Существует один класс контроллеров, для которого введенные объекты становятся пустыми после добавления защиты метода.Я отладил в своем коде и обнаружил следующее:

enter image description here

service и userService являются внедренными объектами

@Controller
public class OrderController {

    @Autowired
    private OrderService service;

    @Autowired
    private UserService userService;

Что мне кажется странным, так это описание значения this : OrderController $$ EnhancerBySpringCGLIB $$ 1a7122f6.Удаляя все аннотации MethodSecurity, класс работает, как и ожидалось.

Когда я смотрю на другие классы контроллеров, которые также используют безопасность методов, они работают нормально, а список переменных в отладчике выглядит нормально:

enter image description here

@Controller
public class UserController {

    @Autowired
    private UserService service;

Я также искал ошибки, которые мог сделать с аннотациями, но аннотации в OrderController выглядят так же, как и в других классах Controller.Вот примеры класса OrderController:

@Controller
public class OrderController {
              .
              .
              .
    @GetMapping("/dispo/dispo")
    @PreAuthorize("hasAuthority('ADMIN') or hasAuthority('DISPATCH')")
    private String showDispoPage() {
        return "/dispo/dispo";
    }

    @GetMapping("/dispo/orderCreate")
    @PreAuthorize("hasAuthority('ADMIN') or hasAuthority('AL_SYNC_ADMIN') or hasAuthority('CLIENT_USER') or hasAuthority('DISPATCH')")
    private String showCreateOrder(Model model) {
        List<MdUser> userList = service.getUsers();
        model.addAttribute("userList", userList);

        return "/dispo/orderCreate";
    }
}

А вот пример другого класса контроллера, который работает, как и ожидалось:

@Controller
public class UserController {
                 .
                 .
                 .

    @GetMapping("/admin/user")
    @PreAuthorize("hasAuthority('ADMIN') or hasAuthority('DISPATCH') or hasAuthority('WEBTOOL_USER')")
    public String showInvalidUserPage(Model model) {
        List<UserModel> invalidUserList = service.findInvalidUsers(service.getUsers());

        model.addAttribute("userList", invalidUserList);
        return "/admin/user";
    }

    @GetMapping("/admin/userCreate")
    @PreAuthorize("hasAuthority('ADMIN')")
    public String showNewUserPage(Model model) {
        UserModel user = new UserModel();
        model.addAttribute("user", user);
        return "/admin/userCreate";
    }
}

Так что здесь может пойти не так?Я не понимаю, почему этот один класс ведет себя иначе, чем другие классы.

1 Ответ

3 голосов
/ 21 мая 2019

Spring Security использует AOP (Аспектно-ориентированное программирование), чтобы "обернуть" аннотированный метод советом AOP.Как только метод с аннотацией безопасности до / после вызова вызывается, совет проверяет, прошел ли пользователь аутентификацию и авторизацию.Метод вызывается, если он успешно проверяется, в противном случае выполняется обход неавторизованного / неаутентифицированного потока.

Spring AOP может выполнять только время выполнения ткачество на открытых методах.showDispoPage и showCreateOrder являются частными, что может повлиять на рекомендации по безопасности.

Я бы переместил аннотации авторизации до / после авторизации на уровень сервиса.Он не только обеспечивает лучшее разделение между аннотациями контроллера и аннотациями безопасности, но также защищает от любых будущих ошибок.Например, в вашей текущей установке любые вызовы метода UserService не будут проверены, если они вызываются через другой контроллер, где аннотации безопасности были забыты.

Кроме того, вы также можете выбратьиспользовать web security (защита доступа к URI, например, /some/path) вместе с текущей настройкой method level security.

...