Wie führen Sie j_security_check Anmeldeinformationen check-in Vaadin?
Habe ich von einem alten web-Anwendung die ich brauche, um die Migration zu Vaadin.
In der alten app gibt es eine Seite, die fragt den Benutzer nach login und Passwort.
Die JSP-Seite sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8"%>
[...]
<head>
<title>Some product</title>
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()+"/css/styles.css"%>" />
</head>
<body>
<%@ include file="inc/main-navigation.jsp"%>
<form action="j_security_check" method="post" style="margin:0px">
[...]
<input type="text" style="width:100%" name="j_username" />
<input type="password" name="j_password" />
</form>
</body>
</html>
web.xml
enthält folgende Einträge:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Some product</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login_fail.jsp</form-error-page>
</form-login-config>
</login-config>
Dies bedeutet, dass bei nicht erfolgreicher Authentifizierung wird der Benutzer angewiesen, Seite login_fail.jsp
.
In der context.xml
Datei fand ich folgenden Eintrag, aus dem ich schließe, dass es sich um einen internen Mechanismus, der in Tomcat die liest korrekten login und Passwort aus der angegebenen Datenbank und führt die Prüfung ohne zusätzlichen code.
<Context path="/myapp">
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionURL="[...]"
userTable="[...]" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="[...]" roleNameCol="role_name"/>
</Context>
In der Vaadin-Anwendung habe ich ein UI mit den beiden Textfeldern und einem button.
public class BookkeepingView extends VerticalLayout implements View {
public BookkeepingView()
{
VerticalLayout contentPanel = new VerticalLayout();
contentPanel.setStyleName("body");
contentPanel.addComponent(getHeaderPanel());
contentPanel.addComponent(getLoginPanel());
contentPanel.addComponent(getFooterPanel());
addComponent(contentPanel);
}
private Component getHeaderPanel() {
return createCustomLayoutPanel("main-navigation");
}
private Component getFooterPanel() {
return createCustomLayoutPanel("copyright");
}
private CustomLayout getLoginPanel() {
Panel panel = new Panel();
panel.setSizeUndefined();
addComponent(panel);
CustomLayout customLayoutPanel = new CustomLayout("login");
final TextField userName = new TextField();
customLayoutPanel.addComponent(userName, "j_username");
final PasswordField password = new PasswordField();
customLayoutPanel.addComponent(password, "j_password");
final Button loginButton = new Button(I18n.l("bookkeeping_login_button"));
customLayoutPanel.addComponent(loginButton, "login");
loginButton.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent clickEvent) {
loginButtonPressed();
}
});
return customLayoutPanel;
}
private void loginButtonPressed() {
Notification.show("Login button pressed", Notification.Type.TRAY_NOTIFICATION);
}
private CustomLayout createCustomLayoutPanel(final String aHtmlFileName) {
Panel panel = new Panel();
panel.setSizeUndefined();
addComponent(panel);
CustomLayout customLayoutPanel = new CustomLayout(aHtmlFileName);
return customLayoutPanel;
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
}
}
Wenn der Benutzer drückt die Taste (Methode loginButtonPressed
ausgeführt wird), möchte ich
- überprüfen Sie die eingegebenen Anmeldeinformationen in die Textfelder
userName
undpassword
, - display eine Benachrichtigung-box, wenn Sie die Anmeldeinformationen falsch sind, und
- öffnet sich eine andere Benutzeroberfläche (view), wenn Sie korrekt sind.
Wie kann ich meine Vaadin-Anwendung access, Tomcat Mechanismus für die überprüfung der Anmeldeinformationen (ich. e. meine Vaadin-Anwendung durchführen sollten die Anmeldeinformationen check-in genau der gleichen Weise wie die alte app)?
Was code, der mir erlaubt zu prüfen, ob Benutzer-name x
und Passwort y
sind gültig gemäß der angegebenen Datenbank in context.xml
?
Update 1 (05.11.2013): fand ich eine Beschreibung, wie Reich-basierte Authentifizierung hier.
Aber ich lief in ein problem:
Den servlet-Anwendung in dem Beispiel erweitert com.vaadin.terminal.gwt.server.AbstractApplicationServlet
, die nicht in meiner Vaadin 7 Projekt.
@WebServlet(urlPatterns={"/ui/*", "/VAADIN/*"})
public class DemoAppServlet extends AbstractApplicationServlet {
Update 2 (05.11.2013 15:53):
Ich habe versucht, um die Authentifizierung zu implementieren, die in der einfachsten möglichen Weise:
1) Verwenden Sie BASIC-Authentifizierung-Mechanismus.
2) Konfigurieren Sie die web-app, so dass alle Vaadin Seiten muss der Benutzer angemeldet sein.
Um dies zu erreichen, habe ich noch folgende Fragmente zur web.xml
:
<servlet-mapping>
<servlet-name>VaadinDemoApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>VaadinDemoApplicationConstraint</display-name>
<web-resource-collection>
<web-resource-name>Vaadin application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>viewer</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Protected page</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>viewer</role-name>
</security-role>
Aber es funktioniert nicht: Das Dialogfeld Anmeldeinformationen angezeigt wird beim Zugriff auf die Anwendung, aber wenn ich geben Sie die richtigen Anmeldedaten ein, und drücken Sie "OK", wird das gleiche Dialogfeld erneut angezeigt.
Ja. Ich bin mit Apache Shiro nun. Es ermöglicht, die Daten aus der Datenbank aus dem Apache-Tomcat-Bereich.
InformationsquelleAutor DP_ | 2013-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es scheint, haben Sie zu kompliziert alles. Unten finden Sie eine real-life-Lösung. Es ist für eine Vaadin-Anwendung und funktioniert einfach.
1. Sie brauchen eine externe login-Seite
Dies ist der einfachste Weg. Wenn Sie möchten, können Sie ganz einfach Stil, der Seite, um nicht zu brechen user experience.
Wie gewohnt haben Sie die folgenden:
2. Ich würde vorschlagen, eine externe login-fehlgeschlagen-Seite
Im Grunde ist es einfach braucht, um einen Benutzer zu Benachrichtigen, es war etwas falsch. Es könnte auch vorschlagen, zum Beispiel, auf relogin.
3. Konfigurieren der richtige auth-Methode
4. Vergessen Sie nicht, session-timeout
5. Sie fertig sind, testen Sie einfach
InformationsquelleAutor Renat Gilmanov
Ich empfehle Ihnen auszuschließen Authentifizierung von Vaadin. Halten JSP-Seite als Authentifizierungs-form und verwenden Sie die Standard-Authentifizierung von der Servlet-Spezifikation.
Wenn Sie programmierbar-Authentifizierung in Ihrem code, es öffnet die Tür für Fehler. Außerdem, der code wird komplizierter. Bessere Nutzung deklarativer Sicherheit. In diesem Fall die Authentifizierung ist getrennt von der Anwendung. Ihre Anwendung ist einfacher, Sicherheit ist mehr vertrauenswürdig.
Werfen Sie einen Blick auf webinar http://www.youtube.com/watch?v=PNAo3ApWA-A Ganze ist Recht interessant, aber Beispiel, wie die Authentifizierung beginnt ab der 47 minute. Beide Lösungen werden vorgestellt: benutzerdefinierter code und deklarativen Sicherheit.
Nachdem webinar ich bin mir sicher, dass deklarative Sicherheit ist die richtige Wahl.
Deklarative Sicherheit müssen einige Anpassungen in web.xml. Im Vergleich zu reinen Vaadin-Anwendung, nicht alle Anfragen bearbeitet werden VaadinServlet: Authentifizierungs-Anfragen verarbeitet werden müssen, standardmäßig. Trotzdem, deklarative Sicherheit Wert ist Konfigurationsaufwand.
InformationsquelleAutor michaldo