首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 5编程认证

Java 5编程认证
EN

Stack Overflow用户
提问于 2010-11-17 18:13:11
回答 1查看 3.1K关注 0票数 3

如何通过JSF操作(或servlet doGet/doPost方法)对用户进行身份验证?我的意思是:

代码语言:javascript
运行
复制
Authenticator auth = ...;
if (!auth.authenticate("user","password"))
{
    FacesContext.getInstance().addMessage("Incorrect username or password", null);
}

限制:

  • 此方法必须与容器管理安全兼容。(即HttpServletRequest.getRemoteUser()必须返回经过身份验证的用户)
  • 该方法必须在任何地方工作(即在每个应用服务器上)。

不使用j_security_check或其他J2EE身份验证类型(基本、摘要等)

有可能吗?

或者如何以这种方式创建captcha?

验证登录和密码是否为空?

当然,在没有JavaScript的页面上.

类似的问题..。但没有人回答这个问题:

JSF认证和授权

检查

编辑1

我的意思是serlvet至少2.3。是的,我在ServletAPI3.0中读过关于login的文章,但是只有新版本的应用服务器才支持它。

我认为这里可以有一些解决方案来实现对每个应用服务器的身份验证。有时通过一些黑客,有时通过专门为这个目的设计的类。如下所示:

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2010-11-17 18:20:06

编程登录是相当棘手的,似乎不同的应用服务器。我相信,使用j_security_check是最成功的,并将允许您的应用程序跨各种应用服务器工作。

最困难的部分是让应用服务器接受身份验证。在Tomcat上,我已经能够执行myLoginModule.login()并使登录模块成功,但是用户没有通过容器进行身份验证。JBoss有一些代码可以让编程身份验证在JBoss和Tomcat之间工作(因为Tomcat位于JBoss中)。看看这个玻璃鱼,我得到的印象是,编程登录是非常困难的,应该留给专业人士。

玻璃鱼文档(http://docs.sun.com/app/docs/doc/820-4496/beacm?a=view)说:

编程登录是特定于企业服务器的,而不是可移植到其他应用服务器的。

编辑

j_security_check方法需要一些习惯,但是一旦您学会了如何处理它,就会非常成功。基本上,您可以有一个欢迎页面,将用户重定向到您的应用程序;如果用户尚未登录,他们将被发送到您的登录页面。您的登录页面可以是您网站的主页。在主页上,用户可以导航到站点的其他“不安全”页面。如果您愿意的话,您也可以在这些页面上包括登录表单。你没有被一个登录页面卡住。

编辑2

我一直在使用AJAX (通过Richfaces)检查用户的用户名/密码,并在需要时显示错误消息。如果凭据是正确的,则提交指向j_security_check的表单来执行实际身份验证。

编辑3

BalusC在执行request.login(...)的第二个链接问题(http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0)上建议的编程登录方法看起来很棒。我将很快试用它;o) Servlet 3由Glassfish 3支持,但其他支持不多(可能是Tomcat 7的一部分,可能是JBoss 6的一部分)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4207646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档