确定复杂的安全性和权限

时间:2011-07-29 17:49:10

标签: c# asp.net-mvc authentication simplification application-security

我已经加入了一个项目,它有一个杂乱的类,可以将按钮写入页面。该应用程序是一个文档管理器,并有一个按钮的弹出列表,如下载,电子邮件和打印。根据用户的角色和文档的状态,将显示不同的按钮。

其他WTF中有这样的事情:

bool showEditButton = document.docTypeId == documentEnum.docType.text && 
( document.statusId == documentEnum.docStatus.Editable || (user.UserStatus == userEnum.Status.SuperUser) || ( user.UserID == document.CreatedByUserId ) )

依此类推,直到我无法弄清楚发生了什么。

我不知道这是否只是一个更深层次的架构缺陷的副作用,或者是否有一个很好的方法来处理检查权限和状态值的混合。我应该把所有这些疯狂的条件放在一个方法中而忘记它吗?这对下一个继承该项目的程序员没有好处。

4 个答案:

答案 0 :(得分:2)

在您的示例中,它只是一堆布尔逻辑,但可以使用Compose Method重构来清除可读性。如果您有一个接受文档和当前用户主体的类,那么您可以使用以下内容:

public class DocumentPermissions
{
    private Document document;
    private User user;

    public DocumentPermissions(Document doc, User currentUser)
    {
        document = doc;
        user = currentUser;
    }

    public bool ShouldShowEditButton()
    {
        if(!IsTextDocument())
        {
            return false;
        }
        return IsSuperUser() || IsDocumentOwner() ||  DocumentIsEditable();
    }

    private bool IsTextDocument()
    {
        return document.docTypeId == documentEnum.docType.text;
    }

    private bool IsSuperUser()
    {
        return user.UserStatus == userEnum.Status.SuperUser;
    }

    private bool IsDocumentOwner()
    {
        return user.UserID == document.CreatedByUserId ;
    }

    private bool DocumentIsEditable()
    {
        return document.statusId == documentEnum.docStatus.Editable ;
    }
}

显然这是很多代码,所以我希望你可以重用许多私有方法。

答案 1 :(得分:1)

或者你可以使用:

bool showEditButton = (document.statusId == documentEnum.docStatus.Editable); //show if Editable..
showEditButton |= (user.UserStatus == userEnum.Status.SuperUser); //or a superuser or
showEditButton |= (user.UserID == document.CreatedByUserId); //the Creator
showEditButton &= (document.docTypeId == documentEnum.docType.text); //and a text Doc

虽然,我更喜欢Ryan的答案,但我会以另一种方式抛弃它,这种方式至少稍微可读,并为一些评论提供更好的位置。

答案 2 :(得分:0)

你暂时拥有它;如果你被指派重构它,重构它。如果你有其他更紧迫的问题,请处理它们,但如果可以,你应该利用业余时间重构它(不要做好工作,他们可能会让你成为永久所有者)。关于你的其他问题,安全等,没有足够的信息。

http://en.wikipedia.org/wiki/Refactoring

答案 3 :(得分:0)

老实说,示例代码看起来并不太糟糕。我当然看到了更糟糕的事情。

它非常易读,没有“神奇的字符串”或“神奇的数字”。我相信你可以找到更紧迫的清理机会。