parserALT
Страницы форума: ← Назад | 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 600 | Дальше →

Как отменить дальнейшее выполнение через auto.p ?

#1JustDoit
16.06.10 23:47 / 23:52
www.parser.ru → | ответить → | в избранное →

Как отменить дальнейшее выполнение через auto.p ?

Так сложилось что хотелось по-быстрому (без классов авторизаций и прочего) разрулить парсером доступ на различные части веб-интерфейса. Хотелось использовать встроенный механизм собирать иерархию auto.p и по аналогии с .htaccess хотел заюзать это. Такая примерно структура файлов:
/auto.p
/index.html

/web_admin/auto.p
/web_admin/index.html

/web_user/auto.p
/web_user/index.html	


Есть и БД, и форма логина в морде сайта и прочее, при авторизации
устанавливаются свои глобальные переменные
$GL_login, $GL_group, $GL_name ...

При успешном входе, пользователя редиректит в его кабинет в зависимости от его $GL_group, то есть если это admin, то в /web_admin/ как бы все ок,
при выходе редиректит на главную. Если принудительно зайти в папку
то исполнения кода все равно будет в контексте пользователя и ничего не исполнит, но чтобы не было никаких некрасивых сообщений
я хотел, чтобы пользователь который зашел не в свой кабинет "беззвучно" редиректился на главную по инструкции в auto.p, но понял, что код все равно исполняется... дальше доконца.

не вдаваясь в динамические подробности по сути код таков:
# /web_admin/auto.p
#
^if($GL_group ne 'admin'){
			    $response:location[/]
			  }
#


то есть если зашедший в раздел /web_admin/ не имеет $GL_group='admin' то его тело ответа должно было бы переопределиться на редирект 304 или какой то там...
однако код дальше исполняется в index.html этой же папки
цепляя весь фарш кода для кабинета админа, но находясь
в контексте другого GL_group конечно имеет 0 записей
из БД и ругается уже другими модулями. А мне хотелось бы
как то заюзать auto.p чтобы завернуть код накорню в другую степь
и средиректить его.

