Этим утром я катался в главах 39, 40 и 41 урока JEE6.Но я очень, очень смущен.У меня нет опыта работы с JEE6 по безопасности веб-приложений, и у меня большие трудности с пониманием и реализацией.
Мне нужно создать механизм авторизации для моего веб-приложения, мой сценарий также не очень прост для такого начинающего пользователя в JEE6, как я, поэтому я решил попытаться найти самый простой способ сделать это.
Я подумал объяснить мою идею, чтобы вы могли исправить меня и дать несколько советов о том, как это будет наилучшим и самым простым способом сделать это.
Идея:
Мое веб-приложение используеткомпонент primefaces, называемый dock, который открывает диалоговое окно входа в систему, когда пользователь нажимает на последний элемент.Также этот инструмент навигации находится в шаблоне JSF, который используется всеми другими страницами приложения.
<h:body>
<p:dock position="top">
<p:menuitem value="Naslovna" icon="unsecuredimages/naslovna.png" url="main.xhtml"
alt="The image could not be found." />
<p:menuitem value="Register" icon="unsecuredimages/register.png"
url="registration.xhtml" alt="The image could not be found." />
<p:menuitem value="Cesta pitanja" icon="unsecuredimages/faq.png"
url="faq.xhtml" alt="The image could not be found." />
<!-- The login will not have a page, it will pop up a login dialog -->
<p:menuitem value="Login" icon="unsecuredimages/login.png" url="#" onclick="dlg.show()"/>
</p:dock>
<p:dialog header="Prijavite se" widgetVar="dlg" modal="true" draggable="false" resizable="false" effect="SLIDE">
<h:outputText value="Em@il:" /><h:inputText id="email" value=""/>
<br/>
<h:outputText value="Lozinka:" /><h:inputText id="password" value=""/>
<br/>
<h:commandButton value="Prijavi se" />
</p:dialog>
<br/><br/><br/><br/><br/><br/>
<ui:insert name="mainForm" />
<ui:insert name="registrationForm" />
<ui:insert name="registrationBuyerForm" />
<ui:insert name="registrationSellerForm" />
<ui:insert name="faqForm" />
<ui:insert name="registrationSuccessForm" />
</h:body>
Я думаю, что JSF должен иметь вспомогательный компонент, который обрабатывает электронную почту и пароль дляEJB.
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import ejbinterfaces.IAuthentificationEJB;
@ManagedBean
@SessionScoped
public class SecurityController {
@EJB
private IAuthentificationEJB authentificationEJB;
private String email;
private String password;
public void logIn() {
authentificationEJB.saveUserState(email, password);
}
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
public void setEmail(String email) {
this.email = email;
}
public void setPassword(String password) {
this.password = password;
}
}
Тогда EJB должен выполнить вход и выйти из системы (Это то, где я очень запутался):
@Stateful(name = "ejbs/AuthentificationEJB")
public class AuthentificationEJB implements IAuthentificationEJB {
//Login
public boolean saveUserState(String email,String password) {
//1-Send query to database to see if that user exist
//2-If the query returns the user object, store it somewhere in the session(HOW?)
//3-return true if the user state was saved
//4-return false otherwise
return false;
}
//Logout
public void releaseUserState() {
//1-Check if there is something saved in the session(or wherever the state is saved)
//2-If 1 then flush it
}
//Check if user is logged in
public boolean checkAuthentificationStatus() {
//1-Check if there is something saved in the session(This means the user is logged in)
//2-If there is not a user already loged, then return false
return false;
}
}
Я решил не использовать область jdbc или другие механизмы аутентификации, описанные в руководстве по JEE6, потому что я действительно запутался, поэтому я думаю, что сейчас мне проще сделать это вручную.Вот некоторые сомнения, которые у меня возникают по поводу моего подхода:
- Является ли этот подход корректным (можно ли сделать таким образом)?
- Должен ли EJB быть @Stateless или @Statefull в этом случае(Пользователь, извлеченный из базы данных, имеет только 2 строковых поля)?
Где хранить идентификатор извлеченного пользователя из базы данных, чтобы он действовал до тех пор, пока пользователь не решит выйти из системы?
Если мне нужно сохранить состояние пользователя в сеансе, пока он / она не решит выйти из системы, как я могу это сделать?
- При таком подходе сеанс дляесли пользователь закрывает браузер без выхода из системы (если нет, как я могу автоматически завершить его / ее сеанс через некоторое время, если нет активности?)
Я очень ценю вашу помощь.