Compare commits

...
7 Commits
7 changed files with 63 additions and 48 deletions
+8
View File
@@ -3,6 +3,14 @@ Flask-Security Changelog
Here you can see the full list of changes between each Flask-Security release. Here you can see the full list of changes between each Flask-Security release.
Version 1.2.2
-------------
Released April 27th, 2012
- Fixed bug where `roles_required` and `roles_accepted` did not pass the next
argument to the login view
Version 1.2.1 Version 1.2.1
------------- -------------
+2 -2
View File
@@ -18,7 +18,7 @@ import sys, os
# documentation root, use os.path.abspath to make it absolute, like shown here. # documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..')) sys.path.insert(0, os.path.abspath('..'))
sys.path.append(os.path.abspath('_themes')) sys.path.append(os.path.abspath('_themes'))
from flask_security import __version__ #from setup import __version__
# -- General configuration ----------------------------------------------------- # -- General configuration -----------------------------------------------------
@@ -50,7 +50,7 @@ copyright = u'2012, Matt Wright'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = __version__ version = '1.2.1'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = version release = version
+4 -4
View File
@@ -85,7 +85,7 @@ First thing you'll want to do is setup your application and datastore::
from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import (User, Security, LoginForm, login_required, from flask.ext.security import (User, Security, LoginForm, login_required,
roles_accepted, user_datastore) roles_accepted, user_datastore)
from flask.ext.security.datastore.sqlalchemy import SQLAlchemyUserDataStore from flask.ext.security.datastore.sqlalchemy import SQLAlchemyUserDatastore
app = Flask(__name__) app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret' app.config['SECRET_KEY'] = 'secret'
@@ -94,14 +94,14 @@ First thing you'll want to do is setup your application and datastore::
db = SQLAlchemy(app) db = SQLAlchemy(app)
Security(app, SQLAlchemyUserDatastore(db)) Security(app, SQLAlchemyUserDatastore(db))
You'll probably want to at least one user to the database to test this out, so You'll probably want to at least one user to the database to test this out.
you can add something such as the following to quickly add an initial user:: There are many ways to do this, but this is a quick and dirty way to do it::
@app.before_first_request @app.before_first_request
def before_first_request(): def before_first_request():
user_datastore.create_role(name='admin') user_datastore.create_role(name='admin')
user_datastore.create_user(username='matt', email='matt@something.com', user_datastore.create_user(username='matt', email='matt@something.com',
password='password', roles['admin']) password='password', roles=['admin'])
Next you'll want to setup your login screen. Setup your view:: Next you'll want to setup your login screen. Setup your view::
+1
View File
@@ -5,6 +5,7 @@
{{ form.username.label }} {{ form.username }}<br/> {{ form.username.label }} {{ form.username }}<br/>
{{ form.password.label }} {{ form.password }}<br/> {{ form.password.label }} {{ form.password }}<br/>
{{ form.remember.label }} {{ form.remember }}<br/> {{ form.remember.label }} {{ form.remember }}<br/>
{{ form.next }}
{{ form.submit }} {{ form.submit }}
</form> </form>
<p>{{ content }}</p> <p>{{ content }}</p>
+6 -5
View File
@@ -10,8 +10,6 @@
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
""" """
__version__ = '1.2.1'
import sys import sys
from datetime import datetime from datetime import datetime
@@ -22,7 +20,8 @@ from flask import (current_app, Blueprint, flash, redirect, request,
from flask.ext.login import (AnonymousUser as AnonymousUserBase, from flask.ext.login import (AnonymousUser as AnonymousUserBase,
UserMixin as BaseUserMixin, LoginManager, login_required, login_user, UserMixin as BaseUserMixin, LoginManager, login_required, login_user,
logout_user, current_user, user_logged_in, user_logged_out) logout_user, current_user, user_logged_in, user_logged_out,
login_url)
from flask.ext.principal import (Identity, Principal, RoleNeed, UserNeed, from flask.ext.principal import (Identity, Principal, RoleNeed, UserNeed,
Permission, AnonymousIdentity, identity_changed, identity_loaded) Permission, AnonymousIdentity, identity_changed, identity_loaded)
@@ -149,7 +148,8 @@ def roles_required(*args):
@wraps(fn) @wraps(fn)
def decorated_view(*args, **kwargs): def decorated_view(*args, **kwargs):
if not current_user.is_authenticated(): if not current_user.is_authenticated():
return redirect(current_app.config[LOGIN_VIEW_KEY]) return redirect(
login_url(current_app.config[LOGIN_VIEW_KEY], request.url))
if perm.can(): if perm.can():
return fn(*args, **kwargs) return fn(*args, **kwargs)
@@ -183,7 +183,8 @@ def roles_accepted(*args):
@wraps(fn) @wraps(fn)
def decorated_view(*args, **kwargs): def decorated_view(*args, **kwargs):
if not current_user.is_authenticated(): if not current_user.is_authenticated():
return redirect(current_app.config[LOGIN_VIEW_KEY]) return redirect(
login_url(current_app.config[LOGIN_VIEW_KEY], request.url))
for perm in perms: for perm in perms:
if perm.can(): if perm.can():
+2 -2
View File
@@ -12,12 +12,12 @@ Links
<https://github.com/mattupstate/flask-security/raw/develop#egg=Flask-Security-dev>`_ <https://github.com/mattupstate/flask-security/raw/develop#egg=Flask-Security-dev>`_
""" """
from flask_security import __version__
from setuptools import setup from setuptools import setup
setup( setup(
name='Flask-Security', name='Flask-Security',
version=__version__, version='1.2.2',
url='https://github.com/mattupstate/flask-security', url='https://github.com/mattupstate/flask-security',
license='MIT', license='MIT',
author='Matthew Wright', author='Matthew Wright',
+6 -1
View File
@@ -1,6 +1,7 @@
import unittest import unittest
from example import app from example import app
class SecurityTest(unittest.TestCase): class SecurityTest(unittest.TestCase):
AUTH_CONFIG = None AUTH_CONFIG = None
@@ -26,7 +27,6 @@ class SecurityTest(unittest.TestCase):
follow_redirects=follow_redirects, follow_redirects=follow_redirects,
content_type=content_type or 'text/html') content_type=content_type or 'text/html')
def authenticate(self, username, password, endpoint=None): def authenticate(self, username, password, endpoint=None):
data = dict(username=username, password=password) data = dict(username=username, password=password)
return self._post(endpoint or '/auth', data=data, return self._post(endpoint or '/auth', data=data,
@@ -35,6 +35,7 @@ class SecurityTest(unittest.TestCase):
def logout(self, endpoint=None): def logout(self, endpoint=None):
return self._get(endpoint or '/logout', follow_redirects=True) return self._get(endpoint or '/logout', follow_redirects=True)
class DefaultSecurityTests(SecurityTest): class DefaultSecurityTests(SecurityTest):
def test_login_view(self): def test_login_view(self):
@@ -100,6 +101,10 @@ class DefaultSecurityTests(SecurityTest):
r = self._get("/admin_or_editor", follow_redirects=True) r = self._get("/admin_or_editor", follow_redirects=True)
self.assertIn('Home Page', r.data) self.assertIn('Home Page', r.data)
def test_unauthenticated_role_required(self):
r = self._get('/admin', follow_redirects=True)
self.assertIn('<input id="next"', r.data)
class ConfiguredSecurityTests(SecurityTest): class ConfiguredSecurityTests(SecurityTest):