123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # **************************************************************************
- # Copyright © 2017 jianglin
- # File Name: permission.py
- # Author: jianglin
- # Email: xiyang0807@gmail.com
- # Created: 2017-03-28 16:02:43 (CST)
- # Last Update:星期日 2017-4-2 11:47:33 (CST)
- # By:
- # Description:
- # **************************************************************************
- from collections import namedtuple
- from functools import partial, wraps
- from flask import abort, current_app, flash, redirect, request, url_for
- from flask_login import current_user, login_required
- from flask_principal import (Need, Permission, RoleNeed, UserNeed,
- identity_loaded)
- super_permission = Permission(RoleNeed('super'))
- confirm_permission = Permission(RoleNeed('confirmed')).union(super_permission)
- auth_permission = Permission(RoleNeed('auth')).union(confirm_permission)
- guest_permission = Permission(RoleNeed('guest')).union(auth_permission)
- _TopicNeed = namedtuple('Topic', ['method', 'value'])
- TopicNeed = partial(_TopicNeed, 'PUT')
- _ReplyNeed = namedtuple('Reply', ['method', 'value'])
- ReplyNeed = partial(_ReplyNeed, 'edit')
- _CollectNeed = namedtuple('Collect', ['method', 'value'])
- CollectNeed = partial(_CollectNeed, 'edit')
- class TopicPermission(Permission):
- def __init__(self, pk):
- need = TopicNeed(pk)
- super(TopicPermission, self).__init__(need)
- class ReplyPermission(Permission):
- def __init__(self, pk):
- need = ReplyNeed(pk)
- super(ReplyPermission, self).__init__(need)
- class CollectPermission(Permission):
- def __init__(self, pk):
- need = CollectNeed(pk)
- super(CollectPermission, self).__init__(need)
- def is_confirmed(func):
- @wraps(func)
- def _is_confirmed(*args, **kwargs):
- if not current_user.is_authenticated:
- return redirect(url_for('auth.login', next=request.path))
- if confirm_permission.can():
- return func(*args, **kwargs)
- flash('请验证你的帐号', 'warning')
- return redirect(url_for('user.user', username=current_user.username))
- return _is_confirmed
- def is_guest(func):
- @wraps(func)
- def _is_guest(*args, **kwargs):
- if not current_user.is_authenticated:
- return func(*args, **kwargs)
- flash('你已登陆,请勿重复登陆')
- return redirect('/')
- return _is_guest
- class RestfulView(object):
- decorators = ()
- def __call__(self, func):
- f = self.method(func)
- if self.decorators:
- for dec in reversed(self.decorators):
- f = dec(f)
- return f
- def method(self, func):
- @wraps(func)
- def decorator(*args, **kwargs):
- meth = getattr(self, request.method.lower(), None)
- if request.method == 'HEAD':
- meth = getattr(self, 'get', None)
- if meth is not None:
- check = meth(*args, **kwargs)
- if isinstance(check, bool) and check:
- return func(*args, **kwargs)
- elif check:
- return check or self.callback()
- return func(*args, **kwargs)
- return decorator
- def callback(self):
- abort(403)
|