在Spring的Preauthorize表达式中使用Autowired bean

时间:2019-12-02 08:10:58

标签: java spring spring-security

我的Spring应用程序中有以下用于资源的类

@RestController
@RequestMapping("/whatever")
public class SomeResource {

@Autowired
private CoolService coolService;

@RequestMapping(
            path = "",
            method = RequestMethod.GET)
    @PreAuthorize("hasPerm(@coolService.resolve(#attribute))")
    public void resource(@PathVariable("attribute") int attribute) {
        ...
    }

我想调用实现了CoolService的bean,该实现已由Spring上下文自动连接,因为对于CoolService,我有两个bean会根据启动时的配置文件被激活。

public interface CoolService {

    resolve(int attribute);
}
@Service
@Profile("super")
public interface SuperCoolService implements CoolService {

    public Object resolve(int attribute){...}
}
@Service
@Profile("ultra")
public interface UltraCoolService implements CoolService {

    public Object resolve(int attribute){...}
}

但是,似乎Spring不知道要使用哪个bean,因为没有一个仅命名为CoolService的bean,并且在Preauthorize中我无法写@superCoolService或{{ 1}},因为它取决于配置文件。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

如果要定义2个bean实现相同的接口,则可以对@Qualifier进行用户注释。 例如:

@Service
@Qualifier("service1")
public interface SuperCoolService implements CoolService {

    public Object resolve(int attribute){...}
}

@Service
@Qualifier("service1")
public interface UltraCoolService implements CoolService {

    public Object resolve(int attribute){...}
}