我最近开始学习rails并且必须开发一个具有三个角色的应用程序:user(admin),student,instructor。我自己写了下面的代码。但问题是它使所有活跃用户的角色与最近的登录类似。例如,如果管理员已登录,之后学生登录,然后如果管理员刷新她的页面,她也将成为学生。我应该在我的代码中更改什么来解决这个问题?如果不可能像这样实现它,建议我应该如何解决这个问题。感谢。
这是我的users_controller代码:
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
这是我的application_controller.rb代码
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
答案 0 :(得分:0)
在我看来,您共享相同的会话密钥session[:user_id]
来存储User
,Student
和Instructor
的ID。您如何区分这三种登录用户?
如果登录Student
访问instructor_index
路径,则可能会使用该学生的ID加载Instructor
将呈现ID和教师的视图。我没有看到任何代码表明其他情况。
我原本希望这样一个系统同时存储session[:user_id]
和session[:user_type]
,以确保能够准确识别登录的人。