拉哥 發表於 2019-12-25 16:41:00

Angular 8 权限控制

<p>1. 没有权限内的页面,自动跳转到“无法找到页面”</p>
<p>2. 没有权限的按钮,控件不显示</p>
<p>3. 没有登录token访问需要登录的页面,自动跳转到“无法找到页面”</p>
<p>&nbsp;</p>
<p>思路:用一个service 去存储登录用户的权限列表。 在需要权限控制的按钮、控件上通过 *ngIf 控制控件可见性。在每个页面 active 之前去判断权限,并实现没有权限跳转至‘无法找到页面’</p>
<ul>
<li>创建一个permission.service.ts</li>
</ul>
<p style="margin-left: 90px">主要功能:将 “permission1, permssion2, permission3, permission4” 的permission 字符串转化成一个Json 对象:{permission1:true, permission2:true, permission3:true, permission4:true}</p>
<table style="height: 644px; width: 1356px" border="0">
<tbody>
<tr>
<td>
<div>
<div>import&nbsp;{&nbsp;Injectable&nbsp;}&nbsp;from&nbsp;'@angular/core';</div>
<br>
<div>@Injectable({</div>
<div>&nbsp;&nbsp;providedIn:&nbsp;'root'</div>
<div>})</div>
<div>export&nbsp;class&nbsp;PermissionsService&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;public&nbsp;Items:&nbsp;any;</div>
<br>
<div>&nbsp;&nbsp;constructor()&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!this.Items)&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//get&nbsp;permission&nbsp;string&nbsp;from&nbsp;storage</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;permissionString&nbsp;=&nbsp;window.sessionStorage.getItem('permission');</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(permissionString)&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//parse&nbsp;permission&nbsp;array</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.convertPermissionToJsonStr(permissionString.toLowerCase().split(','));</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;setStorage_permission(permissionString)&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;window.sessionStorage.setItem('permission',&nbsp;permissionString);</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//parse&nbsp;permission&nbsp;array</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;this.convertPermissionToJsonStr(permissionString.toLowerCase().split(','));</div>
<div>&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;getStorage_permission()&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;window.sessionStorage.getItem('permission');</div>
<div>&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;//convert&nbsp;permission&nbsp;string&nbsp;to&nbsp;jason&nbsp;properties</div>
<div>&nbsp;&nbsp;private&nbsp;convertPermissionToJsonStr(permArray)&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;jsonArray&nbsp;=&nbsp;new&nbsp;Array();</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(permArray&nbsp;&amp;&amp;&nbsp;permArray.length&gt;0)&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;permArray.forEach(x&nbsp;=&gt;&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonArray.push('"'&nbsp;+&nbsp;x&nbsp;+&nbsp;'"'&nbsp;+&nbsp;":true");</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Items&nbsp;=&nbsp;JSON.parse("{"&nbsp;+&nbsp;jsonArray.toString()&nbsp;+&nbsp;"}");</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;}</div>
<br>
<div>}</div>
</div>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<ul>
<li>在需要添加权限的 component 中添加 service 引用</li>
</ul>
<p style="margin-left: 150px"><img src="https://img2018.cnblogs.com/blog/392690/201912/392690-20191225161753753-1100588415.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="margin-left: 150px"><img src="https://img2018.cnblogs.com/blog/392690/201912/392690-20191225161829294-1344945487.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li>在 HTML 中, 通过permission 对象去判断是否有权限。 这个地方 Item 对象包含的 property 就是权限列表中的每个权限名 string.</li>
</ul>
<p style="margin-left: 150px"><img src="https://img2018.cnblogs.com/blog/392690/201912/392690-20191225161951858-1759422711.png" alt=""></p>
<p>&nbsp;</p>
<ul>
<li>添加一个 auth-guard.service.ts, 用来截取每个页面激活前的判断处理</li>
</ul>
<p style="margin-left: 60px">在页面 activate 之前,去判断:有没有token, 有没有即将激活页面的permission. 如果正常激活 return true, 不激活 return false.</p>
<ul>
<li>
<table style="height: 709px; width: 1385px" border="0">
<tbody>
<tr>
<td>
<div>
<div>import&nbsp;{&nbsp;Injectable&nbsp;}&nbsp;from&nbsp;'@angular/core';</div>
<div>import&nbsp;{&nbsp;CanActivate,&nbsp;ActivatedRouteSnapshot,&nbsp;RouterStateSnapshot,&nbsp;Router&nbsp;}&nbsp;from&nbsp;'@angular/router';</div>
<div>import&nbsp;{&nbsp;Observable&nbsp;}&nbsp;from&nbsp;'rxjs';</div>
<div>import&nbsp;{&nbsp;AllService&nbsp;}&nbsp;from&nbsp;'../services/all.service';</div>
<br>
<div>@Injectable({</div>
<div>&nbsp;&nbsp;providedIn:&nbsp;'root'</div>
<div>})</div>
<div>export&nbsp;class&nbsp;AuthGuardService&nbsp;implements&nbsp;CanActivate&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;constructor(private&nbsp;all:&nbsp;AllService,&nbsp;private&nbsp;_router:&nbsp;Router)&nbsp;{</div>
<div>&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;canActivate(next:&nbsp;ActivatedRouteSnapshot,&nbsp;state:&nbsp;RouterStateSnapshot):&nbsp;Observable&lt;boolean&gt;&nbsp;|&nbsp;Promise&lt;boolean&gt;&nbsp;|&nbsp;boolean&nbsp;{</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;permissions&nbsp;=&nbsp;this.all.permission.getStorage_permission();</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;localRouter&nbsp;=&nbsp;next.url.path.trim();</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;s&nbsp;=&nbsp;this.getPermissionByUrl(localRouter);</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(localRouter&nbsp;!=&nbsp;'charityAllInOne')&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.all.share.SetCharityStep({&nbsp;Step:&nbsp;-1&nbsp;});</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;token&nbsp;=&nbsp;this.all.cache.getStorage_userToken();</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;//no&nbsp;token</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(token&nbsp;==&nbsp;null)&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;navigate&nbsp;to&nbsp;login&nbsp;page</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._router.navigate(['/login']);</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;save&nbsp;redirect&nbsp;url&nbsp;so&nbsp;after&nbsp;authing&nbsp;we&nbsp;can&nbsp;move&nbsp;them&nbsp;back&nbsp;to&nbsp;the&nbsp;page&nbsp;they&nbsp;requested</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;//has&nbsp;user&nbsp;permission</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(permissions&nbsp;!=&nbsp;null)&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;permArray&nbsp;=&nbsp;permissions.toLowerCase().split(',');</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;match&nbsp;=&nbsp;permArray.find(x&nbsp;=&gt;&nbsp;x&nbsp;==&nbsp;s);</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(match&nbsp;!=&nbsp;undefined)&nbsp;&nbsp;//need&nbsp;has&nbsp;url&nbsp;permission</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br>
<div>&nbsp;&nbsp;&nbsp;&nbsp;//page&nbsp;no&nbsp;permission</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;this._router.navigate(['/pageNotFound']);</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;can&nbsp;save&nbsp;redirect&nbsp;url&nbsp;so&nbsp;after&nbsp;authing&nbsp;we&nbsp;can&nbsp;move&nbsp;them&nbsp;back&nbsp;to&nbsp;the&nbsp;page&nbsp;they&nbsp;requested</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</div>
<br><br><br>
<div>&nbsp;&nbsp;}</div>
<br>
<div>}</div>
</div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
<p><br><br></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/crdanding/p/12097526.html
頁: [1]
查看完整版本: Angular 8 权限控制