On Wednesday, 21 November 2012 12:04:45 UTC, Loai Ghoraba wrote:

> Well, thanks very much for your effort-y reply. I have read it and it is 
> useful, though it requires a second reading to recap :)
>
> Well, I thought of a simple solution and it worked: just having a wrapping 
> function around django login such that it checks whether the use is logged 
> in or not before viewing the login page. I had to import the SESSION_KEY 
> variable used by django to set the user session. I think this is a bad 
> thing since they may change the variable name in future releases, however 
> they don't provide a getter method for it.
>
> cod: /* myview.py */
> from django.contrib.auth import SESSION_KEY
>
>
> def check_not_login(view):
>     def new_view(request,*args,**kwargs):
>         #the user is already logged in, redirect to the home page
>         if SESSION_KEY in request.session:
>             if request.session[SESSION_KEY]==request.user.id:
>                 return HttpResponseRedirect('/faculty/')
>         return view(request,*args,**kwargs)
>     return new_view
>
> /*urls.py*/..
>  url(r'^accounts/login/$', check_not_login(login))
> ..
> and it is working :)
>
> On Wednesday, November 21, 2012 12:54:43 AM UTC+2, Issam Outassourt wrote:
>>
>> Hi,
>>
>> Well what you could do actually, and it's of commun use is to give your 
>> user a session-cookie id, which you can generate based on some informations 
>> in the header, typically his login, his ip adress, his password, his 
>> user-agent... 
>> As he tries to get the login page, challenge him by checking if the 
>> cookie is set.
>> If it is set, you should recompute the value and check wether it matches. 
>> If it does, then you can redirect the response to another url, otherwise 
>> you show back the login page.
>>
>> Well, i'll give you the structure of the code :
>>
>> *login page*
>>
>> if(cookie_session_id is set):
>>
>>         calculate new_cookie_session_id(remarkable data_headers, database 
>> information,...) //through concatenation and hashes
>>         if (new_cookie_session_id == cookie_session_id):
>>                  return redirection_to_main_page
>>         else:
>>                  return 
>> what_should_be_the_template_that_allows_the_user_to_identify_him_self
>> else:
>>         return 
>> what_should_be_the_template_that_allows_the_user_to_identify_him_self
>>
>>
>> *submit_page*
>> /* after the user gets to give his own parameters and submit the form
>> you should manage the data with a view function that sets the 
>> cookie_session_id for the session */
>>
>>
>> if(the_user_has_the_right_to_authenticate_with_submitted_values):
>>          calculate cookie_session_id(remarkable data_headers, database 
>> information,...) 
>>          set cookie_session_id
>>          return the_user_main_page
>> else:
>>          return an_error_and_allow_your_user_to_log_again // or something 
>> of that kind
>>
>> DONE !
>> The idea behind that is that if the facility is not offered or you did 
>> not afford the time to check the documentation, you can try to solve your 
>> problem by your own. Yet more, you should consider checking the 
>> cookie_session_id any time the user tries to browse a page that contains 
>> sensitive or not public information. What would help you do so is to add a 
>> widget in all pages that shows the login_form if not logged or 
>> login+photo+profile_link (be creative and make sure you check what happens 
>> security wise) information (template power, if you know what i mean ;))
>>
>> One thing to add is that to compute the value you're looking for, what is 
>> advised generally is to get important information that you believe identify 
>> well, or uniquely your user, concatenante all the stuff and hash it with 
>> very common hash algorithms such as md5, sha1...
>> More to it, if you want to make sure that you don't have to calculate the 
>> cookie_session_id each time, all you need is to create a Class that 
>> inherits from models.User, add a ForeignKeyField that holds a list of 
>> couples coming from another table that you create and that can hold the 
>> cookie_session_id of your users and the last_request_date
>>
>> Class SessionId(models.Model):
>>           session_hash = models.TextField(whatever options you want)
>>           last_request_date = models.DateTimeField(feel free to customize)
>>
>> The purpose of this is to make sure that you update SessionId entries 
>> each time you receive a request, to make sure that outdated connections can 
>> be deleted and to allow your users to connect through different platforms 
>> at the same time, as the value of the cookie_session_id could depend as 
>> well on something unique to each machine (their ip adress for example, and 
>> their user-agent)
>>
>> So, your structure will change from that thing above to the following :
>>
>> *login page*
>>
>> if(cookie_session_id is set):
>>
>>         calculate new_cookie_session_id(remarkable data_headers, database 
>> information,...) //through concatenation and hashes
>>         if (new_cookie_session_id == cookie_session_id,
>>             *and the session is not expired*):
>>                  return redirection_to_main_page
>>         else:
>>                  *make sure that the user is not authenticated and clear 
>> the foreign key entry if needed (that is to say if it exists and the 
>> session is outdated)*
>>                  return 
>> what_should_be_the_template_that_allows_the_user_to_identify_him_self
>> else:
>>         return 
>> what_should_be_the_template_that_allows_the_user_to_identify_him_self
>>
>>
>> *submit_page*
>> /* after the user gets to give his own parameters and submit the form
>> you should manage the data with a view function that sets the 
>> cookie_session_id for the session */
>>
>>
>> if(the_user_has_the_right_to_authenticate_with_submitted_values):
>>          calculate cookie_session_id(remarkable data_headers, database 
>> information,...) 
>>          set cookie_session_id
>>          *add according entry in the foreignkey field, adding it as well 
>> in the sessionid table*
>>          return the_user_main_page
>> else:
>>          return an_error_and_allow_your_user_to_log_again // or something 
>> of that kind
>>
>>
>> I hope I gave you sufficient hints.
>> Feel free to ask for more explanations if needed. I would be happy to help
>>
>> Regards,
>>
>>
>> 2012/11/20 Loai Ghoraba <[email protected]>
>>
>>> Hi all
>>>
>>> I am trying to build a login page using Django auth app, it is all 
>>> working nice but there is one problem: If I browse to accounts/login (the 
>>> login url) when I am already logged in, in normal situation the login view 
>>> shouldn't be rendered and the correct action will be to redirect to the 
>>> home page/the request url/etc..
>>>
>>> But this just doesn't happen ! It renders the login view normally as if 
>>> I am not logged in!
>>> I even checked the source code, and indeed it doesn't check whether the 
>>> user is already logged in.
>>>
>>> So is this a bug or something ?
>>>
>>> Thanks
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "Django users" group.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msg/django-users/-/YtY426bWAiUJ.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to 
>>> [email protected].
>>> For more options, visit this group at 
>>> http://groups.google.com/group/django-users?hl=en.
>>>
>>
>>
There's no need for any of this. Django provides a way to tell if a user is 
logged in: `request.user.is_authenticated()`. And there is already a 
decorator which wraps views: `@login_required`. All of this is documented:
https://docs.djangoproject.com/en/1.4/topics/auth/#the-login-required-decorator
--
DR.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/django-users/-/F06qfmxrNUAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to