We only went with a JPA registry for the sake of HA. Any ticket registry that 
allows multiple CAS servers to share a common ticket collection is acceptable 
for our needs. We don’t particularly need, for example, tickets to survive 
cluster-bounces.

On Jul 29, 2014, at 11:38 AM, Scott Battaglia <scott.battag...@gmail.com> wrote:

> Please be sure you understand the trade-offs for each registry.  Depending on 
> your use cases, EhCache or Hazelcast may not be a JPA-replacement.
> 
> 
> On Tue, Jul 29, 2014 at 2:30 PM, John Gasper <jgas...@unicon.net> wrote:
> Both support ticket replication:
> ehcache: https://wiki.jasig.org/display/CASUM/EhcacheTicketRegistry
> Hazelcast*: 
> https://github.com/Unicon/cas-addons/wiki/Configuring-HazelcastTicketRegistry
> 
> *This is an add-on project that Unicon maintains. It might be worth 
> mentioning that the ehcache inventor is now Hazelcast's CEO.
> 
> 
> On 7/29/14, 10:38 AM, Nick Sayer wrote:
>> On Jul 29, 2014, at 8:15 AM, John Gasper <jgas...@unicon.net>
>>  wrote:
>> 
>> 
>>> Hi Nick,
>>> 
>>> I apologize in advance for this non-answer, but the JPA Ticket Registry has 
>>> been plague with deadlock issues for some time. I'd recommend looking at 
>>> another ticket registry such as ehCache or Hazelcast as an alternative to 
>>> JPA. You should still be able to do what you are planning with either of 
>>> those.
>>> 
>> Thanks. I did see that note on the 4.0.0 JPA ticket registry wiki page, but 
>> still thought fixing it might have been a shorter path forward. We went with 
>> JPA for the sake of HA. Are either of those an HA solution (that is, 
>> parallel load balanced CAS servers sharing the ticket registry)? Where are 
>> they documented?
>> 
>> 
>>> John
>>> 
>>> On 7/28/14, 12:22 PM, Nick Sayer wrote:
>>> 
>>>> We?re extending CAS 3.5.2.1 for our enterprise?s use. We?re using 
>>>> hibernate core 4.1.0.Final and validator 4.2.0.Final. One requirement is 
>>>> to allow installers to permit only a single TGT per user or permitting a 
>>>> single user to only persist TGTs that are associated with a single IP 
>>>> address.
>>>> 
>>>> For the most part, we?ve got this working, but what we run into in 
>>>> production are database deadlocks when these features are enabled.
>>>> 
>>>> The only difference of any consequence is this method:
>>>> 
>>>>     private void stripTickets(String id) {
>>>>         TicketGrantingTicket tgt = 
>>>> (TicketGrantingTicket)ticketRegistry.getTicket(id, 
>>>> TicketGrantingTicket.class);
>>>>         if (tgt == null)
>>>>                 throw new RuntimeException("Could not find freshly minted 
>>>> TGT - should never happen!");
>>>>         Authentication auth = tgt.getAuthentication();
>>>>         if (auth == null)
>>>>                 throw new RuntimeException("TGT has no authentication - 
>>>> should never happen!");
>>>>         Principal myPrincipal = auth.getPrincipal();
>>>>         if (myPrincipal == null)
>>>>                 throw new RuntimeException("TGT auth has no principal - 
>>>> should never happen!");
>>>>         InetAddress myAddr = 
>>>> (InetAddress)auth.getAttributes().get("InetAddress");
>>>>         if (myAddr == null) {
>>>>                 logger.warn("Newly minted TGT has no InetAddress.");
>>>>                 return;
>>>>         }
>>>>         logger.trace("About to go through the ticket registry to 
>>>> stripTickets");
>>>>         Collection<TicketGrantingTicket> toExpire = new 
>>>> ArrayList<TicketGrantingTicket>();
>>>>         for(Ticket ticket : this.ticketRegistry.getTickets()) {
>>>>                 logger.trace("Examining ticket " + ticket.toString());
>>>>                 if (!(ticket instanceof TicketGrantingTicket)) continue;
>>>>                 TicketGrantingTicket thisTGT = 
>>>> (TicketGrantingTicket)ticket;
>>>>                 if (thisTGT.equals(tgt)) continue; // Don't kill yourself!
>>>>                 auth = thisTGT.getAuthentication();
>>>>                 if (auth == null) {
>>>>                         logger.warn("TGT in registry has no 
>>>> authentication.");
>>>>                         continue;
>>>>                 }
>>>>                 Principal thisPrincipal = auth.getPrincipal();
>>>>                 InetAddress thisAddr = 
>>>> (InetAddress)auth.getAttributes().get("InetAddress");
>>>>                 if (myPrincipal.getId().equals(thisPrincipal.getId())) {
>>>>                         // It's the same user. Do we kill it?
>>>>                         if (singleSessionPerUser || 
>>>> !myAddr.equals(thisAddr)) {
>>>>                                 
>>>> logger.info
>>>> ("Expiring TGT ID " + thisTGT.getId() + " for user " + 
>>>> thisPrincipal.getId() + " from IP " + thisAddr.toString());
>>>>                                 toExpire.add(thisTGT);
>>>>                         }
>>>>                 }
>>>>         }
>>>>         logger.trace("Now we've got a ticket expiration list with " + 
>>>> toExpire.size());
>>>>         for(TicketGrantingTicket ticket : toExpire) {
>>>>                 ticket.expire();
>>>>                 this.ticketRegistry.deleteTicket(ticket.getId());
>>>>         }
>>>>         System.err.println("Exiting the purge");
>>>>     }
>>>> 
>>>> 
>>>> So, in a nutshell, what we?re doing is iterating through 
>>>> this.ticketRegistry.getTickets() and selecting a list of tickets on which 
>>>> we wish to take action. Once we?re finished iterating, we go through the 
>>>> list of actionable tickets, expire each one and delete it from the 
>>>> registry.
>>>> 
>>>> Is this method fraught with peril? Is there anything we can do to attempt 
>>>> to prevent deadlocks? They seem to happen in testing even with a single 
>>>> user just logging in once after another in isolation - which seems awfully 
>>>> fragile to me.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>> -- 
>>> John Gasper
>>> IAM Consultant
>>> Unicon, Inc.
>>> PGP/GPG Key: 0xbafee3ef
>>> -- 
>>> You are currently subscribed to 
>>> 
>>> cas-dev@lists.jasig.org
>>> 
>>>  as: 
>>> nsa...@silverspringnet.com
>>> 
>>> To unsubscribe, change settings or access archives, see 
>>> http://www.ja-sig.org/wiki/display/JSG/cas-dev
>>> 
>>> 
>>> 
> 
> -- 
> John Gasper
> IAM Consultant
> Unicon, Inc.
> PGP/GPG Key: 0xbafee3ef
> -- 
> You are currently subscribed to 
> cas-dev@lists.jasig.org as: scott.battag...@gmail.com
> 
> To unsubscribe, change settings or access archives, see 
> http://www.ja-sig.org/wiki/display/JSG/cas-dev
> 
> -- 
> You are currently subscribed to 
> cas-dev@lists.jasig.org
>  as: nsa...@silverspringnet.com
> To unsubscribe, change settings or access archives, see 
> http://www.ja-sig.org/wiki/display/JSG/cas-dev
> 


-- 
You are currently subscribed to cas-dev@lists.jasig.org as: 
arch...@mail-archive.com
To unsubscribe, change settings or access archives, see 
http://www.ja-sig.org/wiki/display/JSG/cas-dev

Reply via email to