首页 > 解决方案 > 有没有办法在 Getters 中使用 @PreAuthorize?(弹簧靴)

问题描述

我正在尝试为不同的用户角色使用不同的对象。

@Component    
public class TestObject {
        private String name;
        private String secret;

        @PreAuthorize("hasRole('ADMIN')")
        public String getSecret() {
            return secret;
        }
        public void setSecret(String secret) {
            this.secret = secret;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

有没有办法像这样使用@PreAuthorize?

标签: springspring-bootspring-security

解决方案


@PreAuthorize只能在 Spring Managed Bean 中使用。

如果您必须创建一个对象的多个实例,则这些实例不由应用程序上下文管理。

如果你用 标记一个类@Component,这将成为一个 Spring bean,并且可以由应用程序上下文注入和管理。现在,如果(不是 Spring)创建这个类的一个实例,那么这个特定的实例不是由 Spring 管理的。

这意味着,这@PreAuthorize在这种情况下不起作用。

一种解决方法是使用SecurityContextHolder.

像这样的东西:

实用程序.java

public class Utils {

    public static boolean isAdmin() {
        Collection<?extends GrantedAuthority> authorities = SecurityContextHolder.getContext()
            .getAuthentication().getAuthorities();
        for (GrantedAuthority authority: authorities) {
            if (authority.getAuthority().equalsIgnoreCase("ADMIN")) {
                return true;
            }
        }

        return false;
    }

}

测试对象.java

public class TestObject {

    private String name;
    private String secret;

    public String getSecret() {
        if(Utils.isAdmin())
            return secret;

        return null;
    }
    public void setSecret(String secret) {
        this.secret = secret;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

推荐阅读