Vít*_*ero 2 java security jax-rs quarkus
我有一个 Quarkus 应用程序,在其中实现了ContainerRequestFilter用于保存传入请求的标头的接口:
@PreMatching
public class SecurityFilter implements ContainerRequestFilter {
private static final String HEADER_EMAIL = "HD-Email";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
String email = requestContext.getHeaders().getFirst(HEADER_EMAIL);
if (email == null) {
throw new AuthenticationFailedException("Email header is required");
}
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return () -> email;
}
@Override
public boolean isUserInRole(String role) {
return false;
}
@Override
public boolean isSecure() {
return false;
}
@Override
public String getAuthenticationScheme() {
return null;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
在用注释的类中,ApplicationScoped我注入了上下文,如下所示:
@ApplicationScoped
public class ProjectService {
@Context
SecurityContext context;
...
}
Run Code Online (Sandbox Code Playgroud)
问题是该context属性实际上从未被注入,因为它总是如此null。
我究竟做错了什么?我应该怎么做才能检索SecurityContext整个应用程序的代码?
Nik*_*los 14
我喜欢抽象这个问题,以便业务逻辑不依赖于 JAX-RS 特定的构造。因此,我创建一个类来描述我的用户,例如User,以及另一个接口,AuthenticationContext,它保存当前用户和我需要的任何其他与身份验证相关的信息,例如:
public interface AuthenticationContext {
User getCurrentUser();
}
Run Code Online (Sandbox Code Playgroud)
我创建了RequestScoped此类的实现,它也具有相关的设置器:
@RequestScoped
public class AuthenticationContextImpl implements AuthenticationContext {
private User user;
@Override
public User getCurrentUser() {
return user;
}
public void setCurrentUser(User user) {
this.user = user;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我将此 bean 和 JAX-RS 注入SecurityContext到过滤器中,该过滤器知道如何创建User并将其设置到我的应用程序特定的中AuthenticationContext:
@PreMatching
public class SecurityFilter implements ContainerRequestFilter {
@Inject AuthenticationContextImpl authCtx; // Injecting the implementation,
// not the interface!!!
@Context SecurityContext securityCtx;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
User user = ...// translate the securityCtx into a User
authCtx.setCurrentUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,任何需要用户数据的业务 bean 都会注入环境中立的、特定于应用程序的AuthenticationContext.
| 归档时间: |
|
| 查看次数: |
5988 次 |
| 最近记录: |