ShenNiusModularity项目源码学习(6:访问控制)
ShenNius.Admin.API项目中的控制器类的函数如果需要访问控制,主要是调用ShenNius.Infrastructure项目下的AuthorityAttribute特性类实现的。AuthorityAttribute继承自ActionFilterAttribute抽象类,后者用于在调用控制器操作函数前后自定义处理逻辑,主要支持以下几种事件。AuthorityAttribute类重写了OnActionExecuting事件处理函数,用于在调用控制器类的函数前进行访问控制检查。
访问控制的整体思路还是先检查是否登录用户,然后再根据当前用户权限判断是否能调用当前控制器的指定函数。具体如下:
1)根据当前上下文中的User.Identity.IsAuthenticated属性判断是否为登录用户,未登录则不允许访问;
2)如果是DEBUG模式,且当前用户有管理员权限,则不需要访问控制。通过在上下文的User.Claims查找是否有主键为IsAdmin且值为1的数据。但是从源码来看,MVC模式下调用ShenNius.Admin.Mvc的UserController.Login函数登录时用户声明中有IsAdmin信息,但在前后端分类模式下,调用ShenNius.Admin.API的UserController.SignIn函数登录时暂时没有看到设置IsAdmin声明信息的代码;
3)从函数输入参数中调用ActionExecutingContext.ActionDescriptor. RouteValues获取要访问的控制器类及函数,再从上下文中获取当前用户标识及权限缓存,依次判断当前用户是否有权限访问,但有特例,如果函数名为GetListPages则直接放过。如果是MVC模式,则在用户登录函数中登录验证通过后,会调用MenuRepository.GetCurrentAuthMenus函数获取当前用户权限并返回前端。但是在前后端分类模式下,暂时没有看到是在什么时候获取并保存的当前用户权限。
参考文献:
[1]https://gitee.com/shenniu_code_group/shen-nius.-modularity