使用@PreAuthorize时,Spring SpelExpression似乎无法读取我的bean

时间:2019-05-16 11:11:30

标签: java spring spring-boot spring-security

我正在尝试使用@PreAuthorize,但需要对其进行配置,以使不同的环境具有不同的访问权限,但是当我尝试使用@PreAuthorize(“ hasAuthority(#bean)”)时,没有任何内容可以读入权威。

我曾经尝试使用#bean和@bean,但是都没有用,但是如果我有一个硬编码的字符串,它就可以正常工作。 当使用#bean时,什么都不会传递,而当使用@bean时,我得到No bean resolver registered in the context to resolve access to bean 'readRole'

    @Bean
    public String readRole() {
        return "Domain Users";
    }

    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @PreAuthorize("hasAuthority(@readRole)")
    public @interface UserCanSeeRestricted { }

然后在我的休息控制器中:

    @SecurityConfigExample.UserCanSeeRestricted
    @GetMapping("/all")
    public Collection<Office> getAllOffices()
    {
        return officeService.getAll();
    }

我希望能够使用readRole根据环境返回不同的组,并通过@PreAuthorize读取它们

我尝试过的事情:

public class SecurityConfig {
        public String readRole = "Domain Users";
    }
    @Bean
    public SecurityConfig readRole() {
        return new SecurityConfig();
    }

    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @PreAuthorize("hasAuthority(@readRole.readRole)")
    public @interface UserCanSeeRestricted { }

---第二次更新:

    public class SecurityConfig {
        public String readRole() {
            return "Domain Users";
        }
    }
    @Bean
    public SecurityConfig readRole() {
        return new SecurityConfig();
    }

    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @PreAuthorize("hasAuthority(@readRole.readRole())")
    public @interface UserCanSeeRestricted { }

我尝试更换

    @SecurityConfigExample.UserCanSeeRestricted

使用

@PreAuthorize("hasAuthority(@readRole.readRole())")

它不起作用

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasAnyAuthority(#root.getThis().getProps().getWriteRole())")
public @interface UserCanEditRestricted { }

我的每个控制器都必须有一个props对象,用于存储角色。通过这种方式可以配置角色。