尽管我以前在这里找到了很多问题的答案,但我还是新来的。
现在我正在寻找这方面的帮助:我在我的小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);
}
}
有了这些,当我请求URI greeting/all时,一切都很好,会显示字符串"Hello,大家好!"。但是,当我请求URI问候语/admin时,即使我的isUserInRole方法总是返回true,也永远不会调用该URI问候语/admin,当管理员角色的用户请求它时,应该调用该URI。事实上,我的filter方法总是被调用,但我的isUserInRole方法从未被调用。
我听从了很多建议:
SecurityContext没有';不使用@RolesAllowed
使用角色授权AllowedDynamicFeature和Jersey
如何访问由@RolesAllowed 保护的泽西岛资源
使用JAX-RS和Jersey 进行基于REST令牌的身份验证的最佳实践
但它似乎对任何东西都不起作用。
有人能帮我吗?我不知道是不是有什么东西我错过了
提前谢谢大家。
编辑:当我请求URI问候语/admin时,顺便说一句,我得到了403 Forbiden(我忘了这么说)
查看RoleAllowedRequestFilter
的源代码。当用户通过身份验证时,预期存在关联的Principal
。过滤器在这里检查
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;
}
因此,您需要在SecurityContext
的getUserPrincipal
中返回一个Principal
@Override
public Principal getUserPrincipal() {
return new Principal() {
@Override
public String getName() {
return "Some Name";
}
};
}