<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum CakePHP.org.pl - Gdzie acl->check()]]></title>
		<link>http://forum.cakephp.org.pl/topic/27/gdzie-aclcheck/</link>
		<description><![CDATA[Najświeższe odpowiedzi w Gdzie acl->check().]]></description>
		<lastBuildDate>Tue, 24 Mar 2009 15:05:37 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/229/#p229</link>
			<description><![CDATA[<div class="quotebox"><cite>duke_piotr napisał/a:</cite><blockquote><p>Wracajac do pytania:&nbsp; to jak sprawdzic uprawnienia w modelu (np w beforeSave) ??:D.</p></blockquote></div><p>Napisalem ze takiego behaviora w fazie alpha wrzuce wieczorem.</p><br /><div class="quotebox"><cite>duke_piotr napisał/a:</cite><blockquote><p>pytanie czy warto obciazac aplikację jezeli przyczny (uprawnienia hiper usera) i tak sie nie da usunac, a w przypadku odkrycia bledu (czy tak czy siak odkryjemy to w tym samym czasie) zabijamy mu sesje i zmieniamy prawa (to moze wydajniej bylo by zrobic funkcje zabijajaca sesje konkretnemu userowi niz wpychac wszedzie na sile sprawdzanie praw ?? ).</p></blockquote></div><p>Nic nie obciazasz sprawdzajac w ten sposb, obojetnie czy masz 10 czy 1000 uzytkownikow. Po to zostaly wymyslone systemu cachowania zeby odciazyc aplikacjie , wsytraczy uzyc memcached + apc i nie bedziesz widziec roznicy i przy 100 000 uzytkownikow online naraz.</p><p>Poza tym kurde w kłejku nieumiejetnie uzyc asocjacji&nbsp; lub uzywac w widokach i kontrolerach&nbsp; requestAction&nbsp; zeby zamulic aplikacje.</p>]]></description>
			<author><![CDATA[null@example.com (robal77)]]></author>
			<pubDate>Tue, 24 Mar 2009 15:05:37 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/229/#p229</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/228/#p228</link>
			<description><![CDATA[<p>Wracajac do pytania:&nbsp; to jak sprawdzic uprawnienia w modelu (np w beforeSave) ??:D</p><p>Nie chce sie klocic tak tylko teoretyzuje ;] <br />Twoje rozwiazanie (nie trzymania w sesji uprawnien) ma faktycznie zalety - pytanie czy warto obciazac aplikację jezeli przyczny (uprawnienia hiper usera) i tak sie nie da usunac, a w przypadku odkrycia bledu (czy tak czy siak odkryjemy to w tym samym czasie) zabijamy mu sesje i zmieniamy prawa (to moze wydajniej bylo by zrobic funkcje zabijajaca sesje konkretnemu userowi niz wpychac wszedzie na sile sprawdzanie praw ?? ).</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Tue, 24 Mar 2009 14:30:21 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/228/#p228</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/227/#p227</link>
			<description><![CDATA[<p>@duke_piotr co by bylo jasniej, jezeli dane o uprawnieniach beda zapisywane do sesji, po zalogowaniu sie i dasz komus tego super hiper admina, a ten sie zaloguje ... nie zmienisz tego, puki delikwent sie nie wyloguje - o ile bedziesz swiadom tego faktu to mozesz zabic sesje delikwenta. W przypadku zmian w czasie rzeczywistym mozesz odebrac delikwentowi uprawnienia, wprost z aplikacji, zanim ten zdazy kliknac na cokolwiek.</p><p>Tak jak pisalem wczesniej, kontrola dostepu do rekordow powinna spoczywac na behaviorze lub modelu a nie na kontrolerze, wieczorem wrzuce pierwsza wersje alpha takiego beaviora ....</p>]]></description>
			<author><![CDATA[null@example.com (robal77)]]></author>
			<pubDate>Tue, 24 Mar 2009 09:29:53 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/227/#p227</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/226/#p226</link>
			<description><![CDATA[<div class="quotebox"><cite>robal77 napisał/a:</cite><blockquote><p>Nie. Dlatego ze raz zapisanych do sesji uprawnien nie dasz rady zmienic w czasie rzeczywistym. Zalozmy ze blednie nadasz uzytkowniki uprawnienia super hiper admina, ten sie zaloguje ... i po ptakach <img src="http://forum.cakephp.org.pl/img/smilies/wink.png" width="15" height="15" alt="wink" /></p></blockquote></div><p>Troche sie pozmienialo i juz nie aktualne (w tym watku jest bardziej aktualne pytanie o kontroler w ACL <img src="http://forum.cakephp.org.pl/img/smilies/smile.png" width="15" height="15" alt="smile" /> ) wiec sie tylko uczepie odpowiedzi <img src="http://forum.cakephp.org.pl/img/smilies/tongue.png" width="15" height="15" alt="tongue" /></p><p>Jezeli blednie nadam komus prawa to i tak dupa czyz nie? Bo jezeli blednie nadalem tutaj to i na 99% blednie jest wszedzie indziej wiec jak dupa to dupa. W twoim przypadku to raczej chodzi o dodatkowe zabezpieczenie hiper admina zeby jezeli juz sie cos takiego wydarzy to zeby bylo jakies dodatkowe zabezpieczenie -&gt; tutaj wchodzi ACL i dodatkowe sposoby uwiezytelniania (PHP_AUTH_USER czy cos).</p><p>PS: co sadzisz o przykladowym kontrolerze z nowszego pytania z gory ??:D</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Tue, 24 Mar 2009 09:12:55 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/226/#p226</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/222/#p222</link>
			<description><![CDATA[<div class="quotebox"><cite>duke_piotr napisał/a:</cite><blockquote><p>(1) podczas logowania zapisywanie do zmiennej session calej tabeli praw dostepu czy tez</p></blockquote></div><p>Nie. Dlatego ze raz zapisanych do sesji uprawnien nie dasz rady zmienic w czasie rzeczywistym. Zalozmy ze blednie nadasz uzytkowniki uprawnienia super hiper admina, ten sie zaloguje ... i po ptakach <img src="http://forum.cakephp.org.pl/img/smilies/wink.png" width="15" height="15" alt="wink" /></p><div class="quotebox"><cite>maciek napisał/a:</cite><blockquote><p>Chciałbyś wykorzystywać ACL&#039;a do ustawiania dostępu do każdej wywoływanej metody w modelu ?? <img src="http://forum.cakephp.org.pl/img/smilies/smile.png" width="15" height="15" alt="smile" /> Listy kontroli dostępu wykorzystuje się na wyższym poziomie niż dostęp do bazy BD. Świetnie spisuje się przy określaniu dostępu do kontrolerów i ich akcji.</p></blockquote></div><p>Niekoniecznie, ACL w kłejku jest troche kulawy. Załóżmy że masz tabele gdzie rekordy są dzielone pomiędzy użytkownikami np :</p><p>tabela datas : <br />id&nbsp; &nbsp; field_1, field_2, ........, field_n<br />1&nbsp; &nbsp; &nbsp;........., .........., ........, .........<br />2&nbsp; &nbsp; &nbsp;........., .........., ........, .........<br />3&nbsp; &nbsp; &nbsp;........., .........., ........, .........<br />4&nbsp; &nbsp; &nbsp;........., .........., ........, .........<br />5&nbsp; &nbsp; &nbsp;........., .........., ........, .........</p><p>mamy 3 userow : user1 , user2, user3</p><p>przypadek 1.<br />this-&gt;Data-&gt;find(&quot;all&quot;) dla usera 1&nbsp; powinien zrocic rekordy o id 1,2,3 (user1 posiada uprawnienia R dla rekordow 1,2,3)<br />this-&gt;Data-&gt;find(&quot;all&quot;) dla usera 2&nbsp; powinien zrocic rekordy o id 2,4,5 (user2 posiada uprawnienia R dla rekordow 2,4,5)<br />this-&gt;Data-&gt;find(&quot;all&quot;) dla usera 3&nbsp; powinien zrocic rekordy o id 1,5 (user3 posiada uprawnienia R dla rekordow 1,5)</p><p>przypadek 2.<br />przy probie aktualizacji , odczytu, usuniecia&nbsp; przez user 1 rekordu o id 4 lub 5 - model powinien zwrocic blad informujacy o niedostacznyc uprawnieniach. Tak samo sprawa wyglada przy aktualizacji wile rekordow naraz.</p><p>itd ...</p><p>Moim zdaniem to wlasnie zadanie dla ACL&#039;a - ktorego brak w kłekowej implementacji ww, oczywiscie da sie to osiagnac i w tej chwili wprowadzajac dodatkowe tabele&nbsp; lub filtrujac z wykorzystaniem ACL&#039;a wyniki dowolnego zapytania (SELECT) , lub sprawdzajac uprawnienia (DELTE,UPDATE, REPLACE), ale powinno to byc zrobione automagicznie przez model / behavior.</p><p>Ewentualnie taka częśc logiki powinna być osadzona w bazie danych ( nie wiem czy to możliwe np w przypadku mysql).</p>]]></description>
			<author><![CDATA[null@example.com (robal77)]]></author>
			<pubDate>Mon, 23 Mar 2009 17:48:23 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/222/#p222</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/211/#p211</link>
			<description><![CDATA[<p>w sumie to malem pomysl tylko z uzyciem tego w modelu w wypadku save() i delete() zeby przed kazdym wywolaniem sprawdzac czy osoba ktora to robi ma do tego prawo ;]</p><p>PS: a tak na marginesie jak to robicie w praktyce bo ja to chodze po omacku niestety i mam cos takiego:</p><p>przykladowy kontroler:</p><p>&nbsp; &nbsp; function beforeFilter() {<br />&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;checkSession();<br />&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;aroAlias = &#039;User::&#039;.$this-&gt;Session-&gt;read(&#039;User.id&#039;);<br />&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;acoAlias = $this-&gt;Project-&gt;name;&nbsp; &nbsp; <br />&nbsp; &nbsp; }</p><p>&nbsp; &nbsp; function show($id = false) {<br />&nbsp; &nbsp; &nbsp; &nbsp; if($id &amp;&amp; is_numeric($id)) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $tempAro = $this-&gt;aroAlias;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $tempAco = $this-&gt;acoAlias.&#039;::&#039;.$id;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if($this-&gt;Acl-&gt;check($tempAro, $tempAco, &#039;read&#039;)) { <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;data = $this-&gt;Project-&gt;findById($id);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;redirect(&#039;user/login&#039;);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;data = $this-&gt;Project-&gt;findById($id);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />:koniec</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Fri, 20 Mar 2009 09:25:27 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/211/#p211</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/207/#p207</link>
			<description><![CDATA[<p>Chciałbyś wykorzystywać ACL&#039;a do ustawiania dostępu do każdej wywoływanej metody w modelu ?? <img src="http://forum.cakephp.org.pl/img/smilies/smile.png" width="15" height="15" alt="smile" /> Listy kontroli dostępu wykorzystuje się na wyższym poziomie niż dostęp do bazy BD. Świetnie spisuje się przy określaniu dostępu do kontrolerów i ich akcji.</p>]]></description>
			<author><![CDATA[null@example.com (maciek)]]></author>
			<pubDate>Fri, 20 Mar 2009 07:48:49 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/207/#p207</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/206/#p206</link>
			<description><![CDATA[<p>A szkoda bo jest cos takiego jak beforeSave ;]</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Thu, 19 Mar 2009 12:35:46 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/206/#p206</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/203/#p203</link>
			<description><![CDATA[<p>ACL to component -&gt; wykorzystuje się go w controllerze i tam powinno odbywać się sprawdzanie praw;</p>]]></description>
			<author><![CDATA[null@example.com (maciek)]]></author>
			<pubDate>Thu, 19 Mar 2009 08:20:54 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/203/#p203</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/199/#p199</link>
			<description><![CDATA[<p>Da się jakos sprawdzic prawa w modelu? Cos na styl:</p><p>Model:<br />function saveData() {<br /> if($this-&gt;acl-&gt;check(%$^$%^%^%^))<br />&nbsp; &nbsp;$this-&gt;save();<br />}</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Wed, 18 Mar 2009 10:55:08 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/199/#p199</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/87/#p87</link>
			<description><![CDATA[<p>Uuuu spora odpowiedz.. dzieki ale potrzebuje sie z nia blizej zapoznac aby cos odpowiedziec ;] Nie omieszkam tego zrobic jak przetestuje Twoj sposob ;]</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Mon, 15 Dec 2008 08:45:13 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/87/#p87</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/86/#p86</link>
			<description><![CDATA[<p>Cześć,</p><p>Można np. zapisać dane logowania do zmiennej przechowywanej sesji po zalogowaniu, a potem w app_controller.php, w akcji beforeFilter() /* metoda wywoływana dla każdej akcji w każdym kontrolerze*/ sprawdzać istnienie tej zmiennej przez if($this-&gt;Session-&gt;check(&#039;logged_user&#039;)){...}. Dla niektórych akcji sprawdzanie tej zmiennej może spowodować zapętlenie się apache&#039;a, więc trzeba zadbać o to, żeby część z metod mogła być wywoływana przez niezalogowanego user&#039;a (m. in. metoda logowania , i wylogowania oraz index dla niezalogowanego user&#039;a). Wyjaśnię to może na przykładzie (niestety nie będzie to przykład stricte ACL, bo nie jestem przy swoim komputerze i muszę pisać z głowy <img src="http://forum.cakephp.org.pl/img/smilies/hmm.png" width="15" height="15" alt="hmm" /> ).</p><p>Załóżmy, że masz 3 kontrolery, users_controller, app_controller oraz pages_controller.</p><p>w app_controller masz tylko funkcję wyglądającą mniej więcej tak:<br /></p><div class="codebox"><pre><code>function beforeFilter(){
        if($this-&gt;Session-&gt;check(&#039;user&#039;) == false)
            {
                //co zrobic z niezaqlogowanym  userem
               //np, przekierować go na index
                 $this-&gt;redirect(&#039;/pages/index&#039;)
            }else{
                   $user=$this-&gt;Session-&gt;read(&#039;user&#039;);
                        //co zrobić z zalogowanym userem
            }
    }</code></pre></div><p>Wszystko ok, tylko jeśli komuś wygaśnie sesja, to cake będzie go próbował przekierować na stronę główną, na której sprawdzane jest jeszcze raz czy jest zalogowany (metoda beforeFilter w app_controller nadal działa) i mamy pętlę gotową. Jak temu zapobiec? Bardzo prosto <img src="http://forum.cakephp.org.pl/img/smilies/smile.png" width="15" height="15" alt="smile" /></p><p>Trzeba w kontrolerze pages_controller.php przedeklarować metodę beforeFilter (Cake najpierw wykonuje metodę w kontrolerze niższego rzędu, po czym, jeśli jej tam nie znajdzie przechodzi wyżej. A więc, w kontrolerze pages_controller dodajemy metodę:<br /></p><div class="codebox"><pre><code>function beforeFilter(){
                if(in_array($this-&gt;action,$allowed_actions)){
                       //nie jest sprawdzane czy user jest zalogowany
                }else{
                      //wywołujemy akcję beforeFilter z kontrolera nadrzędnego (sprawdzamy czy user jest zalogowany)
              parent::beforeFilter();
                }
    }</code></pre></div><p>No dobrze, ale skąd wziąć zmienną $allowed_actions? Trzeba ją zdefiniować jako tablicę stringów oznaczających akcje dla których nie trzeba być zalogowanym.<br />W wypadku pages controller będzie to:<br /></p><div class="codebox"><pre><code>var $allowed_actions = array(&#039;index&#039;);</code></pre></div><p>W users controller pewnie coś w stylu:<br /></p><div class="codebox"><pre><code>var $allowed_actions = array(&#039;login&#039;,&#039;logout&#039;,&#039;register&#039;);</code></pre></div><p>To chyba wystarczy aby sprawdzanie credentials działało szybko i przejrzyscie, bez konieczności zbędnego mieszania w kodzie w wypadku ewentualnych poprawek.</p><p>Mam nadzieje że napisałem w miarę jasno. Kod może zawierać błędy, bo piszę z głowy.</p><p>Pzdr,</p>]]></description>
			<author><![CDATA[null@example.com (darek_dobron)]]></author>
			<pubDate>Fri, 12 Dec 2008 21:29:32 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/86/#p86</guid>
		</item>
		<item>
			<title><![CDATA[Gdzie acl->check()]]></title>
			<link>http://forum.cakephp.org.pl/post/85/#p85</link>
			<description><![CDATA[<p>Hej, mam pytanko: </p><p>Pytanie: z waszego doswiadczenia gdzie uzywacie sprawdzania czy klient ma prawo dostepu?</p><p>Opis: Postanowilem srobowac swoich sil z ACL i chyba zalapalem oco biega. Do testow stworzylem mala testowa stronke z mozliwoscia logowania i powstal problem.<br />Czy efektywnie jest <br />(1) podczas logowania zapisywanie do zmiennej session calej tabeli praw dostepu czy tez <br />(2) podczas wywolywania kazdej funkcji w dowolnym kontrolerze sprawdzac prawa a moze <br />(3) w modelu przed uzyciem funkcji save albo gdzies zrobic warunek sprawdzajacy, czy tez <br />(4) polaczyc dwie metody i zapisac prawa i sprawdzac w zmiennej czy ktos ma prawa w kontrolerze lub <br />(5) inaczej ??:P</p>]]></description>
			<author><![CDATA[null@example.com (duke_piotr)]]></author>
			<pubDate>Fri, 12 Dec 2008 11:06:37 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/85/#p85</guid>
		</item>
	</channel>
</rss>

