1

Vaadin に移行する必要がある古い Web アプリケーションがあります。

古いアプリには、ユーザーにログインとパスワードを求めるページがあります。

JSP ページは次のようになります。

<?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次のエントリが含まれます。

<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>

これは、認証に失敗した場合、ユーザーが page に誘導されることを意味しますlogin_fail.jsp

次のエントリを見つけたcontext.xmlファイルで、指定されたデータベースから正しいログインとパスワードを読み取り、追加のコードなしでチェックを実行する Tomcat の内部メカニズムがあると結論付けました。

<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>

Vaadin アプリケーションには、テキスト フィールドとボタンの両方を備えた UI があります。

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) {

    }
}

ユーザーがボタンを押したとき(メソッドloginButtonPressedが実行されたとき)、私はしたい

  1. テキスト フィールドに入力された資格情報を確認userNamepassword
  2. 資格情報が間違っている場合、通知ボックスを表示し、
  3. それらが正しい場合、別の UI (ビュー) を開きます。

クレデンシャルを確認するために、Vaadin アプリケーションが Tomcat メカニズムにアクセスできるようにするにはどうすればよいですか (つまり、Vaadin アプリケーションは古いアプリとまったく同じ方法でクレデンシャル チェックを実行する必要があります)。

で指定されたデータベースに従って、ユーザー名xとパスワードが有効かどうかを確認できるコードは?ycontext.xml

更新 1 (2013 年 5 月 11 日):領域ベースの認証の使用方法に関する説明が見つかりまし

しかし、私は問題に遭遇しました:

この例のアプリケーション サーブレットは extendsを使用していますがcom.vaadin.terminal.gwt.server.AbstractApplicationServlet、これは私の Vaadin 7 プロジェクトでは利用できません。

@WebServlet(urlPatterns={"/ui/*", "/VAADIN/*"})
public class DemoAppServlet extends AbstractApplicationServlet {

更新 2 (2013 年 5 月 11 日 15:53):

私は可能な限り簡単な方法で認証を実装しようとしました:

1) BASIC 認証メカニズムを使用します。2)すべてのVaadin ページでユーザーがログインする必要があるように Web アプリを構成します。

これを実現するために、次のフラグメントを に追加しました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>

アプリケーションにアクセスすると資格情報ダイアログ ボックスが表示されますが、正しい資格情報を入力して [OK] を押すと、同じダイアログ ボックスが再び表示されます。

4

2 に答える 2

2

すべてを複雑にしすぎたようです。以下の実際の解決策を見つけてください。これは Vaadin アプリケーションに使用され、単純に機能します。

1. 外部ログインページが必要です

これが最も簡単な方法です。必要に応じて、ユーザー エクスペリエンスを損なわないように、そのページのスタイルを簡単に設定できます。

<link rel="stylesheet" type="text/css" href="VAADIN/themes/reindeer/styles.css">
...
<div class="v-app v-theme-reindeer">

いつものように、次のものがあります。

<form id="login" method="post" action="j_security_check" >

 <input name="j_username" type="text">
 <input name="j_password" type="text">

2. 外部ログイン失敗ページを用意することをお勧めします

基本的に、何か問題があったことをユーザーに通知する必要があります。たとえば、再ログインを提案する場合もあります。

3. 適切な認証方法を構成する

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/VAADIN/loginPage.html</form-login-page>
        <form-error-page>/VAADIN/loginFailed.html</form-error-page>
    </form-login-config>
</login-config>

4.セッションタイムアウトの設定を忘れないでください

<session-config>
    <session-timeout>60</session-timeout>
</session-config>

5. 完了です。あとはテストするだけです

于 2013-11-06T15:28:06.053 に答える
1

Vaadin から認証を除外することをお勧めします。JSP ページを認証フォームとして保持し、サーブレット仕様のデフォルト認証を使用します。

コードにプログラム可能な認証が含まれていると、バグが発生する可能性があります。さらに、コードはより複雑になります。宣言型セキュリティを使用することをお勧めします。その場合、認証はアプリケーションから分離されます。アプリケーションはよりシンプルになり、セキュリティはより信頼できるものになります。

ウェビナーをご覧ください http://www.youtube.com/watch?v=PNAo3ApWA-A全体は非常に興味深いですが、認証を行う方法の例は 47 分から始まります。カスタム コードと宣言型セキュリティの両方のソリューションが提示されます。

そのウェビナーを見た後、宣言型セキュリティが正しい選択であると確信しています。

宣言型セキュリティには、web.xml での調整が必要です。純粋な Vaadin アプリケーションと比較すると、すべての要求が VaadinServlet によって処理されるわけではありません。認証要求はデフォルトで処理する必要があります。とにかく、宣言型セキュリティは構成作業に値します。

于 2013-11-02T08:43:35.307 に答える