我刚接触rails并使用api上的数据构建应用程序,我有两个我想用于用户的表 - students
和educators
。
我可以使用
在控制器中进行身份验证private
def fetch_user_data(username, password)
require 'URI'
uri = URI('the url for the api')
res = Net::HTTP.post_form(uri, 'username' => username, 'password' => password)
xml = res.body
doc = Nokogiri::Slop(xml)
@status = doc.auth.status.content.to_s
@username = doc.auth.username.content.to_s
@token = doc.auth.token.content.to_s
@person_id = doc.auth.person_pk.content.to_i
@security_roles = doc.auth.security_roles.content.to_s.downcase
end
def assign_user
if /faculty/ =~ @security_roles
@user = Educator.find_by(person_id: @person_id)
elsif /student/ =~ @security_roles
@user = Student.find_by(person_id: @person_id)
end
end
def authenticate_user(username, password)
fetch_user_data(username, password)
assign_user
session[:user_id] = @user.id
redirect_to @user
end
现在我知道它可能并不漂亮,但我正在学习。我在会话控制器中使用authenticate_user()
,并且基于重定向,身份验证似乎很好。我对会话中的:user_id
密钥有一个问题 - 是仅为会话创建的密钥还是尝试从用户表中提取值?知道这会有所帮助。我的猜测是它刚刚为会话创建,但我不知道。
好现在我的真正问题。我正在尝试使用cancan而且我在定义当前用户时遇到困难。
我想我可以将@current_user
实例指向@user
中指定的assign_user
。这似乎不起作用。我尝试了几件事,但我被卡住了。也许我甚至不能这样做?更大的问题?我是否必须拥有用户模型才能使康康工作?我可以使用教育者和学生这两个模型,并在cancan中屏蔽用户参考吗?
我尝试了这个,但它没有用 - 有什么帮助吗?
def current_user
@current_user ||= @user
end
编辑:想出一点。
方法在ApplicationHelper
。已将current_user()
移至ApplicationController
。将语法更改为常规,但添加了条件。
def current_user
if Student.where(id:session[:user_id]).count == 0
@current_user ||= Educator.find(session[:user_id])
else
@current_user ||= Student.find(session[:user_id])
end
end
这似乎解决了问题,并允许我将这两个表用作用户模型。
答案 0 :(得分:1)
有几种方法可以定义current_user(如果你没有使用Devise),但是这个here非常标准:
class ApplicationController < ActionController::Base
def current_user
@current_user ||= User.find(session[:user_id])
end
end
至于你关于会话的问题,你设置的方式,你设置的会话[:user_id]等于@ user.id(每个用户总是相同的)。
答案 1 :(得分:0)
轻微的一边考虑使用宝石CanCanCan听起来。 CanCan没有维护和一些设置替代CanCanCan。你不会改变任何代码。