2

ユーザーがプロファイル情報を編集できるユーザー プロファイル ビューがあります。以下のすべてがうまく機能し、更新が成功しました。ただし、アカウントからログアウトして別のユーザー アカウントでログインすると、更新に失敗してAccess deniedエラーが返されます。ページを更新するまで、2 番目のアカウントでプロファイル情報を編集できません。

このケースは非常にまれであり、ユーザーがあるアカウントからログアウトし、別のアカウントでログインしてプロファイルを更新しようとすることは通常ありませんが、なぜこれが起こっているのかをよりよく理解したいと思います. ユーザーがログアウトしたときにクライアント トークンがフラッシュされないか、それともページの完全なリロードが必要な何かが保持されているか?

クライアント JS で:

Template.user_profile_form.events({
    'click #submit_profile_btn': function(evt) {
        evt.preventDefault();
        var first_name = $('#profile_first_name').val()
            ,last_name = $('#profile_last_name').val()
            ,email = $('#profile_email').val()
            ,email_lower_case = email.toLowerCase()
            ,gravatar_hash = CryptoJS.MD5(email_lower_case)
        ;

        gravatar_hash = gravatar_hash.toString(CryptoJS.enc.Hex);

        // TODO need to create user sessions so that when you log out and log back in, you have a fresh session
        Meteor.users.update({_id: this.userId }, {
            $set: {
                profile: {
                    first_name: first_name,
                    last_name: last_name,
                    gravatar_hash: gravatar_hash
                }
            }
        }, function(error) {
            if (!error) {
                Session.set('profile_edit', 'success');
                Meteor.setTimeout(function() {
                    Session.set('profile_edit', null);
                }, 3000);
            } else {
                Session.set('profile_edit', 'error');
                Template.user_profile_form.error_message = function() {
                    return error.reason;
                };
            }
        });

        Meteor.call('changeEmail', email);
    }
});

サーバー JS:

Meteor.publish('list-all-users', function () {
    return Meteor.users.find({_id: this.userId }, {
        fields: {
            profile: 1,
            emails: 1
        }
    });
});

Meteor.methods({
    sendEmail: function(to, from, subject, text) {
        this.unblock();

        Email.send({
            to: to,
            from: from,
            subject: subject,
            text: text
        });
    },
    changeEmail: function(newEmail) {
        // TODO Need to validate that new e-mail does not already exist
        Meteor.users.update(Meteor.userId(), {
            $set: {
                emails: [{
                    address: newEmail,
                    verified: false
                }]
            }
        });
     }
});

テンプレート:

<template name="user_profile_form">
    <h2>Update Profile</h2>
    <div id="profile-form">
        {{#if success}}
            <div class="alert alert-success">
                <strong>Profile updated!</strong> Your profile has been successfully updated.
            </div>
        {{/if}}
        {{#if error}}
            <div class="alert alert-error">
                <strong>Uh oh!</strong> Something went wrong and your profile was not updated. {{error_message}}.
            </div>
        {{/if}}
        <p>
            {{#each profile}}
            <input type="text" id="profile_first_name" placeholder="First Name" value="{{first_name}}">
            <input type="text" id="profile_last_name" placeholder="Last Name" value="{{last_name}}">
            {{/each}}
            <input type="email" id="profile_email" placeholder="Email" value="{{email_address}}">
        </p>
    </div>
    <div id="submit-btn">
        <input type="submit" id="submit_profile_btn" class="btn btn-primary">
    </div>
</template>
4

2 に答える 2

2

Meteor のログアウト機能はほとんど何もしません。セッション状態やアプリの残りのコンテキストが破棄されることはありません。アプリのログアウト イベント中に、コードでこれらの変数をリセットする必要があります。ページを手動で更新すると、クライアント側の JavaScript が再読み込みされ、既存のセッション データが消去されます。

于 2013-01-16T13:13:21.700 に答える