JAAS + JSF 2.0 + Glassfish - PullRequest
       67

JAAS + JSF 2.0 + Glassfish

1 голос
/ 10 декабря 2011

Я не уверен, как интегрировать эти три.

У меня есть простая страница входа в систему jsf, и я также создал JDBCRealm.У меня есть простой слой доступа к данным, который подключается с помощью JDBC к базе данных.Я ограничил доступ к другим страницам, кроме входа в систему, который работает вполне нормально.

  <login-config>
<auth-method>FORM</auth-method>
<realm-name>JDBCRealm</realm-name>
 <form-login-config> 
    <form-login-page>/index.jsf</form-login-page> 
    <form-error-page>/xxx.jsf</form-error-page> 
</form-login-config> 
</login-config>

 <security-constraint>
<web-resource-collection>
    <web-resource-name>Secure Pages</web-resource-name>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
    <role-name>Users</role-name>
</auth-constraint>
</security-constraint>

Что я должен сделать, чтобы действительно заставить его работать, потому что я не мог найти правильное решение: так ли это?- нужно ли мне проверять правильность пароля и логина в моих бинах на странице логина?Или это делается автоматически Glassfish в этом JDBCRealm?Если да, то как его включить / переслать туда?

заранее спасибо

Ответы [ 2 ]

3 голосов
/ 01 мая 2013

Код для страницы входа :

Форма входа

    <h:form>
        <h:panelGrid columns="2">

        <h:outputLabel for ="uname" value="Enter User Name :  "/>
        <h:inputText id="uname" value="#{JSFManagedBean.username}"/>
        <h:outputLabel for ="pass" value="Enter Password  :"/>
        <h:inputSecret id="pass" value="#{JSFManagedBean.password}"/>
        <h:outputText/><h:outputText/>
        <h:outputText/>
        <h:commandButton id="login" value="Login" action="#{JSFManagedBean.Login()}"/>
        </h:panelGrid>
    </h:form>
</h:body>

Код для управляемого компонента:

Managed Bean contain the following Login Method 
    public String Login() {
        try {
            message="";
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            request.login(username, password);
            if(request.isUserInRole("Admin"))
                return "/AdminPage/Admin.xhtml";
            else if(request.isUserInRole("Visitor"))
                return "/VisitorPage/Visitor.xhtml";
            else {
                message= "Either Login or Password is wrong";
                return "/index.xhtml";
            }

        } catch(Exception e) {
            message= "Either Login or Password is wrong";
        }
        return null;
    }
2 голосов
/ 10 декабря 2011

На странице, связанной с <form-login-page>, необходимо создать форму, которая будет выглядеть как минимум примерно так с URL j_security_check и именами полей ввода j_username и j_password:

<form action="j_security_check" method="post">
    <input type="text" name="j_username" />
    <input type="password" name="j_password" />
    <input type="submit" />
</form>

Затем контейнер перехватит его и полностью прозрачно обработает.

Если вы хотите иметь полную свободу использования компонентов JSF, вам нужно позволить ему взять на себя управление надтакже войдите в метод действия управляемого компонента:

HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

try {
    request.login(username, password);
    return "home";
} catch (ServletException e) {
    errorMessage = e.getMessage();
    return "error";
}
...