Library to generate and validate STs and TGTs
Add this line to your application's Gemfile:
gem 'cassette'And then execute:
$ bundleRequire this library and create an intializer to set its configuration:
Cassete.config = OpenStruct.new(
username: 'user',
password: 'secret',
service: 'test-api.example.org',
base: 'https://some-cas.example.org',
base_authority: 'CASTEST',
verify_ssl: true, # If not defined, the default value will be: false.
tls_version: 'TLSv1_2' # if not defined, the default value will be: 'TLSv1'.
)where config is an OpenStruct that responds to the methods base for the base CAS uri, username and password if you are authenticating on other systems and service and base_authority if you are using the authentication filter to authenticate your app.
You may also set the caching backend using the .backend= module method:
Cassette::Cache.backend = ActiveSupport::Cache::MemcacheStorage.newBy default, Cassette::Cache will check if you have Rails.cache defined or instantiate a new ActiveSupport::Cache::MemoryStore
To authenticate your Rails app, add to your ApplicationController (or any authenticated controller):
class ApplicationController < ActionController::Base
include Cassette::Authentication::Filter
# ...
endYou should also rescue from Cassette::Errors::Forbidden with more friendly errors
If you wish to have actions that skip the authentication filter, add to your controller:
class SomeController < ApplicationController
skip_authentication # [*options]
# skip_authentication only: "index"
endWhere options are the same options you can pass to Rails' skip_before_action method.
You also can skip the whole CAS authentication using an environment variable NOAUTH=true. The method current_user will keep available. This is useful for development environments. Be careful not to set and/or forget this variable in production environment.
You can the service being authenticated in a controller (or group of controllers). To do this, override the instance method authentication_service:
class ApiController < ApplicationController
def authentication_service
"api.#{super}"
# or maybe a hardcoded:
# "api.example.org"
# looking like regular RubyCAS, using the url
# request.url
end
endYour config object must respond to services and the filter will check your controller authentication_service against the list or the configured service.
In your initializer:
Cassete.config = OpenStruct.new(
# omitted
service: "example.org",
services: ["api.example.org", "www.example.org", "subdomain.example.org"]
)And in your controller:
class ApplicationController < ActionController::Base
def authentication_service
request.host
end
endIn this example, only tickets generated for api.example.org, www.example.org, subdomain.example.org or example.org will be accepted others will raise a Cassette::Errors::Forbidden.
If whitelisting services is not enough for your application, you can override the accepts_authentication_service? in your controller.
This method receives the service and returns a boolean if the service is ok or not.
class ApplicationController < ActionController::Base
def accepts_authentication_service?(service)
service.ends_with?('my-domain.com')
end
def authentication_service
request.host
end
endIf you are authenticating users with RubyCAS and want role checking, in your rubycas initializer:
require "cassette/rubycas"And in your ApplicationController (or any authenticated controller):
class SomeController < ApplicationController
include Cassette::Rubycas::Helper
# - Allow only employees:
#
# before_action :employee_only_filter
#
# rescue_from Cassette::Errors::NotAnEmployee do
# redirect_to '/403.html'
# end
# - Allow only customers:
#
# before_action :customer_only_filter
#
# rescue_from Cassette::Errors::NotACustomer do
# redirect_to '/403.html'
# end
endThis is useful if you want to mount an unauthenticated Rack app (like Resque)
Add to your config/routes.rb:
mount Resque::Server.new, at: '/resque', constraints: Cassette::Rubycas::RoutingConstraint.new(:admin)This will make your /resque route require your BASEAUTHORITY_ADMIN role.
You can also use raw roles:
mount Resque::Server.new, at: '/resque', constraints: Cassette::Rubycas::RoutingConstraint.new('OTHERAPP_ROLE', raw: true)And your /resque route will require the OTHERAPP_ROLE role.
You can create your own instances of Cassette::Client (st/tgt generator) and Cassette::Authentication (st validator).
The constructor accepts a hash with keys (as symbols) for the values of cache, logger, http_client and configuration.
All values default to the same values used when accessing the class methods directly.
Please check the constructors or integration specs for details.
It is a good idea to always clear the cache between tests, specially if you're
using VCR. You can do it by using the invoking the #clear method of the cache
backend in use. The following excerpt will clear the cache of the default client
Cassette::Client instance:
Cassette::Client.cache.backend.clear
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Added some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request