[英]JAX-RS: How to secure REST endpoints?
我正在使用JBoss AS
和JAX-RS
来创建REST
端点。
让我们说我的课看起来像
@Path("/users")
public class UserResource {
@GET
public Response getAccount() {
return "hello";
}
}
现在getAccount
目前尚未经过身份验证
通缉
- 我想添加身份验证,以便在代码命中getAccount
对用户进行身份验证
- 如果可能的话,我希望通过注释而不是XML配置来驱动身份验证
- 我想进行数据库比较,看看用户是否有效
问题
- 我从来没有这样做过,所以我不知道如何实现它
- 我搜索了很多泽西的例子
UPDATE
- 我想为每个请求发送身份验证凭据,而不是创建任何会话
请用一个简单的工作示例指导我,我会尝试从那里扩展
您需要在JAX RS端点前面建立无状态Spring Security配置。 我已经解决了你想要解决的确切问题,但我没有自己的代码来分享..
这是一个完成你要求的确切事情的项目,有些聪明人为你做了一切;)
https://github.com/philipsorst/angular-rest-springsecurity
什么是魔术?
请参阅以下链接以了解如何配置无状态Spring安全性.., https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/resources/context.xml
以下是在令牌检查后对每个请求执行编程登录的类... https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity /rest/AuthenticationTokenProcessingFilter.java
我用以下代码解决了这个问题。
注意一旦我这样做,令牌机制将被更新
我通过修改我的拦截器来解决这个问题,以下是代码
注解
@Inherited
@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface SecurityChecked {
}
资源类
public class SecureResource {
@GET
@SecurityChecked
public Response getUser() {
return Response.ok("authenticated successfully!").build();
}
}
拦截器类
@Interceptor
@Provider
@ServerInterceptor
@SecurityChecked
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod {
private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class);
@Nullable
@Override
public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException {
final List<String> authToken = request.getHttpHeaders().getRequestHeader("X-AUTH");
if (authToken == null || !isValidToken(authToken.get(0))) {
final ServerResponse serverResponse = new ServerResponse();
serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode());
return serverResponse;
}
return null;
}
private static boolean isValidToken(@Nonnull final String authToken) {
LOGGER.info("validating token: " + authToken);
return true;
}
@SuppressWarnings("rawtypes")
@Override
public boolean accept(final Class declaring, final Method method) {
// return declaring.isAnnotationPresent(SecurityChecked.class); // if annotation on class
return method.isAnnotationPresent(SecurityChecked.class);
}
}
然后我通过在JBoss中部署资源类并在命令行上发出以下命令来运行我的集成测试
curl --header 'X-AUTH: 1a629d035831feadOOO4uFReLyEW8aTmrCS' http://localhost:8080/market-1.0-SNAPSHOT/rest/login
curl --header 'InvalidHeader: InvalidHeaderValue' http://localhost:8080/market-1.0-SNAPSHOT/rest/login
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.