Latest posts on Pyramid: Аутентификация с условием topichttp://python.su/forum/topic/15860/2012-10-17T17:15:40+03:00Веб-технологии :: Pyramid / Pylons / TurboGears :: Pyramid: Аутентификация с условием
2012-10-17T17:15:40+03:00sank94970<blockquote><em>ziro</em><br/>Делается примерно так: <a href="https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py">https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py</a><br/></blockquote><br/>Огромнейшее спасибо! То, что доктор прописал!<br/><br/>Кому актуально, сделал так:<br/>В общем добавил фабрику для рута своего, траверс прописал:<br/><div class="code"><pre> <span class="n">config</span><span class="o">.</span><span class="n">add_route</span><span class="p">(</span><span class="s">'client.view'</span><span class="p">,</span> <span class="s">'/clients/view/{id}'</span><span class="p">,</span> <span class="n">factory</span><span class="o">=</span><span class="n">ClientFactory</span><span class="p">,</span> <span class="n">traverse</span><span class="o">=</span><span class="s">'/{id}'</span><span class="p">)</span>
</pre></div>Потом рисуем фабрику, где строим ACL так, как нам нужно:<br/><div class="code"><pre><span class="k">class</span> <span class="nc">ClientFactory</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">__acl__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c"># здесь строим ACL в засисмости от ваших условий</span>
<span class="n">acl</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c"># тут ваши условия ... бла-бла :)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">group</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">acl</span> <span class="o">+=</span> <span class="p">[(</span><span class="n">Allow</span><span class="p">,</span> <span class="s">'admin'</span><span class="p">,</span> <span class="n">ALL_PERMISSIONS</span><span class="p">)]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">group</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="n">acl</span> <span class="o">+=</span> <span class="p">[(</span><span class="n">Allow</span><span class="p">,</span> <span class="s">'users'</span><span class="p">,</span> <span class="n">ALL_PERMISSIONS</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">acl</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span>
<span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">DBSession</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Client</span><span class="p">)</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="n">client</span><span class="o">.</span><span class="n">__parent__</span> <span class="o">=</span> <span class="bp">self</span>
<span class="n">client</span><span class="o">.</span><span class="n">__name__</span> <span class="o">=</span> <span class="n">key</span>
<span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span>
<span class="k">return</span> <span class="n">client</span>
</pre></div>
Веб-технологии :: Pyramid / Pylons / TurboGears :: Pyramid: Аутентификация с условием
2012-10-17T15:08:18+03:00ziro94964Делается примерно так: <a href="https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py">https://github.com/mmerickel/pyramid_auth_demo/blob/master/2.object_security/demo.py</a><br/>
Веб-технологии :: Pyramid / Pylons / TurboGears :: Pyramid: Аутентификация с условием
2012-10-17T14:42:30+03:00FishHook94961ЕМНИП это делается в роутинге с помощью фабрики
Веб-технологии :: Pyramid / Pylons / TurboGears :: Pyramid: Аутентификация с условием
2012-10-17T14:34:49+03:00sank94960Никак не могу на просторах нэта найти решение следующей проблемы:<br/>Использую встроенный Security механизм в пирамиде, как описано в туториале.<br/>Только мне нужно, чтобы юзера, роли и т.п. читались из базы данных.<br/>Тут вроде всё просто, всё работает, но теперь возникла проблемка - нужно проверять права не просто на весь view, а проверять права при срабатывании некоторых условий.<br/><br/>Например:<br/>У меня есть view, который отображает клиента.<br/>Переходим по ссылке <a href="http://localhost/client/58">http://localhost/client/58</a><br/>Внутри view выбираем клиента, смотрим какой он группе принадлежит.<br/>Если клиент принадлежит какой-то группе, то давать юзеру доступ, иначе не давать.<br/><br/>В пирамиде на весь view можно выдать права:<br/><div class="code"><pre><span class="nd">@view_config</span><span class="p">(</span><span class="n">route_name</span><span class="o">=</span><span class="s">'client.view'</span><span class="p">,</span> <span class="n">renderer</span><span class="o">=</span><span class="s">'../templates/client/view.pt'</span><span class="p">,</span> <span class="n">permission</span><span class="o">=</span><span class="s">'read'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">cview</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">cid</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">matchdict</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">DBSession</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Client</span><span class="p">)</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">cid</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">client</span><span class="o">=</span><span class="n">client</span><span class="p">)</span>
</pre></div><br/>А можно ли как-то красиво сказать пирамиде, чтобы она проверила ещё какой-то признак клиента, прежде чем решить вопрос доступности ресурса?