Sprankelprachtig aan/afmeldsysteem

authentication_helper.rb 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. module AuthenticationHelper
  2. # Create a new Session and set the relevant cookies.
  3. def log_in(user, remember, new=true)
  4. reset_session
  5. expiry = 6.hours.since
  6. session[:user_id] = user.id
  7. session[:expires] = expiry
  8. if new
  9. if remember == 1
  10. token = Session.new_token
  11. cookies.signed.permanent[:remember_token] = {
  12. value: token,
  13. httponly: true
  14. }
  15. cookies.signed.permanent[:user_id] = {
  16. value: user.id,
  17. httponly: true
  18. }
  19. else
  20. token = nil
  21. end
  22. s = Session.create!(
  23. user: user,
  24. ip: request.remote_ip,
  25. expires: expiry,
  26. remember_digest: token ? Session.digest(token) : nil
  27. )
  28. if remember
  29. cookies.signed.permanent[:session_id] = {
  30. value: s.id,
  31. httponly: true
  32. }
  33. end
  34. end
  35. end
  36. # Determine whether the user is logged in, and if so, disable the Session, then flush session cookies.
  37. def log_out
  38. if is_logged_in?
  39. get_user_session
  40. @user_session.update!(active: false)
  41. end
  42. cookies.delete(:user_id)
  43. cookies.delete(:remember_token)
  44. cookies.delete(:session_id)
  45. reset_session
  46. end
  47. # Determine whether the current request is from a user with a non-expired session.
  48. # Makes @user_session available as a side effect if the user is not.
  49. def is_logged_in?
  50. # Case 1: User has an active session inside the cookie.
  51. # We verify that the session hasn't expired yet.
  52. if session[:user_id] && session[:expires].to_time > DateTime.now
  53. return true
  54. else
  55. # Case 2: User is returning and has a remember token saved.
  56. # We get the Session, check the token and expiry, and log the user in.
  57. if cookies.signed.permanent[:remember_token] && cookies.signed.permanent[:user_id] &&
  58. cookies.signed.permanent[:session_id]
  59. get_user_session
  60. if @user_session.nil? || @user_session.remember_digest.nil?
  61. return false
  62. end
  63. session_password = BCrypt::Password.new s.remember_digest
  64. if @user_session.expires > DateTime.now &&
  65. session_password == cookies.signed.permanent[:remember_token]
  66. log_in s.user, false, false
  67. return true
  68. end
  69. return false
  70. end
  71. return false
  72. end
  73. end
  74. # Get the Session object representing the current user's session.
  75. def get_user_session
  76. if @user_session
  77. @user_session
  78. else
  79. @user_session ||= Session.find_by(
  80. id: cookies.signed.permanent[:session_id]
  81. )
  82. end
  83. end
  84. def current_user
  85. get_user_session
  86. @user_session.user
  87. end
  88. def current_person
  89. current_user.person
  90. end
  91. def require_login!
  92. if !is_logged_in?
  93. flash[:warning] = "You need to be logged in to do that."
  94. redirect_to controller: 'authentication', action: 'login_form'
  95. end
  96. end
  97. def require_admin!
  98. if !current_person.is_admin?
  99. flash[:danger] = "You need to be an administrator to do that."
  100. redirect_to '/dashboard'
  101. end
  102. end
  103. end