Nachdem Sie das Web durchsucht und viele verschiedene Methoden ausprobiert haben, würde ich Folgendes für die Java EE 6-Authentifizierung vorschlagen:
Richten Sie den Sicherheitsbereich ein:
In meinem Fall hatte ich die Benutzer in der Datenbank. Daher folgte ich diesem Blog-Beitrag, um ein JDBC-Realm zu erstellen, mit dem Benutzer anhand des Benutzernamens und der MD5-Hash-Kennwörter in meiner Datenbanktabelle authentifiziert werden können:
http://blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.html
Hinweis: Der Beitrag behandelt einen Benutzer und eine Gruppentabelle in der Datenbank. Ich hatte eine Benutzerklasse mit einem UserType-Enum-Attribut, das über javax.persistence-Annotationen der Datenbank zugeordnet wurde. Ich habe den Bereich mit derselben Tabelle für Benutzer und Gruppen konfiguriert, wobei die Spalte userType als Gruppenspalte verwendet wurde, und es hat einwandfrei funktioniert.
Formularauthentifizierung verwenden:
Befolgen Sie weiterhin den obigen Blog-Beitrag und konfigurieren Sie Ihre web.xml und sun-web.xml. Verwenden Sie jedoch anstelle der BASIC-Authentifizierung FORM (eigentlich spielt es keine Rolle, welche Sie verwenden, aber ich habe letztendlich FORM verwendet). Verwenden Sie das Standard-HTML, nicht das JSF.
Verwenden Sie dann den obigen Tipp von BalusC, um die Benutzerinformationen aus der Datenbank verzögert zu initialisieren. Er schlug vor, dies in einer verwalteten Bean zu tun, um den Principal aus dem Gesichtskontext zu erhalten. Ich habe stattdessen eine Stateful Session Bean verwendet, um Sitzungsinformationen für jeden Benutzer zu speichern, also habe ich den Sitzungskontext eingefügt:
@Resource
private SessionContext sessionContext;
Mit dem Principal kann ich den Benutzernamen überprüfen und mit dem EJB Entity Manager die Benutzerinformationen aus der Datenbank abrufen und in meinem SessionInformation
EJB speichern .
Ausloggen:
Ich habe mich auch nach dem besten Weg zum Abmelden umgesehen. Das Beste, was ich gefunden habe, ist die Verwendung eines Servlets:
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"})
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
// Destroys the session for this user.
if (session != null)
session.invalidate();
// Redirects back to the initial page.
response.sendRedirect(request.getContextPath());
}
}
Obwohl meine Antwort angesichts des Datums der Frage sehr spät ist, hoffe ich, dass dies anderen Menschen hilft, die von Google hierher kommen, genau wie ich.
Ciao,
Vítor Souza
HttpServletResponse#login(user, password)
diese Weise können Sie aus der Datenbank das Salz des Benutzers, die Iterationen und alles, was Sie zum Salzen verwenden, abrufen, das Kennwort, das der Benutzer mit diesem Salz eingegeben hat, hashen und dann den Container zur Authentifizierung auffordernHttpServletResponse#login(user, password)
.Ich nehme an, Sie möchten eine formularbasierte Authentifizierung mithilfe von Bereitstellungsdeskriptoren und
j_security_check
.Sie können dies auch in JSF tun, indem Sie nur dieselben vordefinierten Feldnamen verwenden
j_username
undj_password
wie im Lernprogramm gezeigt.Z.B
Sie können den
User
Getter faul laden , um zu überprüfen, ob derUser
bereits angemeldet ist. Wenn nicht, überprüfen Sie, ob derPrincipal
in der Anforderung vorhanden ist, und wenn ja, holen Sie sich denUser
zugehörigenj_username
.Das
User
ist offensichtlich in JSF EL von zugänglich#{auth.user}
.Um sich abzumelden, machen Sie a
HttpServletRequest#logout()
(und setzen SieUser
auf null!). Sie können ein Handle desHttpServletRequest
in JSF von erhaltenExternalContext#getRequest()
. Sie können die Sitzung auch einfach insgesamt ungültig machen.Befolgen Sie für den Rest (Definieren von Benutzern, Rollen und Einschränkungen in Deployment Descriptor und Realm) einfach das Java EE 6-Lernprogramm und die Servletcontainer-Dokumentation auf die übliche Weise.
Update : Sie können auch das neue Servlet 3.0 verwenden
HttpServletRequest#login()
, um eine programmatische Anmeldungj_security_check
durchzuführen, anstatt eine zu verwenden, die in einigen Servlet-Containern möglicherweise per se nicht von einem Dispatcher erreichbar ist. In diesem Fall können Sie ein vollwertiges JSF-Formular und eine Bean mitusername
undpassword
Eigenschaften sowie einelogin
Methode verwenden, die folgendermaßen aussieht:Und diese Ansicht hat eine verwaltete Bean, die sich auch an die ursprünglich angeforderte Seite erinnert:
Auf diese Weise
User
ist der in JSF EL über zugänglich#{user}
.quelle
j_security_check
möglicherweise nicht auf allen Servlet-Containern funktioniert.@WebServlet(name="testServlet", urlPatterns={"/ testServlet "}) @ServletSecurity(@HttpConstraint(rolesAllowed = {"testUser", "admin”}))
Und für eine Methode pro Level:@ServletSecurity(httpMethodConstraints={ @HttpMethodConstraint("GET"), @HttpMethodConstraint(value="POST", rolesAllowed={"testUser"})})
FacesServlet
Sie nicht ändern können (und wollen).RequestDispatcher.FORWARD_REQUEST_URI
. Anforderungsattribute sind in JSF verfügbar vonExternalContext#getRequestMap()
.Es sollte erwähnt werden, dass es eine Option ist, Authentifizierungsprobleme vollständig dem Front-Controller, z. B. einem Apache-Webserver, zu überlassen und stattdessen den HttpServletRequest.getRemoteUser () auszuwerten, der die JAVA-Darstellung für die Umgebungsvariable REMOTE_USER darstellt. Dies ermöglicht auch ausgefeilte Anmeldedesigns wie die Shibboleth-Authentifizierung. Das Filtern von Anforderungen an einen Servlet-Container über einen Webserver ist ein gutes Design für Produktionsumgebungen. Oft wird dazu mod_jk verwendet.
quelle
Das Problem, dass HttpServletRequest.login den Authentifizierungsstatus in der Sitzung nicht festlegt, wurde in 3.0.1 behoben. Aktualisieren Sie glassfish auf die neueste Version und Sie sind fertig.
Das Aktualisieren ist ganz einfach:
quelle