1
1
import asyncio
2
+ import enum
2
3
3
4
from aiohttp import web
4
- from aiohttp_security import (remember ,
5
- authorized_userid , permits ,
6
- AbstractAuthorizationPolicy )
7
5
from 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 )
8
9
from aiohttp_security .cookies_identity import CookiesIdentityPolicy
9
10
10
11
@@ -73,7 +74,27 @@ def check(request):
73
74
74
75
75
76
@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
77
98
78
99
@asyncio .coroutine
79
100
def login (request ):
@@ -83,11 +104,11 @@ def login(request):
83
104
84
105
@asyncio .coroutine
85
106
def check (request ):
86
- ret = yield from permits (request , 'read' )
107
+ ret = yield from permits (request , Permission . READ )
87
108
assert ret
88
- ret = yield from permits (request , 'write' )
109
+ ret = yield from permits (request , Permission . WRITE )
89
110
assert ret
90
- ret = yield from permits (request , 'unknown' )
111
+ ret = yield from permits (request , Permission . UNKNOWN )
91
112
assert not ret
92
113
return web .Response ()
93
114
@@ -121,3 +142,143 @@ def check(request):
121
142
resp = yield from client .get ('/' )
122
143
assert 200 == resp .status
123
144
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