面试题答案
一键面试整体设计思路
- 用户认证:
- 用户在登录页面输入用户名和密码。应用对输入的密码进行加密(如使用BCrypt)后与数据库中存储的加密密码进行比对。若匹配,则认证通过。可以在用户登录成功后生成一个认证令牌(如JWT,JSON Web Token),存储在客户端(如HTTP Cookie或Local Storage),后续请求携带此令牌进行身份验证。
- 持久化登录状态,通过设置合适的Cookie过期时间,让用户在一段时间内无需重复登录。
- 用户授权:
- 定义不同的用户角色(如普通用户、管理员等),不同角色拥有不同的权限。为每个资源(如页面、API端点)标记允许访问的角色。当用户请求访问资源时,应用根据用户的角色判断是否具有访问权限。
在Rails框架下的实现方式
- 使用Devise实现用户认证:
- 安装Devise:在Gemfile中添加
gem 'devise'
,然后运行bundle install
。 - 生成Devise配置:运行
rails generate devise:install
,按照提示进行一些基础配置,如设置默认的URL选项等。 - 生成用户模型:运行
rails generate devise User
,这会生成用户模型及相关的数据库迁移文件,默认会包含用户名、密码等字段。运行rails db:migrate
来创建用户表。 - 配置视图:Devise提供了默认的视图文件,可以根据需求自定义登录、注册等视图。例如,自定义登录视图可以修改
app/views/devise/sessions/new.html.erb
。 - 密码加密:Devise默认使用BCrypt对密码进行加密,无需额外配置。
- 安装Devise:在Gemfile中添加
- 使用CanCanCan实现用户授权:
- 安装CanCanCan:在Gemfile中添加
gem 'cancancan'
,运行bundle install
。 - 定义能力:生成能力文件
rails generate cancan:ability
,在app/models/ability.rb
文件中定义不同角色的权限。例如:
- 安装CanCanCan:在Gemfile中添加
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # 访客用户
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
- 在控制器中使用授权:在需要授权的控制器中添加
load_and_authorize_resource
,例如在PostsController
中:
class PostsController < ApplicationController
load_and_authorize_resource
# 控制器的其他代码
end
这样,当用户访问PostsController
的相关操作时,CanCanCan会根据用户的角色和定义的能力进行授权检查。