此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.4.1! |
GraalVM Native Image 中的方法安全性
尽管 GraalVM Native Image 支持方法安全性,但有些用例需要应用程序提供其他提示。
使用 and 注解@PreAuthorize
@PostAuthorize
如果你有 or 类的自定义实现,则 using 和 annotations 需要额外的提示。@PreAuthorize
@PostAuthorize
UserDetails
Authentication
让我们举一个例子,你有一个 class 的自定义实现,如下所示,该实现由 :UserDetails
UserDetailsService
public class CustomUserDetails implements UserDetails {
private final String username;
private final String password;
private final Collection<? extends GrantedAuthority> authorities;
public boolean isAdmin() {
return this.authorities.contains(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
// constructors, getters and setters
}
你想在 annotation 中使用该方法,如下所示:isAdmin()
@PreAuthorize
@PreAuthorize("principal?.isAdmin()")
public String hello() {
return "Hello!";
}
请记住,您需要将 |
如果使用上述配置运行应用程序的本机映像,则在尝试调用该方法时将收到类似于以下内容的错误:hello()
failed: java.lang.IllegalArgumentException: Failed to evaluate expression 'principal?.isAdmin()' with root cause
org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method isAdmin() cannot be found on type com.mypackage.CustomUserDetails
这意味着在类中找不到该方法。
这是因为 Spring Security 使用反射来调用该方法,而 GraalVM Native Image 默认不支持反射。isAdmin()
CustomUserDetails
isAdmin()
要解决此问题,您需要向 GraalVM Native Image 提供提示,以允许对方法进行反射。
我们可以通过提供自定义提示来做到这一点。
在此示例中,我们将使用 @RegisterReflectionForBinding
注解。CustomUserDetails#isAdmin()
您可能需要注册要在 and 注解中使用的所有类。 |
@Configuration
@RegisterReflectionForBinding(CustomUserDetails.class)
public class MyConfiguration {
//...
}
就是这样,现在您可以运行应用程序的本机映像,它应该可以按预期工作。