P.S.: Я понимаю что могу это разруливать в index.html, но проблема в том, что *.html не одна а десяток, и дописывать какую-то обертку к каждому *.html внутри как то не кошерно.
#2Vint
→ JustDoit [#1] | 17.06.10 00:10
www.parser.ru → | ответить → | в избранное →
Весь код с авторизацией оборачиваете во что-то подобное:
^try{
	весь код с авторизацией (классы/методы) и т.д.
	^if($GL_group ne 'admin'){
		(типов ошибок может быть сколько угодко...)
		^throw[access denied;/]
	}
}{
	(... обработчиков тоже)
	^if($exception.type eq 'access denied'){
		$response:location[$exception.source]
		[code]и всё что ещё захотите

}
}[/code]
#3JustDoit
→ Vint [#2] | 17.06.10 21:33 / 21:33
www.parser.ru → | ответить → | в избранное →

Это не то, про что я спросил

Как обернуть сам код "мягко" или try-еем я и сам знаю.
Мне интересен вопрос, могу ли я остановить/перенаправить действие интерпретатора именно на стадии auto.p? то есть чтобы не выполнился код написанный в вызываемом .html
#4Vint
→ JustDoit [#3] | 17.06.10 22:23
www.parser.ru → | ответить → | в избранное →
Точно также: try/catch.

Вызов main метода класса MAIN неизбежен, если до этого не вывалиться в exception.
#5Sumo
→ JustDoit [#3] | 17.06.10 22:24
www.parser.ru → | ответить → | в избранное →

Просто @main прописывайте в auto.p, а в index.html только @body и пр...

... тогда все сведется к простому:
auto.p
@main[]
  ^if(пользователь авторизован){
     ^title[]
     ^body[]
    ...
  }{
     $response:location[/]
   }
#6JustDoit
→ JustDoit [#3] | 18.06.10 00:12
www.parser.ru → | ответить → | в избранное →

всем спасибо - @main - ответ на вопрос

#7JustDoit
→ JustDoit [#6] | 18.06.10 00:15
www.parser.ru → | ответить → | в избранное →

Re: всем спасибо - @main + try - ответ на вопрос

#8JustDoit
→ Vint [#2] | 18.06.10 00:16
www.parser.ru → | ответить → | в избранное →

Я не сразу понял, это отличный ответ то что надо!

#9JustDoit
→ JustDoit [#8] | 18.06.10 00:45
www.parser.ru → | ответить → | в избранное →

При том надо кстати добавить, что так пример не работает, надо...

# auto.p
@auto[]
^try{
	^if($GL_group ne 'admin'){
				   ^throw[access_denied;authform]
				}
}{ 
# ниче тут не надо, надо ловить access_denied в 
# @unhandled_exeption
# и уже там делать $response:location[/]
# потому, что если сделать тут, то чтобы оно "как бы сработало"
# надо еще добавить $exception.handled(true) 
# но в таком случае метода @main не избежать, поэтому так

 }


правильно же..?
#10Misha v.3
→ JustDoit [#9] | 18.06.10 08:02
www.parser.ru → | ответить → | в избранное →
возможны варианты:
- лично я бы авторизацию вообще в @auto не помещал бы, а добавил бы метод-обёртку в @main. но это в общем ваше дело.

- не обрабатывать исключение в @auto, а делать это в @unhandled_exception (как вы сами догадались). мне такой подход не нравится, т.к. с моей точки зрения, @unhandled_exception предназначен немного не для этого.

- можно перехватывать исключение, обрабатывать, и выставлять какой-нить флаг, глядя на который @main не будет отрабатываться (ага, там добавить проверку).

- а можно при обработке исключения... перезаписывать @main (читать про ^process) на новый, который и будет показывать "403. Access Denied"


P.S. если не обрабатываете исключение, то и try не нужен :)
#11
→ Misha v.3 [#10] | 18.06.10 15:29
www.parser.ru → | ответить → | в избранное →
Да, @auto удобмен тем, что он собирается иерархически, то есть удобно ставить авторизацию на всю папку и все что внутри. А с методом-оберткой согласен я бы тоже так сделал и сделаю в будущем, но сейчас просто надо было корректно "пропатчить" очень много наплодилось html-ек. Про переопределение @main ^process-ом это весело, но как крайний метод когда уж совсем по-другому никак. На самом деле у меня есть ключевой метод ^template
и он все собирает в кучу, вот его и надо подправить К слову говоря Parser по сути нативный шаблонизатор если так посудить, по стилю того, что всё есть print, а код между html то Парсер это мощнейший шаблонизатор-язык
#12Misha v.3
18.06.10 16:02
www.parser.ru → | ответить → | в избранное →
по поводу переопределения @main -- я говорил серьёзно.
ведь там не обязательно писать весь код, можно сделать просто:

auto.p
^try{
	...
}{
	^if($exception.type eq "access.denied"){
		$exception.handled(true)
		^process{^@main[]^#0A^^access_denied[]^#0A}
	}
}


и всё. исключение перехвачено и @main[] переопределён, т.е. он не выполнится.

по моему это лучше чем в @unhandled_exception огород городить.
#13Vint
18.06.10 19:58
www.parser.ru → | ответить → | в избранное →
Миша хорошо придумал с переопределением @main[]. В вашей ситуации скрорее всего так и стоит поступить.

В свою очередь, я бы не допускал такой запутанной структуры с кучей html и auto.p, а пошёл бы от обратного:
Apache mod_rewrite -> перенаправление всех запросов к одному файлу (/index.html, например) -> а в нём уже выполнение любой структуры с подключением нужных классов.

Тогда весь @main[] в index.html можно обёрнуть в try/catch с перехватом ошибок и флагом handled(true) (запыл про него написать в первом сообщении).
Страницы форума: ← Назад | 1 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 600 | Дальше →