Project

General

Profile

Create new user if not detected by SSO

Added by César DJ Caësar 9114 almost 9 years ago

Hello,

I managed to edit application_controller.rb to get user login if he's authenticated by SSO. Now I want Redmine to create a user if the login sent by the SSO is not in the database. I wrote that but it doesn't work, the user becomes "anonymous". Can anybody help me to fix my code?
Thanks in advance :)

def find_current_user
    user = nil
    unless api_request?
      if session[:user_id]
        # existing session
        user = (User.active.find(session[:user_id]) rescue nil)
      elsif (sso_user = request.env["HTTP_AUTH_USER"]) # !!! THIS IS WHERE MY CODE BEGINS
        begin
          user = User.find_by_login(sso_user)
        rescue
          user = User.new({:firstname => "Test_First", :lastname=>"Test_Last",:mail=>request.env["HTTP_MAIL"]})
          user.login = request.env["HTTP_AUTH_USER"]
          user.password = "password" 
          user.password_confirmation = "password" 
            if (user.valid)
              user.save
            end
        end # !!! THIS IS WHERE MY CODE ENDS
      elsif autologin_user = try_to_autologin
        user = autologin_user
      elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth?
        # RSS key authentication does not start a session
        user = User.find_by_rss_key(params[:key])
      end
    end
    if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
      if (key = api_key_from_request)
        # Use API key
        user = User.find_by_api_key(key)
      else
        # HTTP Basic, either username/password or API key/random
        authenticate_with_http_basic do |username, password|
          user = User.try_to_login(username, password) || User.find_by_api_key(username)
        end
        if user && user.must_change_password?
          render_error :message => 'You must change your password', :status => 403
          return
        end
      end
      # Switch user if requested by an admin user
      if user && user.admin? && (username = api_switch_user_from_request)
        su = User.find_by_login(username)
        if su && su.active?
          logger.info("  User switched by: #{user.login} (id=#{user.id})") if logger
          user = su
        else
          render_error :message => 'Invalid X-Redmine-Switch-User header', :status => 412
        end
      end
    end
    user
  end

Here is my info:
Environment:
Redmine version 2.4.3.stable
Ruby version 1.9.3-p194 (2012-04-20) [x86_64-linux]
Rails version 3.2.16
Environment production
Database adapter Mysql2