Ruby on Rails 建立用戶系統及加入OpenID

Rails 7 中 Devise 用户认证实战:安全、可扩展与 Turbo 集成 用户认证是 Web 应用最基础也最关键的环节,其本质是解决‘用户身份可信性’问题,涉及密码哈希、会话管理、CSRF 防护、邮箱验证等核心原理。现代认证已远超传统用户名+密码模式,双因素认证(2FA)、OAuth、JWT、多租户隔离等需求倒逼框架必须兼顾安全性、灵活性与可审计性。Devise 作为 Ruby on Rails 生态中成熟度最高、生产验证最充分的认证解决方案,凭借模块化设计(如 :two_factor_authenticatable、:timeoutable)和对 Rails 7 新特性的原生支 阅读详情

Ruby on Rails 建立用戶系統及加入OpenID

每個Web Application 也為了建立一個安全方便的用戶系統或登入系統而遇上麻煩。Don't Repeat Yourself (DRY), 我們可使用RoR的Plugins解決煩惱!

說到用戶系統,不能不提 MySpace 或 facebook 等公司也非常投入的OpenID 。在RoR 使用OpenId 是非常簡單的事。

Step 1: Signup 登記使用者

先安裝 acts_as_authenticated plugins, 它負責所有基本登入工作。在console 跳至<application_root>

ruby script/plugin install 
http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated/

 

 

安裝後可以用 acts_as_authenticated 建立 "user " Model 和 "account " Controller.

script/generate authenticated user account

這樣便建立了相關的Model 和 Controller。現在設定 Database 。

rake db:migrate  

Database 設定完畢,讀者可以檢查使用的 Database 是否有一個新的 Table "users "。所有用戶資料將會放在這裡。

令人喜出望外的是,你已經擁有基本用戶系統的所有編碼,測試時間到了!

ruby script/server

ror_01

打開 "/account/signup" ,可看到 Signup頁面

打開 /account/signup ,可看到Signup頁面。測試建立一個使用者後,看看資料庫是否更新,完成第一步。

 

Step 2: 設定登入保護  

我們演示登入保護,只要在 Views 和 Controllers 做一點修改便可。

首先,在<application root>/app/views/account 新增 "show.rhtml ",貼上以下編碼。

<%=link_to "log out", "/account/logout"%>

<p><%=current_user.login %> is logged in.</p>

因為acts_as_authenticated 已把基本設定寫妥,我們打開<application root>/app/controllers/account_controller.rb ",在 "include AuthenticatedSystem "下一行插入:

  before_filter :login_required, :except => [:login, :signup]

before_filter 設定先決的 action ,這裡我們執行 acts_as_authenticated 的 login_required action。所以這 controller 的所有 actions 也有預設登入保護。

因為我們加入了 :except => [:login, :signup] ,那麼 login 和 signup 兩個頁面也不會被登入保護,沒有用戶的人仕也可瀏覽這兩個頁面。

測試!在瀏覽器鍵入 http://localhost:3000/account/show

ror_02

show 被登入保護了

Ooops,被送到 "login " 頁面。因為"show " 被登入保護了。這時候可以登入剛才新增的使用者:

ror_03

登入後被送到 show

成功登入後便會自動送到"show "。

現在你的application 已有一個完整的登入系統了!

**如果你的 "account_controller.rb" 有其他 actions ,或者 "/views/account" 有其他頁面,也會有登入保護的了。

 

 

Step 3: OpenID

終於到精采部份了,就是為加入OpenID! 如果你不使用OpenID ,可以跳過這部份。但這樣做之前要留意,OpenID 是一個十分成功的共用登入系統,MySpace 和 facebook 也參與其中。以下是OpenId 編碼

安裝 ruby-openid RubyGems

sudo gem install ruby-openid -y

安裝 restful_authentication

script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication

安裝 open_id_authentication

