Web应用中,用户验证代码怎么写比较优雅?

缘起

任何一个有用户的网站在用户进行数据操作时都免不了要对用户的身份、权限进行验证。这段代码是必要的,但这段代码要怎么写,怎样写才能不重复而且优雅。这个真让人纠结。

法一 : 最初写法

最开始写用户验证,思路是这样:进行相关操作前,验证用户是否有权限进行操作,如果没有权限,则告诉用户说没有权限和/或跳转到登录页面,代码大概是下面这样:

<?php
    if($_session[isVerified])
        // 验证通过,执行操作
        do_something();
    else
        // 验证不通过,执行处理的方法
        // 通常是跳转或出错提醒
        reject();
?>

如果有多个操作,那么每个操作的代码都要这么写吗?这样重复的代码太多了,实在不——优雅,看着心里不爽。

法二 : 借助语法糖

既然每次进行操作前都要进行验证,能不能让这部分代码自动先执行呢?高级语言一般有一种称为语法糖的特性。使用Python时接触到了这个概念(相关资料),因此可以通过定义一个装饰器,这样在执行操作的代码前仅需加入一句话就能实现上面的代码的功能了。这样做减少了验证部分的逻辑变动造成的影响。代码大概变成下面这样:

# 语法糖的装饰器
def verify(func):
    @functools.wraps(func)
    def wrapper():
        # 验证代码
        if isVerified :
            func()
        else :
            reject()
    return wrapper

# 定义需要验证才能进行操作的方法时
# 在定义方法的上一行添加一句话
@verify
def do_something():
    # 所要执行的操作

这样做就变得美观了很多,心理上感觉舒坦了不少。

法三 : 另一种语法糖

可是,要是使用的语言不支持上面这样的用法,该怎么办?从上面的方法可以知道,语法糖其实就是根据需要,将代码与代码进行整合而已。奥秘就在定义语法糖的装饰器中。原理其实很简单,先执行验证程序,根据验证结果来决定下一步操作(执行操作或是拒绝操作),由此,可以通过写一个方法,将要执行的代码通过包装传递给这个函数就可以了。代码可以是下面这样:

function verify(func) {
    // 验证代码
    if (isVerified)
        func();
    else
        // reject 部分的代码
        reject()
}

// 使用这个方法
do_something = function(){
        // 某些操作
}
verify(do_something)();

// 或者这样
verify(function(){
    //某些操作
})();

虽然上面的代码看着不够直观,稍加阅读还是可以理解的,JavaScript里就经常这么干。

总结

以上就是我对用户验证部分代码如何写才算优雅的一些想法。实际工程应用中是怎么搞的我并不知道(知道的快跟我说说),欢迎拍砖。

That's all, But not ALL.