总的参考文档:http://shiro.apache.org/reference.html
本文参考文档:http://shiro.apache.org/configuration.html
原文中关于配置的话题是概述中的一节,配置很重要也有点小复杂,这里把它独立出来成为一章。
1、SecurityManager组件图
首先明确一点,在使用Shiro之前要先进行配置,那么配置的目的是什么?配置的东西是什么?首先再看一下Shiro的详细架构图:
重点关注SecurityManager这一块。前文说过,SecurityManager相当于是一个大帽子,里边有很多组件。在进行应用开发时,我们需要实例化一个SecurityManager对象。SecurityManager包含很多组件,在实例化SecurityManager之前,要先实例化Authenticator、Authorizer等各种组件,然后再通过SecurityManager的各种setter方法或者构造函数将Authenticator、Authorizer等组件设置进去,最后完成SecurityManager的初始化。Authenticator、Authorizer等各种组件可以是Shiro内置实现,也可以是开发者自定义的实现。
配置的目的就是控制应用如何始化SecurityManager包含的各种组件以及SecurityManager本身的初始化。
2、硬编码配置
SecurityManager本身及它包含的所有组件都是JAVA BEAN对象,我们可以通过在程序以硬编码的方式实例化SecurityManager及它包含的各种组件,绕过配置文件,当然一般不会这么干。看两个示例。
示例1:
Realm realm = new MyRealm(param1, param2, param3,...);
SecurityManager securityManager = new DefaultSecurityManager(realm);
SecurityUtils.setSecurityManager(securityManager);
上例很简单。
第一行代码:MyRealm是开发者实现Shiro的Realm接口而自定义的Realm,这个相当于是通常应用中的DAO层,先实例化它。
第二行代码:实例化SecurityManager,它是DefaultSecurityManager类型,把第一行实例化的Realm当成参数传给它。
第三行代码:这个主要实现单例模式。把实例化后的SecurityManager传给SecurityUtils,SecurityUtils在整个应用中只有一个实例,setSecurityManager只需要一次,在应用中的其它地方使用SecurityManager时,只需要调用SecurityUtils.getSecurityManager()方法就行了。
SecurityManager包含的其它组件,开发者没有提供自己的实现,那么就用Shiro的默认实现。
示例2:
...
DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
SessionDAO sessionDAO = new CustomSessionDAO();
((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO);
...
这个更进一步,它实现了自定义SessionDAO。SessionDAO并不是SecurityManager的直属成员,SecurityManager包含SessionManager,SessionManager才包含SessionDAO,因此它的设置方法就像最后一行代码一样。
3、配置文件配置
硬编码不够灵活,通过配置文件配置JAVA BEAN,程序中的工厂类读取配置文件并根据配置文件实例化JAVA BEAN对象,这个很常见,Shiro也一样。
示例代码如下:
import org.apache.shiro.Securi