如何通过 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 身份验证和授权
在 Java EE / JSF 中使用 j_security_check 执行用户身份验证
编辑 1:
我的意思是 serlvet API 至少 2.3。是的,我在 Servlet API 3.0 中读到过login
,但它仅受新版本的应用程序服务器支持。
我认为这里可以是一些为每个应用程序服务器实现此身份验证的解决方案。有时通过一些技巧,有时通过为此目的设计的特殊类。像这样:
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;
}