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

  1. überprüfen Sie die eingegebenen Anmeldeinformationen in die Textfelder userName und password,
  2. display eine Benachrichtigung-box, wenn Sie die Anmeldeinformationen falsch sind, und
  3. ö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.

Dmitri, haben Sie es geschafft, Ihr problem zu lösen?
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

Schreibe einen Kommentar