apachecon 2014: infinite session clustering with apache shiro & cassandra

Post on 10-May-2015

1.264 Views

Category:

Technology

6 Downloads

Preview:

Click to see full reader

DESCRIPTION

In this session Les Hazlewood, the Apache Shiro PMC Chair, will cover Shiro's enterprise session management capabilities, how it can be used across any application (not just web or JEE applications) and how to use Cassandra as Shiro's session store, enabling a distributed session cluster supporting hundreds of thousands or even millions of concurrent sessions. As a working example, Les will show how to set up a session cluster in under 10 minutes using Cassandra. If you need to scale user session load, you won't want to miss this!

TRANSCRIPT

#ApacheCon

Infinite Session Clustering with Apache Shiro & Cassandra

Les Hazlewood @lhazlewoodApache Shiro Project Chair

CTO, Stormpath stormpath.com

ApacheCon 2014

#ApacheCon

.com• User Management and Authentication API• Security for your applications• User security workflows• Security best practices• Developer tools, SDKs, libraries

#ApacheCon

• Application security framework

• ASF TLP http://shiro.apache.org

• Quick and Easy

• Simplifies Security

What is Apache Shiro?

#ApacheCon

Web Session Management

Auxiliary Features

AuthorizationAuthentication

CryptographySession

Management

Web Support

#ApacheCon

Quick Concepts

Subject currentUser = SecurityUtils.getSubject();

currentUser.login(...)currentUser.isPermitted(...)

IBM_USER
Font too small. Can we reduce the line count of this code block?

#ApacheCon

Session Management DefinedManaging the lifecycle of Subject-specific

temporal data context

#ApacheCon

Session Management Features• Heterogeneous client access• POJO/J2SE based (IoC friendly)• Event listeners• Host address retention• Inactivity/expiration support (touch())• Transparent web use - HttpSession• Container-Independent Clustering!

#ApacheCon

Acquiring and Creating SessionsSubject subject =

SecurityUtils.getSubject()

//guarantee a session

Session session = subject.getSession();

//get a session if it exists

subject.getSession(false);

#ApacheCon

Session APIgetStartTimestamp()

getLastAccessTime()

getAttribute(key)

setAttribute(key, value)

get/setTimeout(long)

touch()

...

#ApacheCon

Session Management ArchitectureSubject .getSession() Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

.getSession() Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

.getSession()

Session Factory

Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session Factory

Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session ID Generator

Session Factory

Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session ID Generator

Session Cache

Session Factory

Session

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session ID Generator

Session Cache

Session Factory

Session

Data store

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session ID Generator

Session Cache

Session Factory

ValidationScheduler

Session

Data store

#ApacheCon

Session Management ArchitectureSubject

SessionManager

SessionDAO

.getSession()

Session ID Generator

Session Cache

Session Factory

ValidationScheduler Session

Listeners

Session

Data store

#ApacheCon

Session Clustering:Clustered Data Store of Choice

SessionDAO

Session ID Generator

Session Cache

ValidationScheduler

Data store

#ApacheCon

Web Configuration• web.xml elements

• Protects all URLs

• Innovative Filtering (URL-specific chains)

• JSP Tag support

• Transparent HttpSession support

#ApacheCon

web.xml<listener> <listener-class> org.apache.shiro.web.env.EnvironmentLoaderListener </listener-class></listener>

<filter> <filter-name>ShiroFilter</filter-name> <filter-class> org.apache.shiro.web.servlet.ShiroFilter </filter-class></filter>

#ApacheCon

web.xml cont’d<filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher></filter-mapping>

#ApacheCon

shiro.ini overview[main]# bean config here

[users]# optional static user accounts (and their roles) here

[roles]# optional static roles (and their permissions) here [urls]# filter chains here

#ApacheCon

Session Clustering

#ApacheCon

Two Approaches• Write a SessionDAO

• Use EnterpriseCacheSessionDAO and write a CacheManager

#ApacheCon

Cassandra SessionDAO

#ApacheCon

SessionDAO Concerns

SessionManager

SessionDAO

Session ID Generator

Session Cache

Data store

#ApacheCon

Custom SessionDAOpublic class MySessionDAO extends AbstractSessionDAO { protected void doCreate(Session s){...} protected void doReadSession(Serializable id){...} protected void delete(Session s){...} protected void update(Session s){...} Collection<Session> getActiveSessions(){...}}

Or

public class MySessionDAO extends CachingSessionDAO {... //enables write-through caching}

#ApacheCon

Native Web Session Manager[main]sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManagersecurityManager.sessionManager = $sessionManager

#ApacheCon

Cassandra SessionDAO[main]...

cassandraCluster = com.leshazlewood.samples.shiro.cassandra.ClusterFactory

sessionDAO = com.leshazlewood.samples.shiro.cassandra.CassandraSessionDAOsessionDAO.cluster = $cassandraClustersessionDAO.keyspaceName = shirosessionssessionDAO.tableName = sessions

...

#ApacheCon

Plug in the SessionDAO[main]...sessionManager.sessionDAO = $sessionDAO

#ApacheCon

Sessions Table (CQL 3)CREATE TABLE sessions ( id timeuuid PRIMARY KEY, start_ts timestamp, stop_ts timestamp, last_access_ts timestamp, timeout bigint, expired boolean, host varchar, serialized_value blob)

#ApacheCon

No Validation Scheduler?

#ApacheCon

No Validation Scheduler?Use Cassandra’s TTL

#ApacheCon

TTL for session timeout[main]# Cassandra can enforce a TTL. # No need for Shiro to invalidate!

sessionManager.sessionValidationSchedulerEnabled = false

#ApacheCon

Session Upsert (CQL 3)UPDATE sessions USING TTL $timeout SET start_ts = ?, stop_ts = ?, last_access_ts = ?, timeout = ?, expired = ?, host = ?, serialized_value = ?WHERE id = ?

#ApacheCon

But what about tombstones!?!?

#ApacheCon

Sessions Table (revised)CREATE TABLE sessions ( id timeuuid PRIMARY KEY, start_ts timestamp, stop_ts timestamp, last_access_ts timestamp, timeout bigint, expired boolean, host varchar, serialized_value blob) WITH gc_grace_seconds = 86400 AND compacation = {‘class’:’LeveledCompactionStrategy’}

#ApacheCon

But what about row caching?

#ApacheCon

Row Cache?Probably don’t need it (but maybe in some cases it would be useful)

• SSTable likely in Operating System page cache (off heap)

• DO use Key Cache (very important, enabled by default in 1.2)

#ApacheCon

Code$ git clone https://github.com/lhazlewood/shiro-cassandra-sample.git

$ cd shiro-cassandra-sample

$ $CASSANDRA_HOME/bin/cassandra

$ mvn jetty:run

Open a browser to http://localhost:8080

#ApacheCon

Thank You!• les@stormpath.com• Twitter: @lhazlewood• http://www.stormpath.com

top related