所以我有一个接受用户名和密码的登录表单。输入用户名/密码并单击提交后,第一步是检查帐户是否存在并已启用。我使用下面的代码完成了这项工作。问题是,客户端可以通过浏览器控制台访问执行检查的服务器端方法for (int i = 1; i < s.size(); i++) {
if (i%16==0) ss << '|';
ss << s[i];
}
。通常我可以通过这样做来阻止这种情况:
is_user_enabled
但是在my_method : function(doc) {
if (is_admin()) {
// Only admins can run this method.
}
}
的情况下,用户尚未登录。所以,我的问题是,处理这种情况的正确方法是什么?
我的代码:
的客户机/ login.html的
is_user_enabled
的客户机/ LIB / helpers.js
{{#autoForm schema=get_login_form_schema id="login_form"}}
{{> flashMessages}}
<fieldset>
<!-- <legend>Create User</legend> -->
{{> afQuickField name="username" placeholder="schemaLabel" label=false}}
{{> afQuickField name="password" placeholder="schemaLabel" type="password" label=false}}
<div>
<button type="submit" class="btn btn-primary">Login</button>
</div>
</fieldset>
{{/autoForm}}
服务器/ LIB / methods.js
AutoForm.hooks({
login_form: {
onSubmit: function (insert_doc, update_doc, current_doc) {
Meteor.call("is_user_enabled", insert_doc, function(error, result) {
if (result) {
// Try to log user in via Meteor.loginWithPassword()
}
});
}
}
});
最终解决方案:
的客户机/ LIB / helpers.js
Meteor.methods({
is_user_enabled : function(doc) {
// Used by the login form. Returns true if user exists and account is enabled.
check(doc, schemas.login);
var user = Meteor.users.findOne({username: doc.username}, {fields: {status: 1}});
if (user.status === "enabled") {
return true;
}
}
});
服务器/ LIB / permissions.js
AutoForm.hooks({
login_form: {
onSubmit: function (insert_doc, update_doc, current_doc) {
Meteor.loginWithPassword(insert_doc.username, insert_doc.password, function(error) {
// Called with no arguments on success
// or with a single Error argument on failure.
if (error) {
FlashMessages.sendError(error);
this.done();
} else {
// Successful login. Redirect to /.
this.done();
Router.go('/');
}
});
return false; // Prevent browser submit event.
},
}
有关Accounts.validateLoginAttempt(function (info) {
if (info.user && info.user.status === "enabled") {
return true;
} else {
throw new Meteor.Error("Invalid credentials.");
}
});
答案 0 :(得分:2)
您无法阻止客户端调用服务器方法。您对 is_user_enabled 和 is_admin 的检查需要在服务器方法内部以及客户端上进行。您当然可以在methods.js文件中包含私有函数,只有服务器上的方法才能访问。有关更多提示,请参阅http://0rocketscience.blogspot.com/2015/07/meteor-security-no-1-meteorcall.html
答案 1 :(得分:0)
是的,可以阻止从客户端执行Meteor方法。 this.connection仅在从客户端调用时才在方法内设置。从服务器调用时,它将为null。使您可以执行以下操作:
<?php
if (!empty($_GET['dropdown'])) {
$dropdownval = $_GET['dropdown'];
} else {
$dropdownval = 1;
}
?>
<form method="get" action="xyz.php">
<select name="dropdown" >
<option value="e" <?php if ($dropdownval=="e") echo 'selected="selected"'; ?>>Electronics </option>;
<option value="c" <?php if ($dropdownval=="c") echo 'selected="selected"'; ?>>Clothing & Accessories</option>;
</select>
<input type="submit" name="submit" value="Submit Form" />
</form>