NPDD/Baobáxia/Autenticação
De Rede Mocambos
(→Django Authentication Backend) |
(→Rascunho para modelo de usuários) |
||
(4 edições intermediárias de 2 usuários não apresentadas) | |||
Linha 1: | Linha 1: | ||
+ | == Rascunho para modelo de usuários == | ||
+ | |||
+ | mocambola -> tabela de relacionamento entre user, mucua e repository | ||
+ | |||
+ | Tabelas: | ||
+ | user | ||
+ | mucua | ||
+ | repository | ||
+ | mocambola | ||
+ | |||
+ | user | mucua_uid | repository | ||
+ | fernao beco redemocambos | ||
+ | fernao beco sarava | ||
+ | fernao beco pirata | ||
+ | vince taina redemocambos | ||
+ | |||
+ | /[repo]/[mucua]/[user] | ||
+ | |||
+ | ex: | ||
+ | /redemocambos/beco/users/fernao.json | ||
+ | /sarava/beco/users/fernao.json | ||
+ | /pirata/beco/users/fernao.json | ||
+ | /redemocambos/taina/users/vince.json | ||
+ | |||
+ | TODO (problema a ser resolvido no futuro): | ||
+ | * se um usuário edita seus dados em um repositório, não irá alterar os dados dos outros; para multirepo, há que ter uma forma de unificar a edição dos users. | ||
+ | |||
+ | fernao.json -> serializa dados de user | ||
+ | |||
+ | Não serializa informações da tabela de relacionamento | ||
+ | |||
+ | fernao@beco.pirata.net | ||
+ | fernao@beco.redemocambos.net | ||
+ | fernao@beco.sarava.net | ||
+ | vince@beco.redemocambos.net | ||
+ | |||
== Open ID == | == Open ID == | ||
Linha 32: | Linha 68: | ||
=== Exemplo com credenciais no settings.py === | === Exemplo com credenciais no settings.py === | ||
− | + | ||
− | from django.conf import | + | from django.conf import settings |
+ | from django.contrib.auth.models import User, check_password | ||
+ | |||
+ | class SettingsBackend(object): | ||
+ | """ | ||
+ | Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD. | ||
+ | |||
+ | Use the login name, and a hash of the password. For example: | ||
+ | |||
+ | ADMIN_LOGIN = 'admin' | ||
+ | ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de' | ||
+ | """ | ||
+ | |||
+ | def authenticate(self, username=None, password=None): | ||
+ | login_valid = (settings.ADMIN_LOGIN == username) | ||
+ | pwd_valid = check_password(password, settings.ADMIN_PASSWORD) | ||
+ | if login_valid and pwd_valid: | ||
+ | try: | ||
+ | user = User.objects.get(username=username) | ||
+ | except User.DoesNotExist: | ||
+ | # Create a new user. Note that we can set password | ||
+ | # to anything, because it won't be checked; the password | ||
+ | # from settings.py will. | ||
+ | user = User(username=username, password='get from settings.py') | ||
+ | user.is_staff = True | ||
+ | user.is_superuser = True | ||
+ | user.save() | ||
+ | return user | ||
+ | return None | ||
+ | |||
+ | def get_user(self, user_id): | ||
+ | try: | ||
+ | return User.objects.get(pk=user_id) | ||
+ | except User.DoesNotExist: | ||
+ | return None |
Edição atual tal como às 15h32min de 4 de outubro de 2013
Conteúdo |
Rascunho para modelo de usuários
mocambola -> tabela de relacionamento entre user, mucua e repository
Tabelas:
user mucua repository mocambola
user | mucua_uid | repository fernao beco redemocambos fernao beco sarava fernao beco pirata vince taina redemocambos
/[repo]/[mucua]/[user]
ex:
/redemocambos/beco/users/fernao.json /sarava/beco/users/fernao.json /pirata/beco/users/fernao.json /redemocambos/taina/users/vince.json
TODO (problema a ser resolvido no futuro):
- se um usuário edita seus dados em um repositório, não irá alterar os dados dos outros; para multirepo, há que ter uma forma de unificar a edição dos users.
fernao.json -> serializa dados de user
Não serializa informações da tabela de relacionamento
fernao@beco.pirata.net fernao@beco.redemocambos.net fernao@beco.sarava.net vince@beco.redemocambos.net
Open ID
Testando o python-openid.. Acho que a partir do exemplo de servidor (https://github.com/openid/python-openid/blob/master/examples/server.py) è possivel ler num arquivo mudando a doLogin:
def doLogin(self): if 'submit' in self.query: if 'user' in self.query: self.user = self.query['user'] # Codigo para ler o arquivo e montar um objeto user on-the-fly a # partir dos dados no arquivo else: self.user = None self.redirect(self.query['success_to']) elif 'cancel' in self.query: self.redirect(self.query['fail_to']) else: assert 0, 'strange login %r' % (self.query,)
Django Authentication Backend
Esse caminho è mais direto e possivelmente o melhor para poder atender demandas especificas. Precisa criar uma classe que implemente duas funções: get_user(user_id) and authenticate(**credentials).
- get_user
- recebe user_id que pode ser o nome do usuario o algum codigo o importante que seja a primary key do objeto User
- retorna um objeto User
- authenticate(**credentials)
- recebe alguns argumentos por exemplo:
class MyBackend(object): def authenticate(self, username=None, password=None): # Check the username/password and return a User. ...
Exemplo com credenciais no settings.py
from django.conf import settings from django.contrib.auth.models import User, check_password class SettingsBackend(object): """ Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD. Use the login name, and a hash of the password. For example: ADMIN_LOGIN = 'admin' ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de' """ def authenticate(self, username=None, password=None): login_valid = (settings.ADMIN_LOGIN == username) pwd_valid = check_password(password, settings.ADMIN_PASSWORD) if login_valid and pwd_valid: try: user = User.objects.get(username=username) except User.DoesNotExist: # Create a new user. Note that we can set password # to anything, because it won't be checked; the password # from settings.py will. user = User(username=username, password='get from settings.py') user.is_staff = True user.is_superuser = True user.save() return user return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None