2012-10-21 3 views
1

일부 사용자가 있지만 간단한 인트라넷 응용 프로그램을 작성 중이므로 일반 직원이 로그인 할 필요가 없습니다. 모든 컴퓨터에서 인트라넷을 방문하고 로그인하지 않고 필요한 것을 액세스 할 수 있어야합니다.레일 경로 및 인증?

많은 사용자가 원격이며 동일한 방식으로 상호 작용할 수 있어야합니다.

달성하고자하는 것은 다음과 같습니다. 로그인없이 루트 URL로 곧바로 이동하는 IP 주소 & 서브넷 목록 (관리자는 여전히 로그인 할 수 있음) 허용 된 IP 목록 인 & 서브넷에없는 방문자는 정적 액세스 거부 페이지가 표시됩니다. 해당 페이지에서 로그인 링크 여야합니다. 일단 로그인하면 허용 된 서브넷에있는 것처럼 인트라넷과 상호 작용할 수 있습니다. 로그 아웃하면 액세스 거부 페이지가 다시 표시됩니다.

나는 내 응용 프로그램 컨트롤러에 다음 코드를 가지고 :

class ApplicationController < ActionController::Base 
    before_filter :protect 
    protect_from_forgery 
    private 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    rescue ActiveRecord::RecordNotFound 
    end 

    helper_method :current_user 

    def authorized? 
    not current_user.nil? 
    end 

    def authorize 
    redirect_to login_url, alert: "Not authorized" unless authorized? 
    end 

    def authorize_admin 
    redirect_to login_url, alert: "Not authorized" unless authorized? && current_user.admin? 
    end 

    def protect 
    @ips = ['127.0.0.1','123.123.123.12','192.168.5.0/24'] 
    allowed = false 
     bremote_ip = 0 
     request.remote_ip.split('.').each { |x| bremote_ip = (bremote_ip << 8) + x.to_i } 
     @ips.each do |ipstring| 
     ip, mask = ipstring.split '/' 
     mask = mask ? mask.to_i : 32 
     bip = 0 
     ip.split('.').each { |x| bip = (bip << 8) + x.to_i } 
     bmask = ((1 << mask) - 1) << (32 - mask) 
     if bip & bmask == bremote_ip & bmask 
      allowed = true 
      break 
     end 
    end 

    if not allowed 
     render :template => "static/protect", :layout => "static" 
     return 
    end 
    end 

end 

이를 달성하는 방법에 대한 모든 포인터를 감상 할 수있다. 감사!

답변

3

에서 : Rails 3 - Whitelisting list of IPs via routes

netaddr 보석 사용 :이 경우

before_filter :protect 

def protect 
     @ips = [] 
     @ips << NetAddr::CIDR.create('127.0.0.0/8') 
     @ips << NetAddr::CIDR.create('192.168.5.0/24') 
     @ips << NetAddr::CIDR.create('123.123.123.12') 
     valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) } 
     if valid.empty? and !authorized? 
     authorize 
     return 
     end 
end 

편집

을 바로 위의 예는 정적 보호 페이지를 건너 뛰고 로그인에 사용자를 리디렉션 페이지. 중간 정적 페이지의 필요성을 이해하지 못했습니까?

참고 : "너무 많은 리디렉션"오류가 발생하지 않도록 before_filter 문에 :except을 추가 할 수 있습니다. 당신이 고안를 사용하는 경우 또는, 당신은 config/application.rb이 추가 :

# In config/application.rb 
module YourAppNameHere 
    class Application < Rails::Application 
    # Whatever else is already here... 

    # The part to add 
    config.to_prepare do 
     Devise::SessionsController.skip_before_filter :protect 
    end 
    end 
end 
+0

내가 뭔가를 누락하지 않는 한, 그게 내가 이미 동일한 기능을 복제하지 않을까요? 화이트리스트에없는 사용자는 차단하고 화이트리스트에없는 사용자는 로그인하더라도 앱에 대한 액세스를 허용하지 않습니까? – dannymcc

+0

@ dannymcc 죄송합니다 - 귀하의 주된 문제가 무엇인지 이해하지 못했습니다. 위에 업데이트되었습니다. – mccannf

+0

당신은 물론 정확합니다. 정적 인 페이지는 혼란스러운 일입니다. 나는 기본적으로 허용 목록에없는 사람이라면 누구나 볼 수 있도록 로그인해야하며 허용 목록에있는 사람들은 인증이 필요하지 않은 것을보아야합니다. – dannymcc