Module: Devise::Models::CasAuthenticatable::ClassMethods

Defined in:
lib/devise_cas_authenticatable/model.rb

Instance Method Summary collapse

Instance Method Details

#authenticate_with_cas_ticket(ticket) ⇒ Object

Authenticate a CAS ticket and return the resulting user object. Behavior is as follows:

  • Check ticket validity using RubyCAS::Client. Return nil if the ticket is invalid.

  • Find a matching user by username (will use find_for_authentication if available).

  • If the user does not exist, but Devise.cas_create_user is set, attempt to create the user object in the database. If cas_extra_attributes= is defined, this will also pass in the ticket's extra_attributes hash.

  • Return the resulting user object.


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/devise_cas_authenticatable/model.rb', line 18

def authenticate_with_cas_ticket(ticket)
  ::Devise.cas_client.validate_service_ticket(ticket) unless ticket.has_been_validated?
  
  if ticket.is_valid?
    identifier = nil
    ticket_response = ticket.respond_to?(:user) ? ticket : ticket.response

    identifier = extract_user_identifier(ticket_response)

    # If cas_user_identifier isn't in extra_attributes,
    # or the value is blank, then we're done here
    return log_and_exit if identifier.nil?

    logger.debug("Using conditions {#{::Devise.cas_username_column} => #{identifier}} to find the User")

    conditions = { ::Devise.cas_username_column => identifier }
    resource = find_or_build_resource_from_conditions(conditions)
    return nil unless resource
    
    resource.cas_extra_attributes = ticket_response.extra_attributes \
      if resource.respond_to?(:cas_extra_attributes=)

    resource.save
    resource
  end
end