2013-08-06 46 views
15

我使用JBoss ASJAX-RS来创建REST端点。JAX-RS:如何保护REST端点?

比方说我的课看起来像

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


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

现在getAccount没有在此刻

通缉认证
- 我想补充的认证,这样,当代码击中getAccount用户已认证
- 我希望身份验证由注释而非XML配置驱动,如果可能的话
- 我想对数据库做比较,看用户是否有效

问题
- 我从来没有做过,所以我不知道如何实现它
- 我身边有很多用Google搜索发现泽西例子

UPDATE
- 我想送认证证书与每个请求,并创建任何会话

请指导我一个简单的工作示例,我会尝试从此延伸

+0

你要要求身份验证凭证会传入每个请求中,还是要允许创建会话? – thatidiotguy

+0

我刚刚更新了我的问题,我想每个请求发送凭据,而不是创造 – daydreamer

+0

我已经实现了解决方案 请参阅我的答案在http://stackoverflow.com/questions/18345600/how-任何会议to-intercept-rest-endpoint-to-all-all-headers?answertab =最老的#tab-top – daydreamer

回答

10

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

我已经通过修改拦截我已经解决了这个

令牌机制将被更新,下面是代码

注释

@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 
16

您需要的是JAX RS端点前面的无状态Spring安全配置。 我已经解决了,你正在试图解决具体问题,但我没有我自己的代码共享..

这里是一个项目,做你所要求的确切的事情,有些聪明的人做了这一切你;)

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

+0

真的帮了我 – daydreamer

+0

这对我也有帮助。由于我需要以不同的方式检查一些细节,因此我最终选择了“只是另一个演示”。尽管基础知识非常相似(不能否认灵感来自这里),但我放弃了UI和JPA/DB,并更多地关注Spring Security。结果是[here](https://github.com/virgo47/restful-spring-security),它的评论是基于Gradle的,包含基于curl的test.sh。然后我写了一篇关于这个话题的[博客文章](http://virgo47.wordpress.com/2014/07/27/restful-spring-security-with-authentication-token/)以及一些序列图。应该有帮助。 – virgo47

+1

嘿拉克什,我已经检查了github上的angular-rest-springsecurity项目,我有一个问题,虽然所有与安全相关的问题都在图片中进行了授权,但是当我刷新浏览器时,一旦用户被“验证”控制似乎被重定向到登录页面,即使当我只是登录,然后单击刷新....你有这个想法..? – Amit