@PreAuthorize with Bean in expression(Spring Boot)

时间:2016-06-25 15:28:04

标签: spring spring-security spring-boot spelevaluationexception

简单的问题,我的控制器中有一个@Service类@Autowired

尝试在我的控制器中的某个方法上添加一点安全性。所以为了简单起见,我这样做是为了测试

@PreAuthorize("@myService.helloThere()")
public void someControllerMethod() {
    ...
}

但真的没有成功。在方法调用期间获取异常。

  

java.lang.IllegalArgumentException:无法计算表达式   ' @ myService.helloThere()'

我在这里错过了EL吗?

更新

只需添加最后由异常引起的

  

引起:   org.springframework.expression.spel.SpelEvaluationException:   EL1057E:(pos 1):没有在上下文中注册的bean解析器来解析   访问bean' dummyServiceImpl'

现在我不明白为什么如果我使用@Autowired,它无法在StandardEvaluationContext中访问?

更新2

由于我将自己的角色层次结构连接到自定义GlobalMethodSecurityConfiguration扩展类中,因此DefaultMethodSecurityExpressionHandler默认情况下未设置applicationContext。我不确定为什么这是设计或我错过了一些明显的东西。我搜索了参考页面,找到了另一个帮助我解决问题的SO thread。我发布了更新的安全配置。

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Autowired
    ApplicationContext applicationContext; //added this

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {           
        final DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();

        handler.setApplicationContext(applicationContext); //added this
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();

        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER_MANAGER > ROLE_USER");
        handler.setRoleHierarchy(roleHierarchy);
        return handler;
    }
}

1 个答案:

答案 0 :(得分:0)

试试这个。

  

@PreAuthorize( “myService.helloThere()”)