asp.netMVC权限设计

asp.netMVC权限设计

2023年6月20日发(作者:)

权限设计⼏点说明:

1、该权限系统是个⽹站⽤的,⽤户简单,因此不涉及到部门这些信息 2、基于将⾓⾊与controller、action相关联来判断⽤户是否有权 3、通过重载AuthorizeAttribute实现

数据库设计:

表说明

ControllerAction

1. Name是controller的名称2. IsController是指是否是controller,如果为false,表⽰存的是action,那么controllerName字段就派上⽤场了3. IsAllowedNoneRoles是指是否允许没有权限的⼈访问4. IsAllowedAllRoles是指是否允许有⾓⾊的⼈访问IsAllowedNoneRoles,IsAllowedAllRoles实现了允许所有⼈访问以及允许所有注册⽤户访问:),并且我们约定,IsAllowedNoneRoles具有最⾼的优先级,其次是IsAllowedAllRoles,然后才是ControllerActionRole中定义的规则

ControllerActionRole IsAllowed表⽰该action或者controller是否允许访问,加⼊表中有两条记录⾓⾊ A ANameAdminHomeControllNameIsAllowedHomeNullfalsetrueIsControllerfalsetrue 这⾥约定分两个层次来判断权限: 第⼀条记录:表⽰A⾓⾊不能访问 Home/admin 第⼆条记录:表⽰A⾓⾊可以访问Controller下的所有⽅法 到底能不能访问呢?其实,我们以action为准,如果定义了action,我们直接从action的约定来判断,因此这⾥判断A不能访问Home/admin

其他⼏张表⼀看就明⽩,不再多说

判断是否有权限的设定

1、获取controller,action,以及存放在session中的⽤户信息1 publicclass UserAuthorizeAttribute : AuthorizeAttribute

2 {3 4 publicoverridevoid OnAuthorization(AuthorizationContext filterContext)

5 {

6 var user = n["CurrentUser"] as User;

7 var controller = ["controller"].ToString();

8 var action = ["action"].ToString();

9 var isAllowed =wed(user, controller, action);

10

11 if (!isAllowed)

12 {

13 ("⽆权访问");

14 ();

15 }

16

17 }18

19 ……20

21 }22

2、检索数据库ControllerAction表中有没有Name为第⼀步中controller 的记录,如果没有,我们约定这个controller是不需要进⾏权限控制的,如果有的话,进⼊第三步

3、前⾯提到了,我们约定对权限的控制分为两个层次,controller和action层次,如果同时定义了,以action为准。因此,我们需要判断是否在数据库中有action的记录,如果有,进⼊4,⽆,进⼊51 bool IsAllowed(User user, string controllerName, string actionName)

2 {

3 var service = rvice();

4

5 // 获取对应的controller

6 var controller = gleByExpression(c => == controllerName && roller);

7 if (controller !=null)

8 {

9 // 获取对应的action

10 varcontrollerAction = gleByFunc(c => == actionName && roller ==false&&llerName == controllerName);

11

12 return controllerAction ==null?wed(user, controller) : wed(user, controllerAction);

13 }

14

15 // 没有定义controller的权限,表⽰⽆需权限控制

16 returntrue;

17 }18

19

4、如果有action的记录,那么我们⾸先判断controllerAction 拒绝哪些⾓⾊访问,如果⽤户有⾓⾊在这⾥⾯,很遗憾,就不能访问了;然后判断controllerAction 允许哪些⾓⾊访问,如果⽤户的⾓⾊在这⾥⾯,就可以访问了注:这⾥很有可能⽤户有多个⾓⾊,⽐如A,B,C,如果A不能访问controllerAction,那么很遗憾,⽤户不能访问,尽管⾓⾊B,C可能可以访问该controllerAction5、没有action的记录,⾃然就检查controller对应的controllerAction 了

4、5判断的代码是⼀样的,如下:privatebool isAllowed(User user, ControllerAction controllerAction)

{

// 允许没有⾓⾊的:也就是说允许所有⼈,包括没有登录的⽤户

if (wedNoneRoles)

{ returntrue;

}

// 允许所有⾓⾊:只要有⾓⾊,就可以访问

if (wedAllRoles)

{

return >0;

}

if (user ==null|| ==0)

{

returnfalse;

}

// 选出action对应的⾓⾊

var roles = (ca => ).ToList();

if ( ==0)

{

// ⾓⾊数量为0,也就是说没有定义访问规则,默认允许访问

returntrue;

}

var userHavedRolesids = (r => ).ToList();

// 查找禁⽌的⾓⾊

var notAllowedRoles = l(r => wed ==false).Select(ca =>).ToList();

if ( >0)

{

foreach (Role role in notAllowedRoles)

{

// ⽤户的⾓⾊在禁⽌访问列表中,不允许访问

if (ns())

{

returnfalse;

}

}

}

// 查找允许访问的⾓⾊列表

var allowRoles = l(r => wed).Select(ca => ).ToList();

if ( >0)

{

foreach (Role role in allowRoles)

{

// ⽤户的⾓⾊在访问的⾓⾊列表

if (ns())

{

returntrue;

}

}

}

returnfalse;

}

使⽤⽅法:

建⽴⼀个basecontroller,使⽤我们定义好的UserAuthorize,然后所有的controller继承basecontroller就可以了1 ///

2 /// 控制基类

3 ///

4 [UserAuthorize]

5 publicabstractclass BaseController : Controller

6 {}7

8 publicclass HomeController : BaseController{}9

演⽰:

在controlleraction中添加⼏条数据:根据我们的规则,我们可以知道,未登录的⽤户可以访问Home/Public,其他⼏个页⾯则不能访问我们看对应的Action:1 publicvoid ViewPage()

2 {

3 ("View");

4 }

5 publicvoid Public()

6 {

7 ("Public");

8 }

9 publicvoid Delete()

10 {

11 ("Delete");

12 }

访问Home/Public,如果有权限,那么显⽰“Public“,否则显⽰”⽆权访问”未登录⽤户访问Home/Public,结果符合我们的约定;-)未登录⽤户访问Home/ViewPage,按约定应该显⽰错误信息查看

原⽂出处

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687249549a14.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信