gpt4 book ai didi

java - 使用角色注释进行保护不起作用( Jersey )

转载 作者:太空宇宙 更新时间:2023-11-04 13:05:27 24 4
gpt4 key购买 nike

我是新来的,尽管我之前已经在这里找到了许多问题的答案。

现在我正在寻求这方面的帮助:我的小 REST API 上有这个小示例资源:

@Path("/greeting")
@PermitAll
public class HelloResource {

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("all")
public String sayHelloToAll() {
return "Hello, everybody!";
}

@GET
@Produces(MediaType.TEXT_PLAIN)
@RolesAllowed("admin")
@Path("admin")
public String sayHelloToAdmin() {
return "Hello, admin!";
}
}

为了过滤角色,我有这样的 SecurityContext 实现:

public class Authorizer implements SecurityContext {

@Override
public String getAuthenticationScheme() {
return null;
}

@Override
public Principal getUserPrincipal() {
return null;
}

@Override
public boolean isSecure() {
return false;
}

@Override
public boolean isUserInRole(String role) {
return true;
}
}

ContainerRequestFilter 的实现:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthorizationFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.setSecurityContext(new Authorizer());
}
}

这是我的应用程序类:

@ApplicationPath("/")
public class Application extends ResourceConfig {

public Application() {
super(HelloResource.class);
register(AuthorizationFilter.class);
register(RolesAllowedDynamicFeature.class);
}
}

有了这一切,当我请求 URIgreeting/all 时,一切正常,字符串“Hello, everything!”显示。但是,当我请求 URIgreeting/admin 时(当具有管理员角色的用户请求它时应该调用它),即使我的 isUserInRole 方法始终返回 true,也永远不会调用它。事实上,我的过滤器方法总是被调用,但我的 isUserInRole 方法从未被调用。

我遵循了很多建议:

SecurityContext doesn't work with @RolesAllowed

Authorization with RolesAllowedDynamicFeature and Jersey

How to access Jersey resource secured by @RolesAllowed

Best practice for REST token-based authentication with JAX-RS and Jersey

但它似乎对任何东西都不起作用。

有人可以帮我吗?我不知道我是否缺少一些东西

提前谢谢大家。

编辑:当我请求 URI 问候/管理时,我顺便得到 403 Forbiden(我忘了说)

最佳答案

查看 RoleAllowedRequestFilter 的源代码。当用户通过身份验证时,预计会有一个关联的 Principal。过滤器检查它 here

if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) {
throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
...
private static boolean isAuthenticated(final ContainerRequestContext requestContext) {
return requestContext.getSecurityContext().getUserPrincipal() != null;
}

所以你需要在SecurityContextgetUserPrincipal中返回一个Principal

@Override
public Principal getUserPrincipal() {
return new Principal() {
@Override
public String getName() {
return "Some Name";
}
};
}

关于java - 使用角色注释进行保护不起作用( Jersey ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com