module Devise module Strategies class IdCardAuthenticatable < Devise::Strategies::Authenticatable def valid? env['SSL_CLIENT_S_DN_CN'].present? end def authenticate! resource = mapping.to user = resource.find_by_id_card(id_card) if user success!(user) else fail end end private def id_card id_card = IdCard.new id_card.first_name = first_name id_card.last_name = last_name id_card.personal_code = personal_code id_card.country_code = country_code id_card end def first_name env['SSL_CLIENT_S_DN_CN'].split(',').second.force_encoding('utf-8') end def last_name env['SSL_CLIENT_S_DN_CN'].split(',').first.force_encoding('utf-8') end def personal_code env['SSL_CLIENT_S_DN_CN'].split(',').last end def country_code env['SSL_CLIENT_I_DN_C'] end end end end Warden::Strategies.add(:id_card_authenticatable, Devise::Strategies::IdCardAuthenticatable)