正确的授权方法

时间:2014-01-14 14:06:49

标签: html session language-agnostic authorization

我需要重拍一个网站。它有一些pl和一些html文件。问题是我不知道如何更好地使用这种结构进行授权。

当然我可以检查每一页的会话变量,但它不是很好,对吧?

另一种观点是尝试加载所有文件抛出一个索引文件结构的开关。像这样:

if ($authorised eq 'true') 
{
 switch($mode) {
  case 'one': { do "one.pl"; }
  case 'two': { do "two.pl"; }
  .....
  default : { print 'some went wrong'; }
 }
}
else
{
 do "login.pl";
}


也许有任何方法可以让我做我想做的事情,而无需检查所有文件中的授权,也不会像第二个建议那样制作结构。

1 个答案:

答案 0 :(得分:2)

  

当然我可以检查每个页面中的会话变量,但它不是很好,对吧?

在力学方面,这正是你应该做的。检查会话以查找需要授权的每个页面。天气与否你编码的好坏取决于你是如何做的。

通常,通过“错误代码”,大多数程序员意味着代码会增加出错的倾向。例如,重复代码在修复错误或修改代码时会强迫您执行搜索和替换编程。因此,如果在每个页面中您执行的操作如下:

if ( session.auth ) {
    render_page();
}
else {
    redirect_to_login();
}

然后是的,这确实是错误的编码。

(请注意,上面的代码和以下所有代码都是来自各种语言的伪代码借用语法,以最小的噪音呈现这个想法)

大多数人倾向于将授权代码分解为模块,库或类,并将其用于每个页面。所以该模块可能看起来像:

class Auth {
    static function init (session) {
        if ( ! session.auth ) redirect_to_login();
    }
}

在每个页面的顶部,您可以执行以下操作:

require Auth::init(session);

某些框架变得更加花哨,并在调度程序中执行授权。您基本上将所有控制器和视图写为好像没有授权,但在调度程序中您标记了需要授权的特定页面:

App.dispatch({
    '/' : 'Index',
    '/login' : 'Login',
    '/mail' : {
        controller : 'Mail',
        auth : true // requires authorization
    },
    '/send' : {
        controller : 'Mail',
        command : 'send',
        auth : true
    }
});

一些框架则相反,假设除非明确禁用,否则需要auth:

App.dispatch({
    '/' : {
        controller : 'Index',
        noauth : true
    },
    '/login' : {
        controller 'Login',
        noauth : true
    },
    '/mail' : 'Mail',
    '/send' : 'Mail.send'
});

在某些语言中,框架可以变得更加漂亮。例如Perl允许您将属性附加到函数,以便您基本上可以标记函数以指示它需要授权。所以你基本上可以编写类似这样的代码:

function index :web () {
    return render('index.html');
}

function mail :web :auth (query) {
    return render('mail.html', mail.fetch(query.page||0));
}

没有调度程序(或使用自动调度)的框架的另一种替代方法是声明需要在模块/类顶部进行授权的页面列表:

class MailController inherits WebApp::Controller {
    require_auth = [ 'index', 'send' ];

    function index () {
        return render('mail.html');
    }

    function send (query) {
        new Mail.send(query.to,query.body);
        return render('sent.html');
    }
}