设置访问权限

虽然登录和注销功能已实现,但是好像和之前也没什么区别,原因是我们还没有设置访问权限。

添加中间件

在Main方法中添加Authentication和Authorization中间件,注意中间件的顺序。代码如下:

app.UseDeveloperExceptionPage();
app.UseStatusCodePagesWithReExecute("/error/{0}");
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.MapDefaultControllerRoute();

其中UseAuthentication用于验证用户的身份。

UseAuthorization用于授权用户访问资源。

添加Authorize标识

在需要限制的控制器中设置Authorize表示来达到访问控制的目的。

其中,MajorController,GradeController,ClassController,StudentController只运行管理员角色用户访问,因此可以在这几个控制器上设置Authorize,以StudentController为例,代码如下:

[Authorize(Roles = nameof(UserRole.Admin))]
public class StudentController(StudentService studentService) : Controller

HomeController允许管理员账户和教师账户访问,代码如下:

[Authorize(Roles = $"{nameof(UserRole.Admin)},{nameof(UserRole.Teacher)}")]
public class HomeController(SearchService searchService) : Controller

登录测试

首先登录管理员用户,应该没什么问题。

注销后登录教师用户,发现班级列表无法正常显示。

原因是班级列表需要访问StudentController中的Action,而教师用户没有StudentController的访问权限,因此会出现问题。

解决方法是让GetClassSelectPartial可以匿名访问,代码如下:

[AllowAnonymous]
public IActionResult GetClassSelectPartial(Guid? classId, Guid? majorId, Guid? gradeId)
{
    return PartialView("ClassSelectPartial", studentService.GetClassSelectModel(classId, majorId, gradeId));
}

加上[AllowAnonymous]后,不需要管理员什么也能访问。