Ich verwende rollenbasierte Autorisierung sowohl auf dem Backend als auch auf dem Frontend. Da ich UI-Router für das Routing verwenden, die beste Ressource fand ich (und meine Bedürfnisse verbessern) ist dieser Artikel:
Link
abgelaufen Wenn Sie UI-Router verwenden, ist es auf jeden Fall überprüfen. Grundsätzlich müssen Sie die Sicherheit Ihrer Routen einrichten und alle Routenänderungen abfangen. Der Artikel enthält auch eine Anweisung zum Ausblenden von Benutzeroberflächenelementen, wenn der Benutzer nicht berechtigt ist, auf den dahinter liegenden Inhalt zuzugreifen.
Edit: einige Code hinzufügen.
Zuerst müssen Sie Benutzerrechte irgendwo gespeichert haben, z.auf Benutzerobjekt in localstorage serialisiert:
{"id":1,"name":"user","created_at":"2016-04-17 18:58:19","gender":"m","roles":["admin"]}
Dann haben Sie zwei wichtige Teile:
- Richtlinie - zu bestimmen, ob Element sichtbar oder nicht, basierend auf zugewiesenen Berechtigungs
- Service sein sollte - zu handhaben Berechtigungsprüfung
Richtlinie:
Sie müssen Ihr CSS so einstellen, dass Elemente mit der Klasse hidden
nicht sichtbar sind.
Service:
(function() {
'use strict';
angular
.module('app')
.factory('authorization', authorization);
/** @ngInject */
function authorization($rootScope) {
var service = {
authorize: authorize,
constants: {
authorised: 0,
loginRequired: 1,
notAuthorised: 2
}
};
return service;
function authorize(loginRequired, requiredPermissions, permissionCheckType) {
var result = service.constants.authorised,
user = $rootScope.currentUser,
loweredPermissions = [],
hasPermission = true,
permission;
permissionCheckType = permissionCheckType || 'atLeastOne';
if (loginRequired === true && user === undefined) {
result = service.constants.loginRequired;
} else if ((loginRequired === true && user !== undefined) &&
(requiredPermissions === undefined || requiredPermissions.length === 0)) {
result = service.constants.authorised;
} else if (requiredPermissions) {
loweredPermissions = [];
angular.forEach(user.roles, function (permission) {
loweredPermissions.push(permission.toLowerCase());
});
for (var i = 0; i < requiredPermissions.length; i += 1) {
permission = requiredPermissions[i].toLowerCase();
if (permissionCheckType === 'combinationRequired') {
hasPermission = hasPermission && loweredPermissions.indexOf(permission) > -1;
// if all the permissions are required and hasPermission is false there is no point carrying on
if (hasPermission === false) {
break;
}
} else if (permissionCheckType === 'atLeastOne') {
hasPermission = loweredPermissions.indexOf(permission) > -1;
// if we only need one of the permissions and we have it there is no point carrying on
if (hasPermission) {
break;
}
}
}
result = hasPermission ?
service.constants.authorised :
service.constants.notAuthorised;
}
return result;
}
}
})();
Jetzt können Sie die Richtlinie verwenden/auszublenden Element zeigen:
<a ui-sref="app.administration" class="btn btn-primary pull-right" access="admin">Administration</a>
dieses Kurses wird das Element in DOM nur verstecken, so dass Sie tun müssen, die Berechtigungsprüfung auch auf dem Server.
Dieser erste Teil wurde gelöst, um Elemente in der Benutzeroberfläche anzuzeigen/zu verbergen, Sie können aber auch App-Routen schützen.
Routendefinition:
(function() {
'use strict';
angular
.module('app')
.config(routeConfig);
/** @ngInject */
function routeConfig($stateProvider) {
$stateProvider
.state('app.dashboard', {
url: '/dashboard',
data: {
access: {
loginRequired: true
}
},
templateUrl: 'template_path',
controller: 'DashboardController as vm'
}
}
})();
und jetzt prüfen nur für die Erlaubnis, in $stateChangeStart
Ereignis
(function() {
'use strict';
angular
.module('app')
.run(runBlock);
/** @ngInject */
function runBlock($rootScope, $state, authorization) {
$rootScope.$on('$stateChangeStart', function(event, toState) {
// route authorization check
if (toState.data !== undefined && toState.data.access !== undefined) {
authorised = authorization.authorize(toState.data.access.loginRequired,
toState.data.access.requiredPermissions,
toState.data.access.permissionCheckType);
if (authorised === authorization.constants.loginRequired) {
event.preventDefault();
$state.go('app.login');
} else if (authorised === authorization.constants.notAuthorised) {
event.preventDefault();
$state.go('app.dashboard');
}
}
});
}
})();
Danke @ sh-Ado-w, würde ich diese Lösung implementieren Sie oben erwähnt haben . Ich werde Sie wissen lassen, ob es klappt oder nicht. – CalmWinds
Link funktioniert nicht mehr. Es ist besser Inhalte in SO zu posten als außerhalb zu verlinken. – eabates
Ich habe Code aus meiner Anwendung hinzugefügt, der, glaube ich, auf diesem Artikel basiert. – Adrian