gpt4 book ai didi

ajax - Java EE的RESTful身份验证

转载 作者:行者123 更新时间:2023-12-03 13:01:10 25 4
gpt4 key购买 nike

我一直在花一些时间评估可用于对Java EE应用程序中的用户进行身份验证的选项。

因此,请提出以下所列选项是否有效以及有关优点或缺点的说明。可能是我缺少使身份验证方法可行的细节。或者可能是我错过了另一个选择(再次,我们严格来说是在谈论Java EE,因此没有查询身份验证,除非可以通过EE兼容的方式来完成,否则不会)


1. DIGEST / BASIC身份验证


 <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调用发送授权凭证。用户通过身份验证后,浏览器将伴随所有带有正确 Authorization: Basic/Digest QWxhZGRpbjpvcGVuIHNlc2FtZQ==标头的请求。如果凭据不正确,将为用户显示丑陋的浏览器登录屏幕-如果您可以忍受,那么BASIC / DIGEST auth是您的理想选择。
在Digest的情况下,传递给服务器的字符串是MD5加密的字符串,它绝对比Basic(它是'user:password'字符串的Base64编码)安全得多,但是 decipherable。因此,就安全性而言,BASIC与FORM身份验证几乎一样安全,而DIGEST是其中最安全的一种。总而言之,如果您的站点完全是HTTPS(我的意思是完全是因为如果通过HTTP获取某些资源,例如,您的授权标头将对第三方可见),那么您可以放心使用BASIC / DIGEST。
易于设置。


缺点


注销很难实现。请参见 herehere。确保您有一个不错的AJAX请求来验证用户身份,但是还需要一个?AJAX吗?请求退出用户-触发浏览器登录窗口再次出现)。顺便说一句,漂亮的Servlet 3.0 request.logout()方法 does not work properly in this case
会话超时很难实现。会话确实发生了(这是servlet容器的工作),但是浏览器将在下一个请求时发送授权标头,从而触发重新认证。
没有个性化的登录页面。没有。
难以跟踪经过身份验证的会话。



2.基于表单的身份验证


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


长话短说,如果用户访问 protected/*网址,则响应页面中将包含登录页面。因此,用户希望他获得的登录页面不是内容,而是在 form-login-page标记中配置的。如果密码确定,他将被转发(302页面永久移动)到最初请求的 protected/* url。如果密码为NOK,则用户将被转发(302页面永久移动)到错误页面。

优点


个性化的登录页面-该页面似乎最受欢迎:)
注销很容易实现。只需使HttpSession无效或调用request.logout()方法(Servlet 3.0)。
会话超时
如果且仅当您接受有单独的登录页面时,这是您的解决方案。


缺点


REST不友好(我不会深入探讨静止的思想,保持服务器端状态也不是REST式辩论。我们正在以JAVA EE方式分析REST身份验证,并且对于任何经过身份验证的主题,服务器端状态始终得到维护) 。使用FORM身份验证的真正缺点是,人们无法在所有浏览器中保持一致的行为。这都是由于302重定向,某些浏览器在AJAX响应功能中处理而其他浏览器重定向整个页面(在导航栏中更改URL)。 herehere的更多详细信息。您无法解决该302重定向问题,因此您无法进行FORM和REST身份验证!



3.程序验证


设置用于身份验证的URL。在该URL的后面,您可以拥有一个servlet,该servlet实例化一个登录模块(JAAS方式),并与凭据一起调用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());


优点


个性化的登录页面。
兼容AJAX / REST
注销URL(如果已设置URL)
会话超时(由容器管理)
您可以在响应中返回登录数据(用户名,电子邮件,角色,组等)(非常好,因为您不必在成功登录后再打另一个电话)


缺点


需要一些代码编写。
需要应用程序能够处理401/403响应并显示登录窗口


最后,最好的选择:


如果您不关心会话超时或注销-> DIGEST
如果上述方法对您不起作用,并且您不需要嵌入式登录页面(或类似模式面板的页面),则只需一个页面即可进行身份验证-> FORM
如果上述方法对您不起作用,并且您希望通过PROGRAMMATIC方法获得世界上所有的灵活性和兼容性。您必须定义登录/注销URL,并且您的客户端代码应能够应付401/403的响应(不容易)。


真希望您能提出一些可行的替代解决方案。因为现在我不愿采用编程方式

最佳答案

以我的经验,很难使用Java EE身份验证和授权服务来实现一个同时可用于REST服务和服务器端MVC(如JSP或JSF)的系统。我所有的经验都倾向于将基于表单的身份验证用于MVC部分,并将某种令牌身份验证(OAuth,Kerberos,LTPA)用于REST服务。尽管我们做到了,但是对REST服务使用表单或基本身份验证通常很难实现,尽管它在两个项目上都能正常工作。

它还取决于首选的服务器实现。

关于ajax - Java EE的RESTful身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16711119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com