2015-12-07 4 views
2

Я пытаюсь внедрить систему единого входа, извлекая все права на авторизацию от SAML ответа:Джанго - Логин пользователя без модели

class SAMLServiceProviderBackend(object): 

    def authenticate(self, saml_authentication=None): 
     if not saml_authentication: # Using another authentication method 
      return None 

     if saml_authentication.is_authenticated(): 
      attributes = saml_authentication.get_attributes() 
      user = User(username=saml_authentication.get_nameid()) 
      user.first_name = attributes['givenName'] 
      user.last_name = attributes['sn'] 

     return None 

в представлениях я получил что-то вроде

... 
user = authenticate(saml_authentication=auth) 
login(self.request, user) 
... 

login терпит неудачу, потому что отсутствующего метода save(). Единственный способ - унаследовать от User и переопределить метод save. Попытка этого, я получил следующие ошибки: is_authenticated, get_and_delete_messages и т. Д.

Есть ли простой способ вставить пользовательский объект в сеанс, не сохраняя пользователя в базе данных?

Что-то вроде:

request.session['user'] = authenticate(saml_authentication=auth) 

ответ

0

Я думаю, должно быть возможно с некоторыми ограничениями, например. вы не можете сохранять свои данные с пользователем, являющимся FK.

Я попробовал это сам, я подозреваю, что вы можете динамически создать экземпляр пользователя в методе authenticate() только не называйте user.save() или перезаписать save() метод не делать ничего.

Возможно, вам также понадобится подключить запись пользователя между запросами, поэтому вам может потребоваться написать собственный сериализатор для пользователя и загрузить, которые построят экземпляр пользователя из сеанса.

0

Я уверен, что объекты сеанса Django необходимы для бэкэнда аутентификации. т. е. если вы входите в систему, то Django должен где-то хранить ссылку на этот факт. Django обычно использует это база данных, чтобы сделать это, однако, если вы не используете базу данных с приложением, то вы можете посмотреть на кэширование сессий вместо:

https://docs.djangoproject.com/en/1.11/topics/http/sessions/#using-cached-sessions

(я предполагаю, что вы не используете база данных, судя по вашему вопросу)

Что еще более важно, однако, в зависимости от ваших потребностей, вы, возможно, придется смотреть на создание/настройки, пользовательские модели пользователя для того, чтобы получить бэкенд работать:

https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#substituting-a-custom-user-model

+0

lol, я думал, это новый вопрос! нм, игнорировать этот ответ ... –

Смежные вопросы