dropwizard 中的身份验证流程
authentication flow in dropwizard
我翻了很多论坛了解流程,但仍然对正确的流程感到困惑。
我正在使用 Dropwizard,首先我想从 REST 获取令牌 API(用户名和密码将在基本身份验证中提供)然后下次将在每个请求中传递此令牌。
主要Class
environment.jersey()
.register(
new AuthDynamicFeature(
new JwtAuthFilter.Builder<User>()
.setAuthenticator(new MarginCalcAuthenticator())
.setAuthorizer(
new CalcAuthorizer())
.setRealm("BASIC-AUTH-REALM")
.buildAuthFilter()));
environment.jersey().register(RolesAllowedDynamicFeature.class);
environment.jersey().register(new AuthValueFactoryProvider.Binder<User>(User.class));
AuthFilter
@Priority(Priorities.AUTHENTICATION)
public class JwtAuthFilter<P extends Principal> extends AuthFilter<JWTCredentials, P> {
private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthFilter.class);
public static final String AUTHENTICATION_HEADER = "Authorization";
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
String authCredentials = requestContext.getHeaderString(AUTHENTICATION_HEADER);
验证者
public class CalcAuthenticator implements Authenticator<JWTCredentials, User> {
public Optional<User> authenticate(JWTCredentials credentials)
throws AuthenticationException {
AdminAuthenticationService authService = new AdminAuthenticationService();
User userObj = authService.authenticate(credentials.getJwtToken());
if (userObj == null) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
return Optional.of(userObj);
}
}
休息API资源class
@GET
@Path("token")
@Produces(MediaType.TEXT_PLAIN)
public Response genToken(@Context SecurityContext sc){
return Response
.ok()
.header("Authorization", "Bearer "+AdminAuthenticationService.issueToken((br.dc.auth.User) sc
.getUserPrincipal())).build();
}
我正在从 Postman 进行调试,它正在命中我的 API genToken,但它从未到达 JwtAuthFilter 或 CalcAuthenticator。谁能帮我理解流程?我想了解流程。
正如 Paul 提到的那样,class 或使用 @RolesAllowed(或任何其他 authz anno)注释的方法需要进行身份验证。身份验证仅在您告诉它的方法(或 classes)上完成。
流量
在环境中注册您的过滤器、身份验证器等 -> 启动您的服务器 -> 从 UI 或邮递员请求令牌 -> 它会命中您的 AuthFilter -> 您可以调用您的身份验证器进行令牌验证 -> 验证您的请求并相应地发送响应。
我翻了很多论坛了解流程,但仍然对正确的流程感到困惑。
我正在使用 Dropwizard,首先我想从 REST 获取令牌 API(用户名和密码将在基本身份验证中提供)然后下次将在每个请求中传递此令牌。
主要Class
environment.jersey()
.register(
new AuthDynamicFeature(
new JwtAuthFilter.Builder<User>()
.setAuthenticator(new MarginCalcAuthenticator())
.setAuthorizer(
new CalcAuthorizer())
.setRealm("BASIC-AUTH-REALM")
.buildAuthFilter()));
environment.jersey().register(RolesAllowedDynamicFeature.class);
environment.jersey().register(new AuthValueFactoryProvider.Binder<User>(User.class));
AuthFilter
@Priority(Priorities.AUTHENTICATION)
public class JwtAuthFilter<P extends Principal> extends AuthFilter<JWTCredentials, P> {
private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthFilter.class);
public static final String AUTHENTICATION_HEADER = "Authorization";
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
String authCredentials = requestContext.getHeaderString(AUTHENTICATION_HEADER);
验证者
public class CalcAuthenticator implements Authenticator<JWTCredentials, User> {
public Optional<User> authenticate(JWTCredentials credentials)
throws AuthenticationException {
AdminAuthenticationService authService = new AdminAuthenticationService();
User userObj = authService.authenticate(credentials.getJwtToken());
if (userObj == null) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
return Optional.of(userObj);
}
}
休息API资源class
@GET
@Path("token")
@Produces(MediaType.TEXT_PLAIN)
public Response genToken(@Context SecurityContext sc){
return Response
.ok()
.header("Authorization", "Bearer "+AdminAuthenticationService.issueToken((br.dc.auth.User) sc
.getUserPrincipal())).build();
}
我正在从 Postman 进行调试,它正在命中我的 API genToken,但它从未到达 JwtAuthFilter 或 CalcAuthenticator。谁能帮我理解流程?我想了解流程。
正如 Paul 提到的那样,class 或使用 @RolesAllowed(或任何其他 authz anno)注释的方法需要进行身份验证。身份验证仅在您告诉它的方法(或 classes)上完成。
流量 在环境中注册您的过滤器、身份验证器等 -> 启动您的服务器 -> 从 UI 或邮递员请求令牌 -> 它会命中您的 AuthFilter -> 您可以调用您的身份验证器进行令牌验证 -> 验证您的请求并相应地发送响应。