这篇文章简单的分析一下AuthorenticatedSystem类,我把相关连的代码放在一起,方便分析,首先列出最常用的三个方法
ruby 代码
-
-
- def logged_in?
- current_user != :false
- end
-
-
- def current_user
- @current_user ||= (session[:user] && User.find_by_id(session[:user])) || :false
- end
-
-
- def current_user=(new_user)
- session[:user] = (new_user.nil? || new_user.is_a?(Symbol)) ? nil : new_user.id
- @current_user = new_user
- end
调用logged_in?的时候,会调用current_user方法,如果是第一次调用,会进而调用模型类的find方法,使用id来进行查找,否则直接返回@current_user实例变量
调用current_user=()方法,如果传入参数是nil或者symbol,session[:user]被设置为nil,否则设置为相应模型类的id,同时设置@current_user实例变量
使用@current_user大概是为了减少数据库查询次数
ruby 代码
- def login_required
- username, passwd = get_auth_data
- self.current_user ||= User.authenticate(username, passwd) || :false if username && passwd
- logged_in? && authorized? ? true : access_denied
- end
-
- def authorized?
- true
- end
-
- @@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
-
- def get_auth_data
- auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
- auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
- return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
- end
-
- def access_denied
- respond_to do |accepts|
- accepts.html do
- store_location
- redirect_to :controller => '/account', :action => 'login'
- end
- accepts.xml do
- headers["Status"] = "Unauthorized"
- headers["WWW-Authenticate"] = %(Basic realm="Web Password")
- render :text => "Could't authenticate you", :status => '401 Unauthorized'
- end
- end
- false
- end
-
- def store_location
- session[:return_to] = request.request_uri
- end
login_required是一个filter方法,通过在ApplicationController类中include AuthorenticatedSystem类,然后在相应的模型类中定义一个before_filter :login_required来使用,login_required通过get_auth_data方法从request请求中获得auth_key和auth_data,将auth_data反编码后取出其中的值,此返回值是一个数组,如果request请求中不包含auth_data,则返回[nil,nil]
如果get_auth_data返回一个[nil,nil],或者request包含的用户名密码不正确,会导致session[:user]和@current设置为:false,logged_in?返回false,导致最终调用access_denied方法,此方法会记录用户当前请求的连接地址,放入一个叫session[:return_to]的session中,并且重定向到login方法,session[:return_to]会在login中用到。
ruby 代码
- def self.included(base)
- base.send :helper_method, :current_user, :logged_in?
- end
logged_in?方法被注册为helper方法,从而可以在视图中使用,用来控制视图逻辑。
ruby 代码
-
-
- def login_from_cookie
- return unless cookies[:auth_token] && !logged_in?
- user = User.find_by_remember_token(cookies[:auth_token])
- if user && user.remember_token?
- user.remember_me
- self.current_user = user
- cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
- flash[:notice] = "Logged in successfully"
- end
- end
login_from_cookie方法应该置于ApplicationController中并且申明为before_filter,这样可以在整个网站获得remember_me功能
ruby 代码
- def login_from_cookie
- return unless cookies[:auth_token] && !logged_in?
- user = User.find_by_remember_token(cookies[:auth_token])
- if user && user.remember_token?
- user.remember_me
- self.current_user = user
- cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
- flash[:notice] = "Logged in successfully"
- end
- end
如果cookies中不包含:auth_token,或者用户已经登录,则直接返回。根据cookies[:auth_token]查找user,调用remember_token?方法判断用户是否已经过期(插件默认过期时间为两个星期)
ruby 代码
- def remember_token?
- remember_token_expires_at && Time.now.utc < remember_token_expires_at
- end
分享到:
相关推荐
安装npm install @haventec/authenticate-web-sdk 一般用法authenticate-web-sdk不会作为默认导出导出,应该为每个用户创建一个实例。 import { HaventecAuthenticate } from '@haventec/authenticate-web-sdk' let ...
vue-authenticate, 简单 Vue.js 身份验证库 [ WARNING ]: 自述文件目前正在重写...身份验证 使用 Vue.js,提供本地登录/注册,以及使用 Github,Facebook,Google和其他OAuth提供商,可以方便地为提供收费的 authentic
2. **前端框架**:由于项目名为“authenticate-me-project”,它很可能使用了某种前端框架来加速开发和增强用户体验。常见的JavaScript框架包括React、Angular和Vue.js。这些框架提供了组件化开发、路由管理、状态...
标题“authenticate-me-aa”可能指的是一个项目或应用,它涉及到...通过深入研究“authenticate-me-aa-main”这个目录下的文件,我们可以进一步了解项目的具体实现细节,包括代码结构、函数逻辑以及所用的库和技术。
Dr.COM Authenticate Client Installer网通宽带插件
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
标题中的“jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC”是一个典型的Java安全异常,通常发生在尝试使用不受信任的加密提供者时。在这个问题中,"BC"指的是Bouncy Castle...
在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...
vue-authenticate 简单的Vue.js认证库
它已被编写为与 django-git-lfs 配合使用,请参阅: : 要求 Gitolite Perl:JSON 和 LWP (HTTP) 安装 在 gitolite 中设置 LOCAL_CODE。 将 LFS_URL 添加到 .gitolite.rc,例如在 LOCAL_CODE 之后。 例如,这应该...
2. **使用社区插件**:如果已经有其他人解决了这个问题,那么可能可以在Rust的生态中找到相关的第三方库或者插件,这些插件可能提供了缺失的解析和打印功能。 3. **升级或降级Hyper版本**:根据具体项目需求和Hyper...
我们将演示如何使用Watson Assistant,Cloud Functions和Custom API来构建此应用程序。 完成此代码模式后,您将了解如何: 将对话界面构建到任何应用程序,设备或渠道中。 在没有服务器的情况下运行您的应用程序...
框架 2(Java-Mongo-Sample 应用程序) 关于插件的更多信息: PlayAuthenticate Java 和 Mongo 示例应用程序该项目基于 PlayAuthenticate 作者提供的,但它使用 MongoDB 作为数据存储而不是 PostreSQL。插件播放...
The reason is you account in window xp did not have "administrator" privacy
4. **LICENSE**:通常包含插件的许可协议,如MIT、GPL等,规定了他人可以如何使用和分发这个软件。 5. **Rakefile**:Rails项目中的任务脚本,用于执行各种维护和构建任务,如数据库迁移或测试。 6. **init.rb**:此...
本文将深入探讨C#中的Authentication类以及如何使用它来处理Cookie,特别是聚焦于Forms Authentication。 Forms Authentication是ASP.NET框架提供的一种内置的身份验证机制,用于管理用户的登录状态。这种验证方式...
标题“authenticate-me”很可能指的是一个关于身份验证或授权的项目,可能是一个小型的Web应用或者库,用于处理用户登录、身份验证的过程。在JavaScript环境中,这通常涉及到前端和后端的安全实践。 描述中的...
语言:English 通过链接到其原始推文来识别假鸣叫屏幕截图 fakeposts.com扩展名让您可以识别Tweet屏幕截图是否最初由该帐户或其假... 怎么运行的 - 安装扩展名。 - 右键单击Tweet屏幕截图 - 单击“检查Tweet的真实性”
这个名为"swift-一个提供apptouchID的小型react-native插件"的项目,结合了Swift和React Native的优势,为React Native应用引入了Touch ID功能。 Touch ID是苹果设备上的生物识别技术,用户可以通过指纹识别快速...