繁体   English   中英

Java,处理对象权限

[英]Java, dealing with Objects permissions

几天前,我被分配去制作大学课程和学生管理系统的(业余)模型(只是核心程序,没有gui)。 我成功地创建了几乎所有的东西,除了一部分,许可。 我什至不知道从哪里开始。 因此,课程课程有很多方法,但是每种方法都应该以不同的方式工作。 例如,如果学生想报名已超过报名截止日期的课程,则只有在教授手动添加他的情况下他才能报名。 我设置了该方法,该方法可以检查日期并在学生尝试注册太晚时返回错误。 但是,如果对象教授要调用该方法,则他可以“替代规则”。 我的教授告诉我考虑使用接口,但是我已经将头撞墙了一段时间,而且我仍然不知道如何使用接口来设置权限。
编辑:抱歉,我忘记了这个问题。 Java中创建和控制权限的最佳方法是什么? 如果碰巧是接口,我究竟该如何使用接口来做到这一点?

如果有接口该怎么办

public void studentEnroll(Student s);

处理器上的另一个接口可以访问

public void professorEnroll(Student s);

您可以通过多种方式执行此操作。 我建议您尝试考虑最简单的解决方案。

您可能需要提供更多信息,以了解系统如何知道谁在执行系统中的每个方法。 我假设您传递了代表谁正在调用方法的User对象(还有其他方法,但这仅说明了这一点,而没有讨论您可能会或可能不会使用/需要的许多体系结构)。

public class Course {

    public void enroll( User user, Student student ) {
       if( user.hasPermission( Permission.OVERRIDE_COURSE_RULES ) ) {
           add( student );
       } else if( hasEnrollmentDatePassed() ) {
           throw new CourseException( "Enrollment date has passed." );
       } else if( isClassFull() ) {
           throw new CourseException( "Course is full" );
       } else {
           add( student );
       }
    }
}

没什么要注意的:用户不依赖教授,学生等。用户可以是教授,学生等实现的具体课程或接口。 您不想将您的权限系统绑定到Professor and Student,因为如果这样做,您的权限映射就无法更改。 这意味着如果您以后想允许某个TA或Grad Student覆盖添加学生的规则,则您不能在不修改代码的情况下更改这些权限映射。 因此,请始终使用“动词”或操作来获取权限。 将一组权限映射到用户,然后不要检查用户类型使用这些动词来启用功能。

您可以设计如下:

class Course
{
   public void enroll(Person actionGenerator, Student student) 
   {
      if ( actionGenerator instanceof Professor )
      {
          //bypass verification
      }
      else
      {
      }
   }
}

interface Person
{
   /*....*/
}

class Student implements Person
{
   public void registerStudent(Course c)
   {
      c.enroll(this,this);
   }
}

class Professor implements Person
{
   public void registerStudent(Course c, Student s)
   {
      c.enroll(this,s);
   } 
}

我发现人们经常将系统内部的类/参与者与系统外部的人员/参与者混淆:他们会说:“我们不能信任学生类来持有学生的现金余额,因为我们不能信任(人类)的学生;他们可以撒谎!” 切记:您可以控制输入到Student类中的代码及其作用。 实际的学生不会编写代表他们的实例的程序。 教授课也一样。

因此,通常来说,您将根据设计流程施加安全性和权限。 IE:如何定义和使用类的方法。

您的系统需要知道学生是否正在直接注册课程,或者班级的教授是否正在注册课程。 这通常意味着系统必须知道当前登录系统的人是学生还是教授。 为教授提供不同的屏幕,调用不同的方法可能是有意义的。

在生产代码中,我可能会使用线程本地存储来跟踪当前用户的权限。 但这对于学生作业来说可能有点多。

老实说,我不认为引入Java接口有什么帮助。 仔细考虑所使用的接口(方法)以及何时使用它们可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM