Ana*_*and 4 java rest jax-rs jersey jersey-2.0
我对Web服务非常陌生.我已经使用Jersey 2与Spring集成了一些REST服务.现在我需要使用用户名/密码进行身份验证来保护这些休息服务.我被告知不要使用Spring安全性.
我不知道该怎么做.我在网上搜索,但各种链接显示各种实现,我无法决定如何继续它.
我知道这是一个模糊的问题,但请在这方面提供帮助.
Pau*_*tha 12
使用用户名和密码进行身份验证的常用方法是使用基本身份验证.基本上,客户端需要发送请求标头Authorization,标头值为Basic Base64Encoded(username:password).我的用户名是peeskillet,我的密码是pass,作为客户端,我应该将标题设置为
Authorization: Basic cGVlc2tpbGxldDpwYXNz
Run Code Online (Sandbox Code Playgroud)
在servlet环境中,容器应该支持基本身份验证.您可以在web.xml上配置此支持.您可以在48.2保护 Java EE的Web应用程序教程中看到一个示例.您还会在一个示例中注意到
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
Run Code Online (Sandbox Code Playgroud)
这是为了支持SSL.建议用于基本身份验证.
如果您不想处理使用安全域和登录模块,领域等的麻烦,那么需要自定义servlet支持,或者如果您不在servlet环境中,那么实现Basic Auth在一个ContainerRequestFilter真的不是太难.
您可以在jersey/examples/https-clientserver-grizzly上看到完整的示例.你应该专注于SecurityFilter
过滤器中的基本流程就是这样的
获取Authorization标题.如果它不存在,抛出一个AuthenticationException.在这种情况下,AuthenticationExceptionMapper将发送标头"WWW-Authenticate", "Basic realm=\"" + e.getRealm() + "\",这是Basic Auth协议的一部分
一旦我们有了标题,我们解析它只是为了获得Base64编码的用户名:密码.然后我们解码它,然后拆分它,然后分开用户名和密码.如果此过程中的任何一个失败,请再次WebApplicationException将该映射抛出到400 Bad Request.
检查用户名和密码.示例源代码只检查用户名是否user和密码password,但您将需要使用过滤器中的某些服务来验证此信息.如果其中任何一个失败,抛出一个AuthenticationException
如果一切顺利,User则从该authenticate方法创建a ,并将其注入Authorizer(即a SecurityContext).在JAX-RS中,SecurityContext通常用于授权.
对于授权,如果要保护某些资源的某些区域,可以使用@RolesAllowed类或方法的注释.通过注册RolesAllowedDynamicFeature,泽西岛支持这个注释.
引擎盖下发生的事情是SecurityContext从请求中获得.通过我链接的示例,您可以看到Authorizer,它有一个重写的方法isUserInRole.将调用此方法来检查中的值@RolesAllowed({"ADMIN"}).因此,在创建时SecurityContext,应确保在重写方法中包含用户的角色.
要进行测试,您只需使用浏览器即可.如果一切设置正确,当你尝试访问该资源,你应该看到(在Firefox)对话框中看到这个帖子.如果你使用cURL,你可以这样做
C:/>curl -v -u username:password http://localhost:8080/blah/resource
Run Code Online (Sandbox Code Playgroud)
这将发出基本身份验证请求.由于-v切换,您应该看到所有涉及的标头.如果您只想使用客户端API进行测试,可以在此处查看如何进行设置.在上述三种情况中的任何一种情况下,Base64编码都将为您完成,因此您不必担心它.
至于SSL,您应该查看容器的文档,以获取有关如何设置它的信息.
| 归档时间: |
|
| 查看次数: |
3914 次 |
| 最近记录: |