如何在owncloud上拦截和重定向每个请求

时间:2014-07-19 21:08:36

标签: redirect owncloud

我在owncloud 7.0上遇到了一个简单的问题

我正在创建一个应用程序,必须检查条件并重定向到页面以验证某些内容。我的目标是在条件合适之前禁用服务使用。

在名义场景中,用户登录,如果未验证条件,系统会将用户重定向到验证页面。所以我使用postLogin钩子。

但是如果用户尝试在没有验证的情况下更改页面,我必须抓住他并将其重定向回验证页面。

我尝试过中间件(owncloud interceptor),但它们不是全局的,所以第二种情况失败了。

现在我正在处理app加载并执行类似

的操作
 $app = new MyApp();
 $c = $app->getContainer();
 if ( $c->isLoggedIn() ) {
    $requestedPath = path($_SERVER['REQUEST_URI']);
    $redirectPath = $c->getServer()->getURLGenerator()->linkToRoute('myapp.page.validate');
    $refererPath  = path($_SERVER['HTTP_REFERER']);

    if ( $requestedPath !== $redirectPath && $redirectPath !== $refererPath ) {
        $location = $c->getServer()->getRouter()->generate('myapp.page.validate');
        header('Location: ' . $location);
        exit();
    }
 }

function path($url) {
    $urlArray = parse_url($url);
    return $urlArray['path'];
}

它适用于第一种情况,但我在第二种情况下进行了几次重定向。 我认为它必须存在更好的解决方案。有人有想法吗?

PS:我已经在IRC频道曝光了我的案例而没有成功让某人感兴趣:)

1 个答案:

答案 0 :(得分:2)

如果您已在appinfo/app.php中将应用注册为authentication,则可以使用appinfo/info.xml执行此操作。这应该基本上看起来像下面的代码,但这显然需要进一步调整您的用例。

info.xml:

<?xml version="1.0"?>
<info>
    <id>appname</id>
    <name>Appname</name>
    <description>Lorem Ipsum.</description>
    <licence>AGPL</licence>
    <author>Your Name</author>
    <require>6.0.3</require>
    <types>
        <authentication/>
    </types>
</info>

app.php:

<?php
namespace OCA\appname\AppInfo;
use \OCP\User;

/**
 * Implement your code here
 * @return bool
 */
function conditionMatch() {
    return true;
}

// Intercept all requests which have not already been matched
if ($_SESSION['alreadyMatched'] !== true) {
    if(conditionMatch()) {
        $_SESSION['alreadyMatched'] = true;
    } else {
        // The session has not met the condition - enter your code here
        exit();
    }
}