這個 Plugins 和Rails 2.x 的相容問題較多。筆者發現一個較好的版本,不過它放在 github 裡。要先到 http://github.com/rails/open_id_authentication/tree/master  下載。解壓後改名為open_id_authentication 文件夾,並把它移到<application root>/vendor/plugins 內。

ror_04

現在共有三個Plugins: acts_as_authenticated, restful_authentication, open_id_authentication

建立新 Tables

open_id_authentication 要兩個Database Tables 來記錄OpenId 資料,執行以下指令來建立。

rake open_id_authentication:db:create

rake db:migrate

open <application root>/config/routes.rb ; 確保以下編碼正在運作。

map.root :controller => 'account'

 

Views 修改

先修改"<application root>/app/views/account/login.rhtml " ,在 "<p><%= submit_tag 'Log in' %></p>" 上面插入:

<p> use OpenID ... </p>
<p> <%= text_field_tag "openid_url" %> </p>

再把"<application root>/app/views/account/show.rhtml" 改寫成:

<%=link_to "log out", "/account/logout"%>
<% if current_user.not_openid?%>
<p><%=current_user.login %> is logged in.</p>

<% else %>
<p><%=current_user.identity_url %> is logged in as an open id user.</p>
<% end %>

Models修改

Model 只有一個相關的 <application root>/app/models/user.rb 。但這 user.rb 檔案有幾處要修改。

1. 加入 def not_openid?

  def not_openid?
    identity_url.blank?
  end

2. 修改def password_required?

  def password_required?
    not_openid? && (crypted_password.blank? or not password.blank?)
  end

3. 加入":if => :not_openid?"  至幾個validations,讓openid 使用者避開該項核對。


validates_presence_of     :login, :email, :if => :not_openid?
validates_length_of       :login,    :within => 3..40, :if => :not_openid?
validates_length_of       :email,    :within => 3..100, :if => :not_openid?


Controllers 修改:

只須修改"<application root>/app/controllers/account_controller.rb" 。這檔案也要修改幾處地方。

1. 修改 login ,以加入OpenId 登入:

def login
    return unless request.post?
    if using_open_id?
      open_id_authentication(params[:openid_url])
    elsif params[:login]
      password_authentication(params[:login], params[:password])
    end
  end

3. 修改password_authentication (如有需要的話)

   def password_authentication(login, password)
      if self.current_user = User.authenticate(params[:login], params[:password])
        successful_login
      else
        failed_login("Invalid login or password")
      end
    end

4. 加入 open_id_authentication

    def open_id_authentication(openid_url)
      authenticate_with_open_id openid_url, :required => [:nickname, :email] do |result, identity_url, registration|
        if result.successful?
          @user = self.current_user = User.find_or_create_by_identity_url(identity_url)
          if @user.new_record?
            # registration is a hash containing the valid sreg keys given above
            # use this to map them to fields of your user model
            {'login=' => 'nickname', 'email=' => 'email'}.each do |attr, reg|
              current_user.send(attr, registration[reg]) unless registration[reg].blank?
            end
            if @user.valid?
              @user.save
              self.current_user = @user
              successful_login
            else
              failed_login "Authentication failed on this website."
            end
          else
            self.current_user = @user
            successful_login
          end
        else
          failed_login result.message
        end
      end
    end

這個 action 精明地完成OpenId 核對,並把一些項目從OpenId Server 取回(假設你的OpenId 戶口有:nickname 和 :email 這兩項資料) 。如果是application 的新用者,這些變數將自動用作建立新用者的設定,即是一個新用者也完全不須使用signup 頁面。

5. 加入兩個跳頁用的action

private
    def successful_login
      redirect_back_or_default({:action => :show})
      flash[:notice] = "Logged in successfully"
    end

    def failed_login(message)
      redirect_to(:action => 'login')
      flash[:warning] = message
    end

6. 設定 Database 。

打開console ,跳到在 <application root>

ruby script/generate migration AlterUserIdentityUrl

打開<application root>/db/migration/<新的編號_alter_user_identity_url.rb> ,改寫為:

