【发布时间】:2011-05-11 14:16:42
【问题描述】:
如何通过 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,但它仅受新版本的应用服务器支持。
我认为这里可以提供一些解决方案,为每个应用程序服务器实现此身份验证。 有时通过一些技巧,有时通过为此目的设计的特殊类。 像这样:
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 吗?你不是说Java EE吗?如果是这样,是 5 还是 6? Java EE 5 完全不提供编程身份验证功能,Java EE 6 提供,您可以在最后一个链接问题中阅读。
-
对不起。当然是 Java EE 5。总是把他们弄糊涂。
-
您提到了 Servlet 2.3。 Servlet 2.3 是 J2EE 1.3 的一部分。 Java EE 5 有 Servlet 2.5。
-
我目前正在使用 Java EE 5。但它必须在仅实现 J2EE 1.4 的 WebSphere 6.1 上工作。对不起,这是我的沉默。
标签: java security jsf jakarta-ee java-ee-5