Я новичок в meanjs, но в настоящее время я пытаюсь создать простое приложение, в котором пользователи могут подключаться друг к другу.Как реплицировать панель управления admin в средстве для создания каталога пользователя
Прямо сейчас я просто хочу реализовать функцию, в которой пользователи могут искать друг друга путем поиска и ничего другого, но я продолжаю сталкиваться с ошибкой 403. Я попытался исправить это, реплицируя документы, которые составляют представление администратора «управлять пользователями».
Я не хотел давать каждому роль администратора, поэтому я добавил новую политику для пользователей, где им даны только разрешения «получить». Я также добавил новый маршрут, просмотр и контроллер для обычного пользователя, который был изменен из файлов администратора.
Он работал очень хорошо, но я до сих пор не могу заставить систему разрешить доступ к новому представлению userDirectory при входе в систему под роль, отличной от admin. Я думаю, что это имеет какое-то отношение к файлу auth.interceptor.client.service.js и к файлу modules/core/client/app/init.js и к состоянию $, предоставляемому новыми файлами, которые я сделал, но я попытался измените их, и он все еще бросает/запрещенный вид в теле моего приложения.
Я в недоумении за то, что еще я могу сделать. Любая помощь будет принята с благодарностью.
приложение начинается с точки зрения home.client.view.html:
<section ng-controller="HomeController">
</div>
<div class="jumbotron text-center" ng-hide="authentication.user">
<div class="row">
<div class="col-md-6 col-md-offset-3 col-sm-6 col-sm-offset-3 col-xs-12">
<img alt="MEAN.JS" class="img-responsive text-center" src="modules/core/client/img/brand/Logo.png" />
</div>
</div>
<br>
<div class="row">
<p class="lead">
An app
</p>
</div>
<div class="row">
<p>
<!-- <a class="btn btn-primary btn-lg" href="http://meanjs.org" target="_blank">Learn more</a> -->
</p>
</div>
</div>
<div ng-if="authentication.user">
<h2>Congratulations! You are logged in.</h2>
<div ng-include="'/modules/users/client/views/user/user-directory.client.view.html'"></div>
<!-- <div ng-include="'/api/users'"></div> -->
</div>
</section>
Вот мой взгляд на userDirectory (модифицированный из модулей/пользователей/клиент/Views/администратор/список-users.client.view.html):
<section ng-controller="UserDirectoryController">
<div class="page-header">
<div class="row">
<div class="col-md-4">
<h1>Users</h1>
</div>
<div class="col-md-4" style="margin-top: 2em">
<input class="form-control col-md-4" type="text" ng-model="search" placeholder="Search" ng-change="figureOutItemsToDisplay()" />
</div>
</div>
</div>
<div class="list-group">
<a ng-repeat="user in pagedSearchItems" ui-sref="users.user({userId: user._id})" class="list-group-item">
<h4 class="list-group-item-heading" ng-bind="user.username"></h4>
<p class="list-group-item-text" ng-bind="user.email"></p>
</a>
</div>
<pagination boundary-links="true" max-size="8" items-per-page="itemsPerPage" total-items="filterLength" ng-model="currentPage" ng-change="pageChanged()"></pagination>
</section>
My Controller (редактировался модулей/пользователей/клиент/контроллеры/админ/список-users.client.controller.js):
'use strict';
angular.module('users.user').controller('UserDirectoryController', ['$scope', '$filter', 'User',
function ($scope, $filter, User) {
User.query(function (data) {
$scope.users = data;
$scope.buildPager();
});
$scope.buildPager = function() {
$scope.pagedSearchItems = [];
$scope.itemsPerPage = 15;
$scope.currentPage = 1;
$scope.figureOutItemsToDisplay();
};
$scope.figureOutItemsToDisplay = function() {
$scope.filteredItems = $filter('filter')($scope.users, {
$: $scope.search
});
$scope.filterLength = $scope.filteredItems.length;
var begin = (($scope.currentPage - 1) * $scope.itemsPerPage);
var end = begin + $scope.itemsPerPage;
$scope.pagedSearchItems = $scope.filteredItems.slice(begin, end);
};
$scope.pageChanged = function() {
$scope.figureOutItemsToDisplay();
};
}
]);
Моя_служба (редактировался модулей/пользователей /client/services/users.client.service.js):
'use strict';
// Users service used for communicating with the users REST endpoint
angular.module('users').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory', {}, {
update: {
method: 'PUT'
}
});
}
]);
//TODO this should be Users service
angular.module('users.user').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory/:userId', {
userId: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
angular.module('users.user').factory('User', ['$resource',
function ($resource) {
return $resource('api/userDirectory/:userId', {
userId: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
Моего новый route.js (модифицированный из модулей/пользователей/сервера/маршрутов/admin.server.routes.js):
'use strict';
/**
* Module dependencies.
*/
var userPolicy = require('../policies/userDirectory.server.policy'),
userDirectory = require('../controllers/userDirectory.server.controller');
module.exports = function (app) {
// User route registration first. Ref: #713
require('./users.server.routes.js')(app);
// Users collection routes
app.route('/api/userDirectory')
.get(userPolicy.isAllowed, userDirectory.list);
//Single user routes
app.route('/api/userDirectory/:userId')
.get(userPolicy.isAllowed, userDirectory.read);
// Finish by binding the user middleware
app.param('userId', userDirectory.userByID);
};
И, наконец, моя новая политика userDirectory (Модифицированное от модулей/пользователей/сервера/политики/admin.server.policy.js):
'use strict';
/**
* Module dependencies.
*/
var acl = require('acl');
// Using the memory backend
acl = new acl(new acl.memoryBackend());
/**
* Invoke User Permissions
*/
exports.invokeRolesPolicies = function() {
acl.allow([{
roles: ['user'],
allows: [{
resources: '/api/userDirectory',
permissions: ['post', 'get']
}, {
resources: '/api/userDirectory/:userId',
permissions: ['post', 'get']
}]
}]);
};
/**
* Check If User Policy Allows
*/
exports.isAllowed = function (req, res, next) {
var roles = (req.user) ? req.user.roles : ['guest'];
// Check for user roles
acl.areAnyRolesAllowed(roles, req.route.path, req.method.toLowerCase(), function (err, isAllowed) {
if (err) {
// An authorization error occurred.
return res.status(500).send('Unexpected authorization error');
} else {
if (isAllowed) {
// Access granted! Invoke next middleware
return next();
} else {
return res.status(403).json({
message: 'User is not authorized'
});
}
}
});
};
Спасибо за ответ Люк. Я только что редактировал свой вопрос и добавил свой код. Я чувствую, что я освещал все, о чем вы говорили, но в моем представлении каталога пользователей происходит возврат к неправильному маршруту. Он продолжает возвращаться к маршруту «api/users» вместо моего нового маршрута «api/userDirectory». Я думаю, что это связано с угловым кодом в представлении. Но я могу ошибаться. Если у вас есть возможность, вы можете просмотреть мой код и рассказать мне, почему вы думаете, что он не работает или, по крайней мере, где моя логика отсутствует. Еще раз спасибо за Ваш ответ! –
@AaronPennington Я посмотрел на ваш код, вы добавили свой просмотр и контроллер в маршруты на стороне клиента? В /modules/yourModule/client/config/yourModule.client.routes.js? Я отредактирую свой ответ, чтобы добавить код. –
Я думаю, что проблема была в файле client.routes.js. У меня была опечатка в имени контроллера, исправлена его, и теперь приложение отлично работает. Большое спасибо за Вашу помощь! –