11import asyncio
2+ import enum
23
34from aiohttp import web
4- from aiohttp_security import (remember ,
5- authorized_userid , permits ,
6- AbstractAuthorizationPolicy )
75from aiohttp_security import setup as _setup
6+ from aiohttp_security import (AbstractAuthorizationPolicy , authorized_userid ,
7+ forget , has_permission , is_anonymous ,
8+ login_required , permits , remember )
89from aiohttp_security .cookies_identity import CookiesIdentityPolicy
910
1011
@@ -73,7 +74,27 @@ def check(request):
7374
7475
7576@asyncio .coroutine
76- def test_permits (loop , test_client ):
77+ def test_permits_enum_permission (loop , test_client ):
78+ class Permission (enum .Enum ):
79+ READ = '101'
80+ WRITE = '102'
81+ UNKNOWN = '103'
82+
83+ class Autz (AbstractAuthorizationPolicy ):
84+
85+ @asyncio .coroutine
86+ def permits (self , identity , permission , context = None ):
87+ if identity == 'UserID' :
88+ return permission in {Permission .READ , Permission .WRITE }
89+ else :
90+ return False
91+
92+ @asyncio .coroutine
93+ def authorized_userid (self , identity ):
94+ if identity == 'UserID' :
95+ return 'Andrew'
96+ else :
97+ return None
7798
7899 @asyncio .coroutine
79100 def login (request ):
@@ -83,11 +104,11 @@ def login(request):
83104
84105 @asyncio .coroutine
85106 def check (request ):
86- ret = yield from permits (request , 'read' )
107+ ret = yield from permits (request , Permission . READ )
87108 assert ret
88- ret = yield from permits (request , 'write' )
109+ ret = yield from permits (request , Permission . WRITE )
89110 assert ret
90- ret = yield from permits (request , 'unknown' )
111+ ret = yield from permits (request , Permission . UNKNOWN )
91112 assert not ret
92113 return web .Response ()
93114
@@ -121,3 +142,143 @@ def check(request):
121142 resp = yield from client .get ('/' )
122143 assert 200 == resp .status
123144 yield from resp .release ()
145+
146+
147+ @asyncio .coroutine
148+ def test_is_anonymous (loop , test_client ):
149+
150+ @asyncio .coroutine
151+ def index (request ):
152+ is_anon = yield from is_anonymous (request )
153+ if is_anon :
154+ return web .HTTPUnauthorized ()
155+ return web .HTTPOk ()
156+
157+ @asyncio .coroutine
158+ def login (request ):
159+ response = web .HTTPFound (location = '/' )
160+ yield from remember (request , response , 'UserID' )
161+ return response
162+
163+ @asyncio .coroutine
164+ def logout (request ):
165+ response = web .HTTPFound (location = '/' )
166+ yield from forget (request , response )
167+ return response
168+
169+ app = web .Application (loop = loop )
170+ _setup (app , CookiesIdentityPolicy (), Autz ())
171+ app .router .add_route ('GET' , '/' , index )
172+ app .router .add_route ('POST' , '/login' , login )
173+ app .router .add_route ('POST' , '/logout' , logout )
174+ client = yield from test_client (app )
175+ resp = yield from client .get ('/' )
176+ assert web .HTTPUnauthorized .status_code == resp .status
177+
178+ yield from client .post ('/login' )
179+ resp = yield from client .get ('/' )
180+ assert web .HTTPOk .status_code == resp .status
181+
182+ yield from client .post ('/logout' )
183+ resp = yield from client .get ('/' )
184+ assert web .HTTPUnauthorized .status_code == resp .status
185+
186+
187+ @asyncio .coroutine
188+ def test_login_required (loop , test_client ):
189+ @login_required
190+ @asyncio .coroutine
191+ def index (request ):
192+ return web .HTTPOk ()
193+
194+ @asyncio .coroutine
195+ def login (request ):
196+ response = web .HTTPFound (location = '/' )
197+ yield from remember (request , response , 'UserID' )
198+ return response
199+
200+ @asyncio .coroutine
201+ def logout (request ):
202+ response = web .HTTPFound (location = '/' )
203+ yield from forget (request , response )
204+ return response
205+
206+ app = web .Application (loop = loop )
207+ _setup (app , CookiesIdentityPolicy (), Autz ())
208+ app .router .add_route ('GET' , '/' , index )
209+ app .router .add_route ('POST' , '/login' , login )
210+ app .router .add_route ('POST' , '/logout' , logout )
211+ client = yield from test_client (app )
212+ resp = yield from client .get ('/' )
213+ assert web .HTTPUnauthorized .status_code == resp .status
214+
215+ yield from client .post ('/login' )
216+ resp = yield from client .get ('/' )
217+ assert web .HTTPOk .status_code == resp .status
218+
219+ yield from client .post ('/logout' )
220+ resp = yield from client .get ('/' )
221+ assert web .HTTPUnauthorized .status_code == resp .status
222+
223+
224+ @asyncio .coroutine
225+ def test_has_permission (loop , test_client ):
226+
227+ @has_permission ('read' )
228+ @asyncio .coroutine
229+ def index_read (request ):
230+ return web .HTTPOk ()
231+
232+ @has_permission ('write' )
233+ @asyncio .coroutine
234+ def index_write (request ):
235+ return web .HTTPOk ()
236+
237+ @has_permission ('forbid' )
238+ @asyncio .coroutine
239+ def index_forbid (request ):
240+ return web .HTTPOk ()
241+
242+ @asyncio .coroutine
243+ def login (request ):
244+ response = web .HTTPFound (location = '/' )
245+ yield from remember (request , response , 'UserID' )
246+ return response
247+
248+ @asyncio .coroutine
249+ def logout (request ):
250+ response = web .HTTPFound (location = '/' )
251+ yield from forget (request , response )
252+ return response
253+
254+ app = web .Application (loop = loop )
255+ _setup (app , CookiesIdentityPolicy (), Autz ())
256+ app .router .add_route ('GET' , '/permission/read' , index_read )
257+ app .router .add_route ('GET' , '/permission/write' , index_write )
258+ app .router .add_route ('GET' , '/permission/forbid' , index_forbid )
259+ app .router .add_route ('POST' , '/login' , login )
260+ app .router .add_route ('POST' , '/logout' , logout )
261+ client = yield from test_client (app )
262+
263+ resp = yield from client .get ('/permission/read' )
264+ assert web .HTTPUnauthorized .status_code == resp .status
265+ resp = yield from client .get ('/permission/write' )
266+ assert web .HTTPUnauthorized .status_code == resp .status
267+ resp = yield from client .get ('/permission/forbid' )
268+ assert web .HTTPUnauthorized .status_code == resp .status
269+
270+ yield from client .post ('/login' )
271+ resp = yield from client .get ('/permission/read' )
272+ assert web .HTTPOk .status_code == resp .status
273+ resp = yield from client .get ('/permission/write' )
274+ assert web .HTTPOk .status_code == resp .status
275+ resp = yield from client .get ('/permission/forbid' )
276+ assert web .HTTPForbidden .status_code == resp .status
277+
278+ yield from client .post ('/logout' )
279+ resp = yield from client .get ('/permission/read' )
280+ assert web .HTTPUnauthorized .status_code == resp .status
281+ resp = yield from client .get ('/permission/write' )
282+ assert web .HTTPUnauthorized .status_code == resp .status
283+ resp = yield from client .get ('/permission/forbid' )
284+ assert web .HTTPUnauthorized .status_code == resp .status
0 commit comments