JSF / Java EE表单与编程身份验证

时间:2012-12-05 00:04:24

标签: jsf java-ee authentication

我一直在试验这个问题的实质(JSF / Java EE login without requiring a protected resource)。

如果我使用BASIC身份验证设置一个示例应用程序,一个公共页面(/public.xhtml)和一个受保护页面(/protected/private.xhtml),我有一个从第一页到第二页的链接(如下图所示),一切都很完美。

<h:commandButton value="Go Private" action="/protected/private?faces-redirect=true" />


但是,如果我删除login-config并将以上按钮替换为:

<h:commandButton value="Go Private" action="#{mybean.login}" />


...和#{mybean.login}看起来像这样...

public String login() {
    HttpServletRequest request = ...
    try {
        request.login("known username", "known password");
    } catch (Exception e) {
        // handle unknown credentials
    }
    return "/protected/private?faces-redirect=true";
}


在这种情况下,登录成功(request.login()无例外),但浏览器显示“禁止资源”页面。

任何人都可以了解两种情景之间的区别吗?

2 个答案:

答案 0 :(得分:0)

HttpServletRequest#login()程序化登录仅适用于基于FORM的身份验证配置。删除<login-config>会使其默认为BASIC,因此login()将无法正常工作。 login()基本上在会话中设置用户,但BASIC身份验证基本上检查Authenticate HTTP请求标头,而不是会话。

如果您想使用<login-config>,请将FORM放回login()

答案 1 :(得分:-1)

它在哪里:

<h:commandButton value="Go Private" action="#{mybean.login}" /> 

它应该是:

<h:commandButton value="Go Private" action="#{mybean.login()}" />

如果您想使用登录方法。

但也许你的mybean也有

String private login;
public String getLogin(){ return this.login ;}

并且您已经使用所需的响应加载了var。