`
suichangkele
  • 浏览: 198118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
上一节说的是subject,这次说一下如何构成subejct——使用subjectContext类。这个类就是一个map,然后将构建subject的所有属性都组织到一起,然后传递给一个subjectFactory,用于构成一个subject。 他的里面也含有subject,并且每一次在创建新的subject的时候都会去尝试调用getSubject方法以获得原来的subject,但是我在setSubject上加了断点,从来没有遇到过setSubject的情况。   用于组成subject的属性都有这些:   Securitymanager, request,
前一节的subjectContext最终将传入subjectFactory用于构建一个subject。subjectFactory很简单,就是将通过subjectcontext传递过来的值产生一个subject,默认使用的subjectContext是DefaultSubjectFactory,它将返回一个DelegatingSubject实例。
前面说完了subject的创建过程,创建完成之后会保留起来,保subject的操作就需要subejctDao来实现。 既然每一次访问都会创建一个新的subject,那么为什么还需要dao来存储呢?其实Subjectdao做的事情很少,没有存储subject,只是将当前subject的校验信息(isAuthenticated)和principalCollection放入到session中。(我没有想到任何不存储第一次创建的subject的原因,包括创建的session也是,每一次访问时都会创建一个新的session,当然
我们知道直接调用SecurityUtils.getSubject这个方法可以返回当前的用户,他是怎么做到的呢,这个原理和spring的声明式事物或者是hibernate的open-session-in-view的实现是一个道理,都是讲某些资源在访问的一开始就创建,然后使用threadLocal(也就是线程局部变量)模式将目标资源绑定到当前线程上,当再次调用上时,直接从threadLocal上调用以当前线程为key的value即可。shiro在实现这个功能时就是使用了这个ThreadContext类,shiro在绑定的资源的时候不是只有一个subejct,而是绑定了一个map<Objec ...
这个接口用于将线程执行中的对象绑定到线程上或者在某些时候将不需要的对象从线程上解绑定。 bind方法:将对象绑定到对象上方便以后的调用。 Resotore方法:在线程结束之后如果是抛了异常之后,线程必须回复成原来的样子,这样可以保证线程在重复使用的时候的干净调用,放置出错。这个方法比最好用try  finally的方式调用。 书写格式例子 ThreadState state = // try{ state.bind(); dosomething(); }finally{ state.restore(); }   他得实现类: ...
说实话,这个类我没怎么明白,我写这个都是看的javadoc,是对javadoc的翻译。 这个类将一个Callable关联到subject上,来保证当callable运行时的subject的管理,通过这个callbale,可以保证在运行时的securityUtils.getSubject正确执行,即使callable运行的线程不是产生这个callable的线程。这样就保证了即使是异步的执行,也能正确的获得subject。   这个类实现了Callable,所以可以被直接用作一个
上面说了shiro对httpSession的封装,封装成shiro自己的session类,这里说如何建立shiro的session——SessionManager类。 SessionManager用于管理shiro的session的创建(不是httpSession),默认使用的是ServletContainerSessionManager,在defaultWebSecurityManager创建的时候就会实例化一个ServletContainerSessionManager实例。 源码如下: public DefaultWebSecurityManager() {         s ...
Shiro对原始的httpSession进行了封装,在最初的创建shiro的session的时候是将的原始的HttpSeesion封装进了一个HttpServetSession,我们查看一下这个HttpServeltSession的所有的方法,除了touch方法和与maxTimeout方法相关的,都是直接调用的封装的HttpSeesion,touch方法很简单,就是让封装的httpSession更新一下最近访问时间,防止其失效,在失效时间(timetout)上shiro封装的是按照毫秒的,而HTTPSession是按照秒的。 还有一个方法stop,调用的是httpSession.inval ...
<!--[if !supportLists]-->1、    前面已经介绍完了创建subject用户和封装shiro自己的session,这里介绍用户的登录和退出。  <!--[endif]-->直登录直接调用subject.login(token)方法即可,因为我们在创建subject的时候就把securityManager传入到了subject中,所以subject可以调用securManager的方法,当调用login时,就会调用securityManager会调用里面的login方法。 我们使用的securityManager是DefaultSecurit ...
从这一节开始开始学习请求的访问控制,即用户的每一次的访问的限制,这个事根据配置的用户的角色和权限来决定url对于特定的用户能不能访问。   我们从shiroFilterFactoryBean开始。 这个类是真正的filter,我们在web.xml中配置的DelegatingFilterProxy其实就是代理的他,当每一次请求来了之后,这个代理的fiter会将请求转发给这个正真的filter,但是这个真正的filter并没有实现filter接口,他往spring的 context中放置的就是一个filter——SpringShiroFilter,原因在于他的getObject方法返回的值 ...
前面说了访问控制权限是使用路径模板和对应的filter来配合使用的,但是如何将路径模板和路径匹配起来呢,这里就要使用PatternMatcher,shiro中默认使用的是AntPathMatcher。当某个请求来到时,会挨个的将我们配置的路径模板与当前的路径进行匹配,如果匹配得上,就调用这哥模板的filter,现在我们关心的是如何进行匹配的,通过调用的AntPathMatcher中的matchStart方法,如果返回的是true,就表示匹配。这个方法很大很大,有200多行,我没看,但是我们可以在实际工作中用这个方法进行检查,如果匹配成功就说明我们的配置没有问题。  
我们可以在spring的xml中配置任意数量的filter,即servet的filter,然后对某个路径或者是路径模板的访问使用这个filter。但是如何管理路径和filter的组合呢?这里介绍路径和filter的管理类——filterChainManager。这个类用于管理我们在shiroFilterFactoryBean中配置的过滤器和模板,以及配置的参数。  使用的实现类是DefaultFilterChainManager,源码在shiroFilterFactoryBean中的构造方法中的createFilterChainManager方法,  我们在spring的xml中配置的f ...
这个类是上面的OncePerRequestFilter的子类,实现了其doInternalFilter方法,所有的业务逻辑在里面实现。这个类也是一个抽象类,但是没有任何的抽象方法,所以只要集成他就可以直接使用了。 这是一个及其重要的类,shiro集成spring ...
在经过前面的filterChainManager和FilterChainResolver,PatternMatcher之后就会找到访问某个路径的filter,然后filter中就检查当前的subejct是否具有需要的有某个角色或者是权限。这个时候就会调用subject.isPermitted或者是subject.hasRole方法。这个方法的调用类似于我们之前在登陆校验时的方法调用,会调用组成当前subejct的securityManager的这个方法: publicboolean isPermitted(String permission) {        
从这一节开始我们介绍shiro提供的filter,记住尽管这是shiro提供的,但是不一定适合你的项目,我们看他们源码的目的是理解其中的运行逻辑,在开发中不一定强制要求使用他们提供的filter。 我们从OnecPerRequestFilter,虽然这个类不是一个最顶层的类,他还有父类NameableFilter,但是NameableFilter我在开发中没有使用它提供的名字的便利性,而是根据在spring中配置的benaName决定filter的名字,所以直接跳过NameableFilter。OnecPerRequestFilter这个类是所有的其他的filter的父类,所有的filte ...
Global site tag (gtag.js) - Google Analytics