[英]Angular and Laravel how to manage user permissions on the client side
下面的代碼片段是一個使用 Laravel Sanctum 對用戶進行身份驗證的 Angular 服務:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Router } from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private baseURL = "http://localhost:8000/api";
constructor(private http: HttpClient,public router: Router) { }
login(username: string, password: string): Observable<boolean> {
return this.http.post<{token: string}>(this.baseURL+'/login', {email: username, password: password})
.pipe(
map(result => {
localStorage.setItem('access_token', result.token);
return true;
})
);
}
getToken() {
return localStorage.getItem('access_token');
}
logout() {
let removeToken = localStorage.removeItem('access_token');
if (removeToken == null) {
this.router.navigate(['login']);
}
}
public get isLoggedIn(): boolean {
//TODO: Check token expiry and other security checks
return (localStorage.getItem('access_token') !== null);
}
}
我的問題是,如果我使用 spatie 權限或 Laravel Gates 進行授權,我如何將它們存儲在前端,以便我能夠根據允許訪問的用戶顯示或隱藏菜單?
免責聲明:我習慣於使用刀片模板開發應用程序。 我第一次切換到SPA。
身份驗證(成功登錄)后,您可以通過以下方式管理您的授權(訪問權限):
如果組件與路由相關,則需要保護路由。 在這種情況下使用:
如果組件嵌入在視圖中(例如打開或受保護路由下的按鈕或視圖部分),那么您可以:
[hidden]="condition"
html 屬性的屬性綁定。and
DOM 中隱藏或顯示元素,請使用內置的 Angular 指令*ngIf="condition" 。 假設您只想向Super_Admin
用戶授予對菜單中item A
的訪問權限。 你可以這樣做:
<ng-container *ngIf="rolePropertyFromAPI === 'Super_Admin'">Item A</ng-container>
這是一個很大的話題,你可以在網上找到很多東西。 查看中等和 Angular In-depth 博客文章以了解如何實施此類策略。 第一步當然是這里的文檔
對於存儲像上面的“Super_Admin”這樣的訪問信用非常簡單。 您在這里有三個選擇:
易於訪問和持久性的最佳選擇是 localStorage API。 然而,它並不那么安全。 不過,它可以為您完成工作。
最先進和最棘手的一種方法是使用 Observables 將憑據存儲在應用程序狀態中。
使用本地存儲:
1-您訪問您的 API 端點響應
2-在瀏覽器存儲中設置屬性
localStorage.setItem('Super_Admin', JSON.stringify(valueFromBackendEnd))
3-通過存儲的鍵獲取值
localStorage.getItem('Super_Admin')
4-清除存儲。
localStorage.removeItem('Super_Admin')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.