概述和配置使用
Shiro提供安全框架界独一无二的东西:一个完整的企业级Session 解决方案,可以为任意的应用提供session支持,包括web和非web应用,并且无需部署你的应用程序到Web 容器或使用EJB容器。
可以通过与当前执行的Subject 交互来获取Session:
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
session.setAttribute("someKey", someValue);
SessionManager是用来管理Session的组件,包括:创建,删除,inactivity(失效)及验证,等等。SessionManager 也是一个由SecurityManager 维护的顶级组件。
shiro提供了默认的SessionManager实现,一般没有必要自定义这个。
Shiro 的SessionManager 实现默认是30 分钟会话超时。
你可以设置SessionManager 默认实现的globalSessionTimeout 属性来为所有的会话定义默认的超时时间。例如,
[main]
# 3,600,000 milliseconds = 1 hour
securityManager.sessionManager.globalSessionTimeout = 3600000
你可以实现SessionListener 接口(或扩展易用的SessionListenerAdapter)并与相应的会话操作作出反应。 配置示例:
[main]
aSessionListener = com.foo.my.SessionListener
anotherSessionListener = com.foo.my.OtherSessionListener
securityManager.sessionManager.sessionListeners = $aSessionListener, $anotherSessionListener
SessionDAO
每当一个会话被创建或更新时,它的数据需要持久化到一个存储位置以便它能够被稍后的应用程序访问,实现这个功能的组件就是SessionDAO。
你能够实现该接口来与你想要的任何数据存储进行通信。这意味着你的会话数据可以驻留在内存中,文件系统,关系数据库或NoSQL 的数据存储,或其他任何你需要的位置。
[main]
sessionDAO = com.foo.my.SessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO
这种SessionDAO主要在本地应用中起作用。
[main]
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager
1:overflowToDisk=“true” - 这确保当你溢出进程内存时,会话不丢失且能够被序列化到磁盘上。
2: eternal=“true” - 确保缓存项(Session 实例)永不过期或被缓存自动清除。这是很有必要的,因为Shiro 基于计划过程完成自己的验证。如果我们关掉这项,缓存将会在Shiro 不知道的情况下清扫这些Sessions,这可能引起麻烦。
3:如果你想使用一个不同的名字而不是默认的,你可以在EnterpriseCacheSessionDAO 上配置名字,例如:sessionDAO.activeSessionsCacheName = myname
只要确保在ehcahe.xml 中有一项与这个名字匹配
Web应用中的Session
[main]
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
# Configure a SessionDAO and then set it:
securityManager.sessionManager.sessionDAO = $sessionDAO
[urls]
/rest/** = noSessionCreation, authcBasic
自定义SessionDAO
public class MySessionDAO extends AbstractSessionDAO{
private Map
public void update(Session session) throws UnknownSessionException {
System.out.println("now update session");
map.put(session.getId(),session);
}
public void delete(Session session) {
System.out.println("now delete session");
map.remove(session.getId());
}
public Collection
System.out.println("now getActiveSessions session");
return map.values();
}
protected Serializable doCreate(Session session) {
System.out.println("now doCreate session");
Serializable sessionId = generateSessionId(session);
assignSessionId(session, sessionId);
map.put(sessionId, session);
return sessionId;
}
protected Session doReadSession(Serializable sessionId) {
System.out.println("now doReadSession session");
return map.get(sessionId);
}
}
sessionDAO = cn.javass.hello.MySessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO