<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum CakePHP.org.pl - Gdzie acl->check()]]></title>
	<link rel="self" href="http://forum.cakephp.org.pl/feed/atom/topic/27/"/>
	<updated>2009-03-24T15:05:37Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.cakephp.org.pl/topic/27/gdzie-aclcheck/</id>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/229/#p229"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[robal77]]></name>
				<uri>http://forum.cakephp.org.pl/user/143/</uri>
			</author>
			<updated>2009-03-24T15:05:37Z</updated>
			<id>http://forum.cakephp.org.pl/post/229/#p229</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/228/#p228"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-03-24T14:30:21Z</updated>
			<id>http://forum.cakephp.org.pl/post/228/#p228</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/227/#p227"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[robal77]]></name>
				<uri>http://forum.cakephp.org.pl/user/143/</uri>
			</author>
			<updated>2009-03-24T09:29:53Z</updated>
			<id>http://forum.cakephp.org.pl/post/227/#p227</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/226/#p226"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-03-24T09:12:55Z</updated>
			<id>http://forum.cakephp.org.pl/post/226/#p226</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/222/#p222"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[robal77]]></name>
				<uri>http://forum.cakephp.org.pl/user/143/</uri>
			</author>
			<updated>2009-03-23T17:48:23Z</updated>
			<id>http://forum.cakephp.org.pl/post/222/#p222</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/211/#p211"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-03-20T09:25:27Z</updated>
			<id>http://forum.cakephp.org.pl/post/211/#p211</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/207/#p207"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[maciek]]></name>
				<uri>http://forum.cakephp.org.pl/user/6/</uri>
			</author>
			<updated>2009-03-20T07:48:49Z</updated>
			<id>http://forum.cakephp.org.pl/post/207/#p207</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/206/#p206"/>
			<content type="html"><![CDATA[<p>A szkoda bo jest cos takiego jak beforeSave ;]</p>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-03-19T12:35:46Z</updated>
			<id>http://forum.cakephp.org.pl/post/206/#p206</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/203/#p203"/>
			<content type="html"><![CDATA[<p>ACL to component -&gt; wykorzystuje się go w controllerze i tam powinno odbywać się sprawdzanie praw;</p>]]></content>
			<author>
				<name><![CDATA[maciek]]></name>
				<uri>http://forum.cakephp.org.pl/user/6/</uri>
			</author>
			<updated>2009-03-19T08:20:54Z</updated>
			<id>http://forum.cakephp.org.pl/post/203/#p203</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/199/#p199"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2009-03-18T10:55:08Z</updated>
			<id>http://forum.cakephp.org.pl/post/199/#p199</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/87/#p87"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2008-12-15T08:45:13Z</updated>
			<id>http://forum.cakephp.org.pl/post/87/#p87</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/86/#p86"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[darek_dobron]]></name>
				<uri>http://forum.cakephp.org.pl/user/39/</uri>
			</author>
			<updated>2008-12-12T21:29:32Z</updated>
			<id>http://forum.cakephp.org.pl/post/86/#p86</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Gdzie acl->check()]]></title>
			<link rel="alternate" href="http://forum.cakephp.org.pl/post/85/#p85"/>
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[duke_piotr]]></name>
				<uri>http://forum.cakephp.org.pl/user/31/</uri>
			</author>
			<updated>2008-12-12T11:06:37Z</updated>
			<id>http://forum.cakephp.org.pl/post/85/#p85</id>
		</entry>
</feed>