class AlterUserIdentityUrl < ActiveRecord::Migration
def self.up
  add_column :users, :identity_url, :string
  end

  def self.down
  remove_column :users, :identity_url
  end
end

rake db:migrate  

完成!可以測試了。 當然,讀者要先登記一個OpenId (詳情請參閱 http://openid.net/  )

在http://localhost:3000/account/login  ,我用一個沒有在localhost登記的OpenId 。

ror_05

先輸入你的Open Id ,然後按Submit

登入後,會自動跳到OpenId Server,這時要登入OpenId 一次。

ror_06

你會被送到OpenId Server,輸入你的OpenId password ,並按登入

成功後,你便會使用OpenId 登入localhost ,並跳至相關頁面。

ror_07

 用OpenId 跳至show頁面

總結

在建立一個使用者系統,acts_as_authenticated Plugins 帶給我們很大的方便。"script/generate authenticated user account " 已經把大部份編碼完成。

之後我們使用ruby-openid gem 和 open_id_authentication ,它們使存取OpenId 極之方便。甚至新的使用者也可直接登入系統!只要在 OpenId 登入一次後,那麼以後到任何一個你信任的 OpenId 網站也不用再次登入或登記了。

il2cpp分析-gobal-metadata.dat解密 打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。 阅读详情

相关推荐

RISC-V详细介绍

文章目录写在前面什么是RISC-VRISC-V诞生的背景ISA霸权摩尔定律的穷途末路穷困潦倒的学者不断增长的指令数量RISC-V架构设计思想如何设计一个好的ISARISC-V之RV32I四个典型特点RISC-V之乘除法指令指令格式用乘法代替常数除法RISC-V之RV64RISC-V的特权架构机器模式监管者模式 写在前面 本文主要基于RISC-V中文手册,其中包括但不限于一些网络的资料。本文版权属于skywf,转载或借用请联系作者。 什么是RISC-V RISC-V(发音为“risk-five”)是一个基于

skywf的博客 3万+

OmniAuth OpenID Connect 使用教程

OmniAuth OpenID Connect 使用教程 项目介绍 omniauth_openid_connect 是一个用于 Ruby 应用的 OpenID Connect 策略,它允许你的应用通过 OpenID Connect 协议进行身份验证。该项目是基于 omniauth-openid-connect 的分支,由于原项目的维护被放弃,因此被重新启动并作为一个独立的 gem 发布。 项目快速...

gitblog_00919的博客 506

Redmine无法登陆错误must_change_passwd解决

安装Redmine及一些插件,配置DB文件后,插件可以正常显示,但admin账户无法登陆。 查看log文件,报错大体如下: NoMethodError (undefined method `must_change_passwd?' for #&lt;User:0x00000003f08018&gt;):

林多 1801

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 417

基于Coze平台从零构建AI智能体:以测试用例生成为例的实战指南

在人工智能技术快速发展的今天,大语言模型(LLM)和提示词工程(Prompt Engineering)已成为构建智能应用的核心技术。其原理在于通过自然语言指令引导模型完成特定任务,其技术价值在于极大地降低了AI应用开发的门槛,使非专业开发者也能快速实现想法。这一技术广泛应用于自动化办公、智能客服、内容生成等场景。本文聚焦于字节跳动旗下的Coze平台,该平台通过可视化工作流编排和预置技能,将上述技术封装为易用的工具。文章以“根据产品需求文档(PRD)自动生成测试用例”这一具体场景为例,详细拆解了从需求分析、工

weixin_30617695的博客 337

Ruby on Rails微信开发4——通过网页授权获取用户的基本信息

接着Ruby on Rails微信开发3——自定义菜单的创建,假如“代码是小三”按钮对应了一个我的技术博客的网页链接,该链接只能允许特定的用户打开,此时就需要对用户的身份进行验证。 参照开发者文档网页授权获取用户基本信息对用户身份进行验证 1、网页授权回调域名的配置

ミ安之偌素 4271

PCB板设置20H 原则理解

20H原则是PCB设计中抑制EMI辐射的关键方法,要求电源层比相邻地层内缩20倍介质厚度(20H)。在四层板中实现20H原则需采用S-G-P-S层叠结构,确保GND与PWR紧邻。具体步骤包括:确定GND-PWR间介质厚度H,计算20H值(通常80-120mil),并在设计软件中将电源层四周内缩20H,同时保持地层完整不内缩。注意避免常见误区,如混淆介质厚度、地层内缩等。该原则能有效限制边缘场辐射,降低EMI干扰,是四层板EMC设计的重要规范。

qq_37999850的博客 689

怎样在你的 ruby on rails 网站中加入 OpenID 登录功能

my OS is ubuntu7.10: 1.cd to the project directory 2.[code]sudo gem install ruby-openid[/code] 3.[code]sudo ruby script/plugin install open_id_authentication[/code] 4.rake -T open_id (to see...

boyjunqiang的专栏 326

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

2024-12月js逆向案例-sensor-data之vmp字段之akamai_2/3.0-(下)

akamai2/3的vmp字段逆向分析

十一姐的博客 3144

推荐:Authlogic OpenID

推荐:Authlogic OpenID 如果你正在寻找一个强大的、灵活的 Ruby on Rails 开源库来实现 OpenID 身份验证功能,那么 Authlogic OpenID 是值得你考虑的选择。 什么是 Authlogic OpenID? Authlogic OpenID 是一个基于 Ruby on Rails 的开源身份验证插件,它允许你在应用程序中轻松地集成 OpenID 身份验证功...

gitblog_00006的博客 356

利用 HTML5 与 SICF 打造 CRM WebClient UI 多附件上传 —— 从原型到生产的全流程揭秘

通过HTML5 标准 + SICF 服务 + BOL/GOS API的三位一体方案,我们无需修改 SAP 标准代码,就能让 CRM WebClient UI 获得现代化的多附件上传体验。浏览器负责多选与进度提示,SICF 负责安全中转,ABAP 负责权限校验与落库。你可以先在质量系统快速原型,再逐步完善权限、异常处理与 UI 细节。按照本文的方法落地,哪怕一次上传几百份文件,也能轻松搞定,真正把时间还给业务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 332

易游,OpenID 与 Ruby on Rails

5.1 去了北京一趟,易游的 OpenID 的开发暂停了一段时间,回来以后如期完成。虽然这次在北京有很多收获,都是对个人的,但是回来以后要处理的事情太多了,没有时间来 blog 记录下来。5 月 16 号,易游 OpenID 通行证 终于上线了。 OpenID 这东西,虽然 2 年以前就推出了,不过一直没有进行推广。最近不知道由于什么契机,进入了全世界的视线。简单的描述 OpenID 的作用,就是...

Hozaka.Guo 212

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

DHH 寫了一個 OpenID 的 Rails Plugin

既然大家都覺得 OpenID 很有搞頭,那身為尖端科技的結晶的 Ruby on Rails 怎麼可以缺席呢?Rails 作者 DHH 馬上寫了一個 OpenID 的 Plugin 供大家使用。由於我目前並沒有 implement OpenID 的計畫,所以就不 test 了,大家好好玩 :p...

thegiive 131

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Omniauth-OpenID_Connect 开源项目使用手册

Omniauth-OpenID_Connect 开源项目使用手册 1. 项目目录结构及介绍 Omniauth-OpenID_Connect 是一个Ruby库,它作为OmniAuth框架的策略实现,用于支持OpenID Connect身份验证协议。下面简要介绍了其核心目录结构和关键文件: Gemfile: 包含了项目的依赖关系,指明了需要安装的gem。 omniauth_openid_connec...

gitblog_00588的博客 668

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Rails宝典之六十八式:OpenID Authentication

使用ruby-openid这个gem和open_id_authentication插件做OpenID认证 [code] sudo gem install ruby-openid ruby script\plugin install open_id_authentication rake open_id_authentication:db:create [/code] [code] ...

hideto 144

关于ruby-openid认证问题的记录

今天在Rails项目中,碰到一个错误,提示信息:uninitialized constant OpenID::Store。 在网上搜罗了一番后,决定将原来的ruby-openid-2.1.7切换到ruby-openid-1.1.4,问题就消失了。 至于引起该问题的原因,尚需调查ruby-openid源码。...

qiupeng008的专栏 196

Doorkeeper OpenID Connect 项目常见问题解决方案

Doorkeeper OpenID Connect 项目常见问题解决方案 项目基础介绍 Doorkeeper OpenID Connect 是一个基于 Ruby on Rails 框架的扩展库,旨在为 Rails 应用程序提供 OpenID Connect 认证支持。该项目构建在 Doorkeeper OAuth 2.0 框架之上,允许开发者轻松地将 OpenID Connect 功能集成到他们的...

gitblog_00708的博客 334

OpenId Authentication For Rails3

[align=center][size=xx-large]OpenId Authentication For Rails3[/size][/align] [b]1. Add Gem[/b] GemFile [code="java"] gem 'ruby-openid' gem 'rack-openid', '>=0.2.1', :require => 'rack/openid'[...

sloanwu的博客 130

OpenID Authentication

关键字: Rails OpenID 使用ruby-openid这个gem和open_id_authentication插件做OpenID认证 ruby代码 sudogeminstallruby-openid rubyscript\plugininstallopen_id_authentication rakeope...

weixin_30430169的博客 222

#68 OpenID Authentication

Ever wonder how to implement OpenID authentication in your Rails app? This episode will show you how to add it to a site with an existing authentication system. [code="java"]# routes.rb map.open_id_...

CaiDeHen 133

廉价的Ruby SSO认证的实现

今天在看RailsCast的时候发现了一个很好的东西呵呵。那就是我们的OpenID,相信它会是Ruby一个非常廉价的解决单点登陆的方法。以前我是做java单点登陆的,即使我用已经封装好的sdk包+servlet去集成第三方系统,依然是工作量很大。不过主要经历是花在与第三方公司协调。现在大家如果都用一个开源包去做的话,可以大大降低成本。换句话说,我就要下岗了,呵呵。 希望javaeye也早点支...

小仓库 213

OAuth-Plugin路线图:未来功能规划与社区发展方向

OAuth-Plugin是一款专为Rails应用设计的OAuth解决方案,支持OAuth 1.0a和OAuth 2.0协议,帮助开发者快速实现OAuth服务端和客户端功能。随着Web应用安全需求的不断提升,该插件正通过持续迭代优化授权流程、增强兼容性,并构建活跃的开发者社区。 ## 🌟 核心功能演进:从兼容到创新 ### 1. 协议支持升级计划 OAuth-Plugin已实现RFC 5849

gitblog_00962的博客 526

每天一剂Rails良药之open_id_authentication

OpenID 是由LiveJournal和SixApart开发的一套身份验证系统。与目前流行的网站帐号系统(Passport)相比,OpenID具有开放性以及 分散式的特点。 它不基于某一应用网站的注册程序,而且不限制于单一网站的登录使用。OpenID帐号可以在任何OpenID应用网站使用,从而避免了多次 注册、填写 身份资料的繁琐过程。简单言之,OpenID就是一套以用户为中心的分散式身份验...

hideto 167

探索RailsKits:停止编写重复冗余的代码

对于编写网络应用程序来说,Ruby on Rails是近年来的一个流行Ruby架构。一个原因就在于编写网络应用程序的时候,需要重复地编写同样的基础功能,而RailsKits的出现有效地缓解了这个问题。\在进行应用程序的核心部分开发之前,开发者必须要完成一些东西。例如很多使用Ruby On Rails开发的程序需要实现认证、自动付款以及其他商业应用。RailsKits就是为了快速解决这样的问题而生。...

cpongo5 289
上一篇: Ruby Console 插件 --- Hirb
下一篇: acts_as_authenticated 插件的安装
cnvisual
博客等级 码龄18年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值