일부 사용자가 있지만 간단한 인트라넷 응용 프로그램을 작성 중이므로 일반 직원이 로그인 할 필요가 없습니다. 모든 컴퓨터에서 인트라넷을 방문하고 로그인하지 않고 필요한 것을 액세스 할 수 있어야합니다.레일 경로 및 인증?
많은 사용자가 원격이며 동일한 방식으로 상호 작용할 수 있어야합니다.
달성하고자하는 것은 다음과 같습니다. 로그인없이 루트 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
이를 달성하는 방법에 대한 모든 포인터를 감상 할 수있다. 감사!
내가 뭔가를 누락하지 않는 한, 그게 내가 이미 동일한 기능을 복제하지 않을까요? 화이트리스트에없는 사용자는 차단하고 화이트리스트에없는 사용자는 로그인하더라도 앱에 대한 액세스를 허용하지 않습니까? – dannymcc
@ dannymcc 죄송합니다 - 귀하의 주된 문제가 무엇인지 이해하지 못했습니다. 위에 업데이트되었습니다. – mccannf
당신은 물론 정확합니다. 정적 인 페이지는 혼란스러운 일입니다. 나는 기본적으로 허용 목록에없는 사람이라면 누구나 볼 수 있도록 로그인해야하며 허용 목록에있는 사람들은 인증이 필요하지 않은 것을보아야합니다. – dannymcc