diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 48122e3c..bb5d6d18 100755 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -70,7 +70,6 @@ class AccountController < ApplicationController login = params[:username].strip password = params[:password] # 验证用户名密码是否正确 - @user, last_login_on = User.try_to_login(login, password) if @user.present? Rails.logger.info("successful_authentication, user is #{@user.try(:login)}") # 登录重置session;重新开启session有效时间等 @@ -1312,6 +1311,17 @@ class AccountController < ApplicationController def password_authentication user, last_login_on = User.try_to_login(params[:username], params[:password]) + logger.info("##############user_id##{user}") + if LocalSetting.first.try(:exam) && !user.admin? + if user.login_ip_info + if request.remote_ip != user.login_ip_info.remote_ip + ip_change_limit_login + return + end + else + LoginIpInfo.create(user_id:user.id, remote_ip: request.remote_ip) + end + end Rails.logger.info("password_authentication: params[:username] is #{params[:username]}, user is #{user}") if user.nil? @@ -1463,6 +1473,13 @@ class AccountController < ApplicationController render :action => 'register' end + def ip_change_limit_login + logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" + flash[:error] = "考试期间不能切换IP登录" + redirect_to signin_url + #render signin_path + end + def invalid_credentials logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" flash[:error] = l(:notice_account_invalid_creditentials) diff --git a/app/controllers/local_settings_controller.rb b/app/controllers/local_settings_controller.rb index fad30f60..20076a20 100755 --- a/app/controllers/local_settings_controller.rb +++ b/app/controllers/local_settings_controller.rb @@ -58,7 +58,8 @@ class LocalSettingsController < ApplicationController # PUT /local_settings/1.json def update @local_setting = LocalSetting.find(params[:id]) - + # 考试模式更新,先清除之前产生的记录 + LoginIpInfo.destroy_all respond_to do |format| if @local_setting.update_attributes(params[:local_setting]) if params[:local_setting][:exam] == "0" diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index cc5db9d2..881c5b25 100755 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -2091,6 +2091,15 @@ end end end + # 解锁IP功能 + def unlock_user_ip + logger.info("####unlock_user_ip user_id: #{params[:user_id]}") + if params[:user_id] + ip = LoginIpInfo.find_by_user_id(params[:user_id]) + ip.destroy if ip + end + end + def shixuns @menu_type = 3 @sub_type = 1 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 89e0cb70..d7519e23 100755 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2480,6 +2480,14 @@ module ApplicationHelper s.html_safe end + def render_flash_messages + s = '' + flash.each do |k,v| + s << content_tag('div', v.html_safe, :class => "alert alert-orange mb15 mt15", :id => "flash_#{k}") + end + s.html_safe + end + # Renders tabs and their content def render_tabs(tabs) if tabs.any? diff --git a/app/models/login_ip_info.rb b/app/models/login_ip_info.rb new file mode 100644 index 00000000..22077370 --- /dev/null +++ b/app/models/login_ip_info.rb @@ -0,0 +1,4 @@ +class LoginIpInfo < ActiveRecord::Base + # attr_accessible :title, :body + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb index 6d539017..f2b012e4 100755 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -160,6 +160,7 @@ class User < Principal ## added by xianbo for delete # has_many :biding_projects, :dependent => :destroy belongs_to :softapplication, :foreign_key => 'id', :dependent => :destroy + has_one :login_ip_info, :dependent => :destroy ##ended by xianbo #####fq @@ -447,7 +448,7 @@ class User < Principal # 平台认证的老师 def is_certification_teacher - self.user_extensions.identity == 0 && self.certification == 1 + self.user_extensions.try(:identity) == 0 && self.certification == 1 end def job_title diff --git a/app/views/account/login.html.erb b/app/views/account/login.html.erb index a4af9782..100df772 100755 --- a/app/views/account/login.html.erb +++ b/app/views/account/login.html.erb @@ -3,7 +3,8 @@