如果我有这样的事情:
public class Roles {
public static final String ENVIRONMENT_DEPENDENT_ADMIN_ROLE = "ADMIN";
private Roles() {}
}
最终在 Spring Boot 中在控制器级别使用:
@RolesAllowed(ENVIRONMENT_DEPENDENT_ADMIN_ROLE)
此注释需要一个常量,因此没有简单的方法可以绕过它。
问题是,每个角色都有不同的名称,需要根据其部署的环境来使用。
有没有办法在编译之前从相关环境application.yml中提取this的值?
示例application-dev.yml:
app:
roles:
admin: devappadminrole
因此它在运行时最终是这样的:
public static final String ENVIRONMENT_DEPENDENT_ADMIN_ROLE = "devappadminrole";
我知道这是不好的做法,并且在很多方面都违背了 Java 编码实践,但这就是我的要求。
我尝试研究一些编译时选项,例如 Roles java 文件中的查找和替换,这看起来有点老套。我也考虑过编辑 build.gradle 脚本。
这是针对您的场景的解决方案,通过
yml
动态配置角色。我将使用代码片段来理清思路。
如果你有 spring aop 的经验,我认为构建它会很容易,即使没有,也没关系,下面的示例代码片段会让事情变得更容易:
@Aspect
@Component
public class RolesAllowedAspect {
@Value("${app.roles.admin}")
String roleConfig; // get Config user SpringEL
private Environment environment; // get Config from environment
@Autowired
public MyAspect(Environment environment) {
this.environment = environment;
}
//1. Mark ```@RolesAllowed``` as pointcut
@Before("execution(@com.example.annotations.RolesAllowed * *(..)) && @annotation(rolesAllowed)")
public void beforeAdvice() {
String propertyValue = environment.getProperty("app.roles.admin");
// .....2. do your code business, value comparison or others
}
}