rails 4 - 从头开始​​的基于角色的授权

时间:2016-05-29 11:22:33

标签: ruby-on-rails authentication authorization

我最近开始学习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

1 个答案:

答案 0 :(得分:0)

在我看来,您共享相同的会话密钥session[:user_id]来存储UserStudentInstructor的ID。您如何区分这三种登录用户?

如果登录Student访问instructor_index路径,则可能会使用该学生的ID加载Instructor将呈现ID和教师的视图。我没有看到任何代码表明其他情况。

我原本希望这样一个系统同时存储session[:user_id]session[:user_type],以确保能够准确识别登录的人。