我如何通过 JSF 操作(或在 servlet doGet
/doPost
方法中)对用户进行身份验证?
我的意思是:
Authenticator auth = ...;
if (!auth.authenticate("user","password"))
{
FacesContext.getInstance().addMessage("Incorrect username or password", null);
}
限制:
- 此方法必须与容器管理的安全性兼容。 (即 `HttpServletRequest.getRemoteUser()` 必须返回经过身份验证的用户)
- 此方法必须适用于任何地方(即在每个应用程序服务器上)。
不使用 j_security_check
或其他 J2EE 身份验证类型(BASIC、DIGEST 等...)
这可能吗?
或者如何通过这种方式创建验证码?
验证登录名和密码是否为空?
当然,在单页上并且没有 JavaScript ...
类似的问题......但没有回答这个问题:
JSF authentication and authorization
Performing user authentication in Java EE / JSF using j_security_check
编辑 1:
我的意思是 serlvet API 至少是 2.3。
是的,我在 Servlet API 3.0 中读到了关于 login
的内容,但只有新版本的应用程序服务器才支持它。
我认为这里可以有一些解决方案来为每个应用程序服务器实现这种身份验证。 有时通过一些 hack,有时通过为此目的设计的特殊类。 像这样:
private Class<?> tryClass(String name)
{
try
{
return Class.forName(name);
}
catch (ClassNotFoundException e)
{
return null;
}
}
public boolean authenticate(String username, String password) throws AuthenticationException
{
try
{
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
Object request = context.getRequest();
Object response = context.getResponse();
Class<?> authClass = tryClass("com.sun.appserv.security.ProgrammaticLogin");
if (authClass != null)
{
return (Boolean)authClass.getMethod("login").invoke(
authClass.newInstance(), "user", "password", request, response);
}
authClass = tryClass("org.jboss.web.tomcat.security.login.WebAuthentication");
if (authClass != null)
{
return (Boolean)authClass.getMethod("login").invoke(
authClass.newInstance(), "user", "password");
}
// ... other hacks ...application servers
}
catch (Exception e)
{
throw new AuthenticationException("an error occured during user authentication", e);
}
return false;
}
最佳答案
啊,它是 J2EE 1.3 Java EE 5。太糟糕了,每当您想继续使用容器管理的安全性时,您都不走运。您必须从幕后获取特定于容器的实现。顺便说一下,“没有 j_security_check
或 BASIC/DIGEST 的容器管理的安全性”是自相矛盾的。我个人会忘记这一切,自行开发安全性或获取更可配置的第三方实现,如 Spring Security .
关于Java EE 5 程序化身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207646/