15

我正在使用JBoss ASandJAX-RS来创建REST端点。

可以说我的课看起来像

@Path("/users")
public class UserResource {


  @GET
  public Response getAccount() {
    return "hello";
  }
}

现在getAccount暂时没有认证

需要-我想
添加身份验证,以便在代码命中时getAccount对用户进行身份验证
-如果可能的话,我希望身份验证由注释而不是 XML 配置驱动
-我想进行数据库比较以查看是否用户有效

问题
- 我从来没有这样做过,所以我不知道如何实现它
- 我在谷歌上搜索了很多并找到了泽西岛的例子

更新
- 我想随每个请求发送身份验证凭据,而不是创建任何会话

请用一个简单的工作示例指导我,我会尝试从那里扩展

4

2 回答 2

15

您需要的是在您的 JAX RS 端点前面的无状态 Spring Security 配置。我已经解决了您要解决的确切问题,但我没有自己的代码要分享..

这是一个完成了您所要求的确切事情的项目,某个智者为您完成了这一切;)

https://github.com/philipsorst/angular-rest-springsecurity

什么是魔法?

  1. 您有一个不受保护的 URL 进行身份验证,并设置用户角色。
  2. 然后你返回某种令牌,把它放在缓存中的某个位置,这将在每次后续调用中出现。
  3. 根据对其他受保护资源的新请求,您将检查令牌是否存在于您的缓存/会话存储中(您需要一些机制来跟踪有效令牌)
  4. 如果令牌被重新发送并且有效,您可以在 Spring Security 中进行编程登录,以确保您可以使用 Spring 提供的所有安全功能(注释、JSTL 标签等)!
  5. 通过令牌验证后,您将在控制器(也称为 JAX RS 资源)中获得登录用户详细信息,以进一步处理安全问题。
  6. 如果令牌无效或不存在,它将被故障端点捕获,该端点将返回适当的响应(401)

请参阅以下链接以了解如何配置无状态 Spring Security .., 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/resources/UserResource.java

这是在令牌检查后对每个请求执行编程登录的类。 https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity /rest/AuthenticationTokenProcessingFilter.java

于 2013-08-19T19:58:22.350 回答
11

我用下面的代码解决了这个问题。

注意一旦我这样做,令牌机制将被更新

我已经通过修改我拥有的拦截器解决了这个问题,以下是代码

注解

@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
于 2013-08-21T16:24:22.053 回答