什么是Subject对象

在shiro中我们通常会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。

Subject对象内置属性

Subject其实是一个声明接口,使用的默认类是WebDelegatingSubject,是DelegatingSubject的子类。其中这个WebDelegatingSubject里面含有以下的参数:

shiro源码分析01 -- Subject

  • 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(是否校验)。

相关文章: