2016-05-29 11 views
1

Ich habe vor kurzem angefangen, Schienen zu lernen und musste eine Anwendung mit drei Rollen entwickeln: Benutzer (Admin), Student, Ausbilder. Ich habe den folgenden Code selbst geschrieben. Das Problem ist jedoch, dass die Rolle aller aktiven Benutzer der neuesten Anmeldung ähnelt. Wenn z. B. admin angemeldet war und sich ein Schüler später anmeldet und wenn der Administrator seine Seite aktualisiert, wird er auch Schüler. Was sollte ich in meinem Code ändern, um dieses Problem zu beheben? Und wenn es nicht möglich ist, es so zu implementieren, dann schlagen Sie mir vor, wie ich dieses Problem beheben sollte. Vielen Dank.Schienen 4 - rollenbasierte Autorisierung von Grund auf

hier ist mein users_controller Code:

def login 
if session[:user_id]!=nil 
    redirect_to(:action => 'index') 
end 
end 
def attempt_login 
if params[:username].present? && params[:password].present? 
    found_user = User.where(:username => params[:username]).first 
    if found_user 
     authorized_user = found_user.authenticate(params[:password]) 
     if authorized_user 
     flash[:notice] = "Welcome! You are LoggedIn" 
     session[:user_id] = authorized_user.id 
     redirect_to(:action => 'index') 
     return 
     end 
    end 
    found_student = Student.where(:username => params[:username]).first 
     if found_student 
     student_id = Student.authenticate(params[:username],params[:password]) 
     if student_id 
      flash[:notice] = "Welcome! You are LoggedIn" 
      session[:user_id] = student_id 
      redirect_to(:action => 'student_index') 
      return 
     end 
     end 
    found_instructor = Instructor.where(:username => params[:username]).first 
     if found_instructor 
     instructor_id = Instructor.authenticate(params[:username],params[:password]) 
     if instructor_id 
      flash[:notice] = "Welcome! You are LoggedIn" 
      session[:user_id] = instructor_id 
      redirect_to(:action => 'instructor_index') 
      return 
     end 
     end 
    flash[:notice] = "Invalid username/Password combination." 
    redirect_to(:action => 'login') 
end 
end 


def logout 
flash[:notice]="Logged out" 
session[:user_id] = nil 
redirect_to(:action => "login") 
end 

und hier ist mein application_controller.rb Code

def require_login 
    unless session[:user_id] or config.my_config 
     flash[:notice] = "You are not Logged In" 
     redirect_to :root 
     return false 
    else 
    return true 
    end 

end 

Antwort

0

Es scheint mir, dass Sie den gleichen Sitzungsschlüssel session[:user_id] teilen die ID zu speichern von User, Student und Instructor. Wie unterscheiden Sie zwischen den drei Arten von angemeldeten Benutzern?

Es ist möglich, dass ein in Student Besuchen protokollieren, wenn der instructor_index Pfad, dann würde die Schüler-ID ein Instructor mit der gleichen ID laden verwendet werden, und eine Ansicht für einen Lehrer gemacht werden würde. Ich sehe keinen Code, um etwas anderes anzuzeigen.

Ich hätte erwartet, dass ein solches System sowohl eine session[:user_id], als auch eine session[:user_type] speichert, um sicherzustellen, dass es möglich ist, die eingeloggte Person genau zu identifizieren.