ajax – 用于Java EE的RESTful身份验证
我已经花了一些时间评估可用于在Java EE应用程序中安全地验证用户的选项。
所以,请建议下列选项是否有效,以及关于优点或缺点的说明。这可能是我错过了可能使身份验证方法可行的细节。或者也许有另外一个选择我错过了(再次,我们正在严格地说Java EE,所以没有查询身份验证,除非可以按照EE兼容的方式)
<security-constraint> <web-resource-collection> <web-resource-name>admin</web-resource-name> <url-pattern>/protected/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>DIGEST/BASIC</auth-method> <realm-name>as-defined-secuity-realm</realm-name> </login-config> 优点 >这是一个REST友好的认证方式。您可以通过AJAX调用发送授权凭据。一旦用户认证,浏览器将伴随任何请求与适当的授权:基本/摘要QWxhZGRpbjpvcGVuIHNlc2FtZQ ==标头。如果凭证不正确,用户将会看到丑陋的浏览器登录屏幕 – 如果您可以使用该功能,那么BASIC / DIGEST auth就是您的方式。 缺点 注销是棘手的实现。请参阅here和here。您有一个很好的AJAX请求,用于验证用户,但您还需要一个AJAX?请求登录用户 – 触发浏览器登录窗口再次出现)。 BTW的好servlet 3.0 request.logout()方法does not work properly in this case。
<security-constraint> <web-resource-collection> <web-resource-name>admin</web-resource-name> <url-pattern>/protected/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>as-defined-security-realm</realm-name> <form-login-config> <form-login-page>/auth/login.html</form-login-page> <form-error-page>/auth/error.html</form-error-page> </form-login-config> </login-config> 长篇小说,如果用户访问受保护的/ * url,登录页面将包含在响应中。因此,用户期望他将获得form-login-page标签中配置的登录页面而不是内容。如果密码正常,他将被转发(302 Paged Moved Permanently)到最初请求的protected / * url。如果密码为NOK,用户将被转发(302 Paged Moved Permanently)到错误页面。 优点 >个性化登录页面 – 这个似乎是最受欢迎的:) 缺点 > REST不友好(我不会挖掘休息的哲学,保持服务器端状态不是RESTful辩论,我们正在以JAVA EE方式分析REST身份验证,服务器端状态始终保持为任何身份验证的主题)。使用FORM身份验证真的很糟糕的事实是,跨浏览器不能保持一致的行为。这一切都是由于一些浏览器在AJAX响应函数中处理的302重定向,而其他重定向则导致整个页面(更改导航栏中的URL)。更多细节here和here.你不能解决302重定向,所以没有FORM和REST身份验证你先生!
设置验证URL。在该URL后面,您可以有一个实例化一个登录模块(JAAS方式)的servlet并调用HttpServletRequest.login(user,pass)方法以及凭据。如果登录失败,应该生成401/403响应。 您可以通过在web.xml中指定安全约束来实现: <security-constraint> <web-resource-collection> <web-resource-name>admin</web-resource-name> <url-pattern>/protected/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> 在服务器端,您只需要设置一个身份验证呼叫者的RESTFul服务。以下是一些示例代码: @Path("/auth") @ApplicationPath("/rest") public class AuthenticationRestFacade { @POST @Path("/login") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public User login(User loginInfo,@Context HttpServletRequest request) throws LoginException,ServletException { // nasty work-around for Catalina AuthenticatorBase to be able to // change/create the session cookie request.getSession(); request.login(loginInfo.getName(),loginInfo.getPassword()); 优点 >个人登录页面。 缺点 >需要一些代码写作。 总而言之,最好的可行选择: >如果您不关心会话超时或注销 – >消化 真的很期待你们建议一些可行的替代解决方案。因为现在我会用PROGRAMMATIC方法去讨论
根据我的经验,很难实现使用Java EE认证和授权服务的系统,该服务可以同时用于REST服务和服务器端MVC(如JSP或JSF)。我所有的经验都倾向于为MVC部分使用基于表单的身份验证以及某些用于REST服务的令牌身份验证(OAuth,Kerberos,LTPA)。对于REST服务使用表单或基本身份验证通常是具有挑战性的,虽然我们这样做,它在两个项目上都可以正常工作。
它还取决于首选的服务器实现。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |