在RAILS中使用单点登录CAS 客户端( cas client for rails)

June 05, 2018 17:52
访问量:820
摘要:rails 项目中实现单点登录

Ruby 客户端使用方法

1. 在Gemfile中,加入:

gem 'rubycas-client', :git => 'git://github.com/rubycas/rubycas-client.git'

注意: 不要使用 'rubycas-client-rails' 这个GEM。这个gem会使得你的配置过程不透明,难于调试。

2. environment.rb的结尾,加上:

CASClient::Frameworks::Rails::Filter.configure(
    :cas_base_url => "http://10.103.13.121:333"     #cas远程的域名或ip
)

3. 对应的app/controllers/application_controller.rb中, 加上:

before_filter CASClient::Frameworks::Rails::Filter

注释掉before_filter :authenticate_user!  devise的东西

4. 在sessions_controller.rb (如果没有的话创建一个)中定义退出的action:

class SessionsController < ApplicationController
  def destroy
    CASClient::Frameworks::Rails::Filter.logout(self)
  end
end

5. 修改 route.rb ,加入退出的链接(注释devise_for :users):

 match '/logout' => "sessions#destroy", :as => :logout, :via => :delete

6. 修改 application.html.erb 布局文件,增加这个链接。

关键的一点是:在经典的rails authorization 框架用,都是用 current_user 这个变量取得当前登陆的用户。在CAS CLIENT中,用的是 session[:cas_user],只取得当前用户名,是一个string. 而不是一个model.

<div style="border: 1px solid green">
  <%= session[:cas_user] %> 
</div>
<% if session[:cas_user] %>
  <%= link_to "logout" , logout_path %> 
<% end %>

7. 在服务器上搭建一个 rubycas-server , 在application_controller中加入了:before_filter CASClient::Frameworks::Rails::Filter 渲染需要登录的页面都会去这个rubycas-server中验证,是否给了stamp(船票)。 具体搭建方法按照文章末尾的链接即可。

8.项目增加一个接口,验证账号密码是否正确,然后由rubycas-server决定是否给船票,登录。

class Interface::UsersController < Interface::ApplicationController
  def authorize
    user = User.find_by_email(params[:username])
    # valid_password?  是devise验证密码的方法
    if user.present? and user.valid_password?params[:password]       
      render :text => "ok"
    else
      render :text => "fail"
    end
  end
end

参考博客:

评论

暂无相关评论,快来抢占沙发吧!
评论框离家出走了,点击找回!
昵称
邮箱
网站
昵称
邮箱
网站