有没有办法在Getters中使用@PreAuthorize? (春季启动)

时间:2019-10-30 10:45:00

标签: spring spring-boot spring-security

我正在尝试将不同的对象用于不同的用户角色。

@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?

1 个答案:

答案 0 :(得分:0)

您只能在Spring Managed Bean中使用const body = new FormData(); Object.entries(request.fields).forEach(([k, v]) => { body.append(k, v); }); body.append('file', file); await fetch(request.url, { method: 'post', body: body });

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

如果您用@PreAuthorize标记一个类,它将成为一个Spring bean,可以由应用程序上下文注入和管理。现在,如果(不是Spring)创建此类的实例,则此特定实例将不受Spring的管理。

这意味着@Component在这种情况下将不起作用。

一种解决方法是使用@PreAuthorize

类似这样的东西:

Utils.java

SecurityContextHolder

TestObject.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;
    }

}