【问题标题】:Prevent direct access to a page in Joomla防止直接访问 Joomla 中的页面
【发布时间】:2012-07-03 18:37:41
【问题描述】:

我的网站上集成了一个支付网关。当用户完成付款后,他/她将被重定向到特定页面,例如 www.example.com/redirect。我想阻止用户直接在地址栏中输入此网址(www.example.com/redirect)并访问该页面。我要尽快。

实际上,该页面受到访客用户的保护,但如果登录用户键入该 url,那么它会将他重定向到该页面,因此将跳过付款选项。我希望用户必须先支付金额,然后再重定向到此页面。

【问题讨论】:

    标签: joomla


    【解决方案1】:

    很难准确回答,因为您只给出了一个非 joomla 网址作为示例,但每个 Joomla 脚本的顶部都是以下行:

    defined('_JEXEC') or die( 'Restricted access' );
    

    您显然无法阻止用户输入 url,因此这至少可以检测会话是否已经存在。如果用户不在活动的 Joomla 会话中,这将触发并阻止访问。您可以轻松地调整它以根据您的要求执行任何您想做的事情,具体取决于您必须检查的内容,即推荐人是否是您的支付网关等。

    【讨论】:

    • 实际上该页面受到访客用户的保护,但如果登录用户键入该 url,那么它会将他重定向到该页面,因此将跳过付款选项。我希望用户必须先支付金额然后重定向到此页面
    【解决方案2】:

    我也有类似的愿望。我希望该页面仅在用户登录并填写订单输入页面时显示。

    我决定做的是检查 POST 中是否有数据。

    controller/place_order.php (snipet)

    public function submitOrder()
    {
        $post = JRequest::get('post');
        $model = $this->getModel();
        if($post != null && $post != ''){
            if($model->placeOrder()){
            }
        }
        JRequest::setVar('layout', 'submitOrder');
        parent::display();
    }
    

    这可以防止任务执行我的 placeOder 函数模型中的任何内容。然后我只添加类似于提交订单页面的内容。在你的情况下“重定向”。

    查看/place_order/tmpl/submitOrder.php (snipet)

    defined('_JEXEC') or die('Restricted access');
    
    $user =& JFactory::getUser();
    
    if ($user->guest) {
    echo "<p>You must login to access this page.</p>";
    } 
    else if($_POST == "" || $_POST == null){
        echo "<p>You can not directly access this page.</p>";
    }else {
    //Your order was submitted successfully HTML (don't forget to close it at the bottom ;)
    

    有很多方法可以做到这一点...如果您不想检查控制器,您可能甚至不需要检查控制器,但我这样做是为了节省时间。如果没有看到您的代码,很难定制答案,但如果您在这里掌握了这个概念,它应该会有所帮助(我希望......)。

    您可能还想从Joomla on authorization and privileges.查看此页面

    【讨论】:

      【解决方案3】:

      这应该在组件的基本控制器 (controller.php) 中完成。如果你看这段代码sn-p:

      // Check for edit form.
      if ($vName == 'form' && !$this->checkEditId('com_weblinks.edit.weblink', $id))
      {
          // Somehow the person just went to the form - we don't allow that.
          return JError::raiseError(403, 
          JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id));
      }
      

      这个代码块存在于大多数核心组件中,旨在完全按照您的意愿行事。 $this-&gt;checkEditId() 函数解释了它实际上是如何做的。我希望您熟悉 JControllerForm 类,如果您不了解 API。因为为页面创建编辑 ID 并“根据用户的最后一页授权用户访问特定页面”是由 JControllerForm 完成的。

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2018-04-24
        相关资源
        最近更新 更多