我现在对此问题感到困惑。
说,我必须设计一个OO系统,其中管理员将是唯一可以在学院注册新学生的用户。现在,我(显然)系统的其他用户。我应该如何控制这些权限仅在用户是管理员时适用?
我有两种可能性:将这些角色作为函数嵌入到与Admin
类通信的Student
类中,或者只是控制程序执行中新学生的注册,例如: p>
if(user_type() == 'a') register_student(); // a type means an admin user
else cout << "Access denied";
...
答案 0 :(得分:3)
有几种方法可以做到这一点:OO:
if( user->has_permission( REGISTER_STUDENT ) ) {
register_student();
}
这是询问用户实例是否有权注册学生。另一种方式:
if( user->in_role( ROLE_ADMIN ) ) {
register_student();
}
我对代码的问题在于它公开了有关如何确定管理员角色的内部细节。字母a
最终将失去背景,对于新维护者的地位变得毫无意义;而常量ROLE_ADMIN
/ REGISTER_STUDENT
澄清了代码的意图,而无需额外的评论。
执行注册并不是User
类或Admin
类的责任。 Student
注册自己是有意义的:
if( user->in_role( ROLE_ADMIN ) ) {
student->register();
}
我期望在Controller
课程中看到这段代码。 Controller
类将能够检查用户界面对象以确定:
您可以实施以下内容:
if( user->is_admin() ) {
student->register();
}
虽然代码非常清晰,但由于您可能希望保留以下可能性,因此灵活性较低:
if( controller->can_execute( user, action ) ) {
action->execute();
}
else {
controller->execute_error( user, action );
}
这提供了一个更灵活的系统,因为可以动态地将角色分配给动作。例如,您可以将方法student->register()
映射到ROLE_ADMIN
。这将整个应用程序中的所有安全约束保留在一个位置,大大简化了维护。
它还可以进一步简化:
controller->execute( user, action );
然后execute方法类似于:
void execute( User user, Action action ) {
if( can_execute( user, action ) ) {
action->execute();
}
else {
error( user, action );
}
}
bool can_execute( User user, Action action ) {
return user->is_in_role( action->get_role() );
}
现在抽象出了如何显示权限错误(对话框与cout
)的实现细节。此外,错误消息可以更全面,例如:
"User registration is restricted to the administrator role."
编码为以下字符串:
"%s is restricted to the %s role."
控制器类可以自动替换%s
。