Technically, setting the cacheManager should be fine provided that the cache manager returns a different cache for each name passed to "getCache". In reality, you probably don't want to use a redis-based cache for authorization - in the authorization case, the goal of the cache is to reduce the amount of hits to your postgres DB. So it would make more sense to use something in-process like ehcache here (i think).
On Thu, Mar 21, 2013 at 11:04 AM, NabbleSometimesSucks < [email protected]> wrote: > Yes we are using custom caching. > > Our Realm uses data from a Postgres database > > Our custom Cache is using data from Redis. > > At first when looking at the code we use in the Realm, there is no code > directly referencing our Cache or CacheManager, but looking at our Spring > configuration I am setting the cacheManager property in the Realm, which > comes from extending AuthorizingRealm. > > I actually, haven't seen this exception come up anymore, but are you saying > I shouldn't be setting the cacheManager property? > > Here is our code > > @Transactional > public class BlahRealm extends AuthorizingRealm { > > @Autowired > ApplicationContext context; > > private AccountService accountService; > > private AccountService getAccountService() { > if (this.accountService == null) { > this.accountService = context.getBean(AccountService.class); > } > return this.accountService; > } > > private SimpleAccount getAccount(String username) { > AccountSecurity accountSecurity = > getAccountService().findByUserName(username); > if (accountSecurity == null) { > return null; > } > > //ByteSource byteSource = > ByteSource.Util.bytes(accountSecurity.getSaltValue()); > MutablePrincipalCollection principalCollection = new > SimplePrincipalCollection(); > principalCollection.add(accountSecurity.getUsername(), getName()); > principalCollection.add(accountSecurity.getId(), getName()); > > SimpleAccount account = new SimpleAccount(principalCollection, > accountSecurity.getPassword(), getName()); > Set<UserRole> roles = accountSecurity.getRoles(); > for (UserRole role : roles) { > account.addRole(role.getRole()); > } > > Set<UserGroup> groups = accountSecurity.getGroups(); > for (UserGroup group : groups) { > account.addStringPermission(group.getName()); > } > return account; > } > > @Override > protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection > principals) { > String username = (String)principals.getPrimaryPrincipal(); > return getAccount(username); > } > > @Override > protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken > authenticationToken) throws AuthenticationException { > UsernamePasswordToken upToken = (UsernamePasswordToken) > authenticationToken; > return getAccount(upToken.getUsername()); > } > > @Override > public String getName() { > return "BlahRealm"; > } > > @Override > public boolean supports(AuthenticationToken authenticationToken) { > return (authenticationToken instanceof UsernamePasswordToken); > } > } > > > > And here is our Spring configuration for that bean > > <bean id="blahRealm" > class="com.blah.account.security.shiro.realm.BlahRealm"> > <property name="name" value="blah"/> > <property name="credentialsMatcher" ref="credentialsMatcher"/> > <property name="cacheManager" ref="cacheManager"/> > </bean> > > Thanks for taking the time to look at this. I might just remove the > cacheManager property setting to see what happens. > > Thanks > > Mark > > > > -- > View this message in context: > http://shiro-user.582556.n2.nabble.com/Getting-a-ClassCast-Exception-with-taglib-SimpleSession-tp7578430p7578492.html > Sent from the Shiro User mailing list archive at Nabble.com. >
