Shiro框架奥利给!!
Shiro 框架是一个开源的安全框架,它将软件系统中的安全认证等功能提取出来 实现用户的身份认证,权限授权,加密,会话,缓存等功能的管理 组成一个通用的安全认证框架
1.shiro身份认证的过程分析及实现(判定用户身份的合法性),为什么要认证?
2.Shiro授权过程分析及实现(对资源访问进行权限授权)为什么要授权?
3.Shiro 缓存,会话时长,记住我等功能的实现.为什么要使用此缓存,是否可以使用第三方缓 存?
4.Shiro框架的核心组件?Shiro中的session的默认时长是多少?
-
?shiro 中授权功能的实现?
Spring整合shiro框架,在需要授权的方法上+注解 底层会在访问方法时 检查注解拿到注解的内容,提交给安全管理器,基于注解的内容对用户的权限进行管理 -
?Shiro 缓存,会话时长,记住我等功能的实现.为什么要使用此缓存,是否可以使用第三方缓存?
Shiro缓存中底层使用的softHashMap 在JVM内存满时清除缓存!
使用缓存的原因是因为 每次进行授权的时候,都要进行查询数据库中多张表的操作,如果在高并发的时候使用缓存更能提高性能! -
?记住我功能的实现,以及为什么要设计这个功能?
记住我功能是shiro框架自己带的特性,需要在服务器端创建cookie 在客户端存储用户信息.所以要打开cookie,服务器配置cookiemanager 同时注入给 安全管理器 修改过滤信息
设计记住我功能是因为用户选择性的使用,记住我 可以实现不用每次登陆都需要验证 -
?Shiro中使用的会话是谁?httpsession默认时长?30分钟
private Cookie sessionIdCookie;
private boolean sessionIdCookieEnabled;
private boolean sessionIdUrlRewritingEnabled;
public DefaultWebSessionManager() {
Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
cookie.setHttpOnly(true); //more secure,
我们使用了 ShiroHttpSession查看源码:
public class ShiroHttpSession implements HttpSession {
//TODO - complete JavaDoc
public static final String DEFAULT_SESSION_ID_NAME = "JSESSIONID";
private static final Enumeration EMPTY_ENUMERATION = new Enumeration() {
? 我们来猜测 我们使用的shiro中的session是否是web HTTP中的HTTPSession,以及它的调用过程是怎样的呢
?通过我们断点跟踪发现确实是将数据存到了HTTPSession 但是却没有执行 它的实现类中 任何add以及put 的方法,那么它是如何实现将数据存储到HTTPSession中的呢?
这时候我们就假设它并不是继承或者实现 而是一种has a关系 我们查看了 原来shiro 自己还有一个Session接口,源码如下:
通过断点我们得出了shiro 使用了 SimpleSession 同时注入了HttpServletSession 在HttpServletSession源码构造方法中我们可以看出has a httpSession
public class HttpServletSession implements Session {
private static final String HOST_SESSION_KEY = HttpServletSession.class.getName() + ".HOST_SESSION_KEY";
private static final String TOUCH_OBJECT_SESSION_KEY = HttpServletSession.class.getName() + ".TOUCH_OBJECT_SESSION_KEY";
private HttpSession httpSession = null;
public HttpServletSession(HttpSession httpSession, String host) {
if (httpSession == null) {
String msg = "HttpSession constructor argument cannot be null.";
throw new IllegalArgumentException(msg);
}
如何实现存储?直接调用了put方法
public void setAttribute(Object key, Object value) {
if (value == null) {
removeAttribute(key);
} else {
getAttributesLazy().put(key, value);
}
}