簡體   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