Как работают аннотации безопасности Spring для методов? - PullRequest
0 голосов
/ 12 июля 2011

Рассмотрим этот код:

import java.util.Collections;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.userdetails.User;

public class SecureStuff {
    @PreAuthorize("#user.password == #oldPassword")
    public static void changePassword(User user, String oldPassword, String newPassword){
       System.out.print("Changing passwords ...");
    }

    public static void main(String[] args) {
        User joe = new User("Joe", "HansWurst", true, true, true, true, Collections.EMPTY_LIST);
        changePassword(joe, "HansWurst", "TeeWurst");
    }

}

Я запустил код в STS (SpringSource Tool Suite), и он работал как положено.(На нем было напечатано "Changing passwords ...".) Затем я переименовал пароль во что-то другое, ожидая, что вызов метода завершится ошибкой.

Я уже добавил строку <global-method-security pre-post-annotations="enabled"/> в свой файл конфигурации applicationContext-security.xml.

Что мне здесь не хватает?

Ответы [ 2 ]

6 голосов
/ 12 июля 2011
  1. Эти аннотации не работают на static методах
  2. Чтобы эти аннотации работали, вам необходимо объявить ваш объект как компонент контекста приложения (объект с элементом <global-method-security>)и вызовите аннотированный метод для экземпляра, полученного из контекста.

По сути, эти аннотации основаны на поддержке Spring AOP и наследуют все ограничения AOP на основе прокси.Для лучшего понимания вы можете взглянуть на документацию Spring AOP .

1 голос
/ 07 апреля 2012

@ PreAuthorize работает со статическими методами, но вам нужно установить режим global-method-security на aspectj

    <global-method-security pre-post-annotations="enabled" mode="aspectj"/>
...