2

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

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

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

但是,如果用户尝试更改页面而不进行验证,我必须抓住他并将其重定向回验证页面。

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

现在我正在处理应用程序加载并执行类似的操作

 $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 频道上曝光了我的案例,但没有成功引起某人的兴趣 :)

4

1 回答 1

2

appinfo/app.php如果您已将您的应用注册为 type authenticationin ,您或许可以使用appinfo/info.xml. 这基本上应该类似于以下代码,但是这显然需要针对您的用例进行进一步调整。

信息.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>

应用程序.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();
    }
}
于 2014-07-20T16:57:46.253 回答