我在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频道曝光了我的案例而没有成功让某人感兴趣:)
答案 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();
}
}