您可以在中执行此逻辑
ContainerRequestFilter。在这里处理自定义安全功能非常普遍。
要考虑的一些事情
该类应带有注释,
@Priority(Priorities.AUTHENTICATION)
以便在其他过滤器(如果有)之前执行。您应该
SecurityContext
在过滤器中使用。我要做的是实现一个SecurityContext
。您可以根据需要真正实现它。
这是一个没有任何安全逻辑的简单示例
@Provider@Priority(Priorities.AUTHENTICATION)public class SecurityFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { SecurityContext originalContext = requestContext.getSecurityContext(); Set<String> roles = new HashSet<>(); roles.add("ADMIN"); Authorizer authorizer = new Authorizer(roles, "admin", originalContext.isSecure()); requestContext.setSecurityContext(authorizer); } public static class Authorizer implements SecurityContext { Set<String> roles; String username; boolean isSecure; public Authorizer(Set<String> roles, final String username, boolean isSecure) { this.roles = roles; this.username = username; this.isSecure = isSecure; } @Override public Principal getUserPrincipal() { return new User(username); } @Override public boolean isUserInRole(String role) { return roles.contains(role); } @Override public boolean isSecure() { return isSecure; } @Override public String getAuthenticationScheme() { return "Your Scheme"; } } public static class User implements Principal { String name; public User(String name) { this.name = name; } @Override public String getName() { return name; } }}注意事项
- 我创建了一个
SecurityContext
- 我添加了一些角色,并将它们用作
isUserInRole
方法。这将用于授权。 - 我创建了一个
User
实现的自定义类java.security.Principal
。我返回了这个自定义对象 - 最后,我
SecurityContext
在ContainerRequestContext
怎么办?让我们看一个简单的资源类
@Path("secure")public class SecuredResource { @GET @RolesAllowed({"ADMIN"}) public String getUsername(@Context SecurityContext securityContext) { User user = (User)securityContext.getUserPrincipal(); return user.getName(); }}注意事项:
SecurityContext
被注入该方法。- 我们得到
Principal
并将其投射到User
。因此,实际上您可以创建任何实现的类Principal
,并根据需要使用此对象。 - 使用
@RolesAllowed
注释。对于Jersey,有一个过滤器SecurityContext.isUserInRole
通过传入@RolesAllowed
批注中的每个值来检查,以查看是否允许用户访问资源。
要在Jersey启用此功能,我们需要注册
RolesAllowedDynamicFeature
@ApplicationPath("/api")public class AppConfig extends ResourceConfig { public AppConfig() { packages("packages.to.scan"); register(RolesAllowedDynamicFeature.class); }}


