什么是Subject对象
在shiro中我们通常会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。
Subject对象内置属性
Subject其实是一个声明接口,使用的默认类是WebDelegatingSubject,是DelegatingSubject的子类。其中这个WebDelegatingSubject里面含有以下的参数:
- principals:主键(或者标记的集合)
- authenticated :是否校验
- host :登录时的IP
- session :当前的session(经过shiro封装的)
- request :发起请求
- response :响应
- securityManager :spring中配置的securityManager
Subject的生命周期:每一次访问时都会创建一个新的subject,然后创建shiro封装后的session(封装的HttpSession),然后将这个新创建的subject绑定到ThreadContext上,然后通过securityUtils中在程序的任何地方调用getSubject时都会返回同一个subject,也就是本次请求创建的那个。由于之前存放在HttpSession中的信息还会存在,所以不会丢失信息。Subject获得httpSession的办法最终还是调用的request.getSession(true),也就是根据sessionID来获取session的。
每一次创建完成subject都会通过SubjectDAO将subject的属性存放到session中去,存放的只有两个,一个是principal(身份),一个是authenticated(是否校验)。