【问题标题】:The correct approach to the authorization正确的授权方式
【发布时间】:2014-01-15 22:56:28
【问题描述】:

我需要重新制作一个网站。它有一些 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";
}


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

【问题讨论】:

  • 为什么这个标签是 [php]?
  • 您不应该将requiredo Perl 脚本相互转换。那真的很旧,会给您带来严重的维护麻烦。您可能想查看 Web 框架 Dancer 或 Mojolicious,或者考虑 Web::Simple(更容易部署但更难理解)。如果这些都不是一个选项,您是否使用 CGI.pm 和 CGI​​::Session?
  • @Wooble 为什么不呢?这不是 PERL 问题,这是关于 perl 和 php 相似的授权方法的问题。
  • @simbabque 是的,我两个都用。
  • 那为什么不去掉 Perl 代码,用英语重写,并标记语言不可知论呢?我在这里看不到任何关于 PHP 的信息。

标签: html session language-agnostic authorization


【解决方案1】:

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

就机制而言,这正是你应该做的。检查每个需要授权的页面的会话。天气好坏取决于你的代码。

一般来说,大多数程序员所说的“坏代码”是指增加犯错倾向的代码。例如,重复的代码往往会迫使您在修复错误或修改代码时进行搜索和替换编程。因此,如果在每个页面中您都在执行以下操作:

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
    }
});

一些框架做相反的事情,假设除非明确禁用,否则需要身份验证:

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');
    }
}

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 2016-01-22
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2019-06-23
    • 2019-04-17
    相关资源
    最近更新 更多