我们计划构建一个利用LDAP和数据库身份验证方式的Rails应用程序。
我们计划采用devise和devise_ldap_authenticatable来实现这一目标。
authlogic可能是这样的,内部使用通过LDAP完成身份验证,但是,外部用户必须首次注册,然后app才能进行数据库身份验证。
我通过谷歌搜索,Devise和devise_ldap_authenticatable不能以组合的方式工作,这里的任何人都有类似的用法,或者其他一些方法来实现它?
提前感谢。
答案 0 :(得分:1)
我在这里找到一些有价值的链接,但是,我们必须使用不同的模型。
https://groups.google.com/forum/#!topic/plataformatec-devise/-Fnr3LWXxBg
答案 1 :(得分:0)
我已通过以下方式实施双重身份验证。
<强> session_controller.rb 强>
def create
if (params[:log]=="local")
self.resource = warden.authenticate!(:database_authenticatable)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
else
self.resource = warden.authenticate!(:ldap_authenticatable)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
<强> user.rb 强>
class User < ActiveRecord::Base
devise :ldap_authenticatable,
:database_authenticatable,:registerable,
:recoverable, :rememberable, :trackable, :validatable
**and view devise/sessions/new.html.erb**
<%= form_for(:user, :url => session_path(:user)) do |f| %>
<div class="form-inputs">
<%= f.text_field :username ,:placeholder => "Login id" %><br> <br>
<%= f.password_field :password,:placeholder => "Password" %>
<label for="check_box_type">Login Server </label><%= select_tag :log, options_for_select([ [" Domain Server","domain"],["Local Server", "local"]])%>
<%= f.submit 'Sign in' %>
根据用户输入(登录服务器:local / domain),它将登录。
答案 2 :(得分:0)
对SessionsController的略微修改。这首先检查用户是否在本地数据库中。如果不是,则尝试LDAP。无需用户在登录时指定哪种帐户类型。请注意,我的本地数据库有一个已退休和bypass_ldap标志。如果bypass_ldap为false,则必须通过LDAP进行认证。
def create
# If the user has a valid ldap_bypass account
possible_user = User.where(username: params["user"]["username"], bypass_ldap: true, retired: false).first
if !possible_user.nil? && possible_user.valid_password?(params["user"]["password"])
self.resource = warden.authenticate!(:database_authenticatable)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
else
super
end
set_login_token
end