考虑以下代码:
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
配置文件中。
我在这里缺少什么?
答案 0 :(得分:6)
static
种方法<global-method-security>
元素的bean),并在从上下文获取的实例上调用带注释的方法。基本上,这些注释基于Spring AOP支持并继承了proxy-based AOP的所有限制。为了更好地理解,您可以查看Spring AOP documentation。
答案 1 :(得分:1)
@PreAuthorize确实可以处理静态方法,但是你需要将global-method-security的模式设置为aspectj
<global-method-security pre-post-annotations="enabled" mode="aspectj"/>