一、基于Java代码的配置
最简单的创建并且使用SecurityManager的方式就是直接在代码中创建org.apache.shiro.mgt.DefaultSecurityManager类实例,比如:
1 Realm realm =//instantiate or acquire a Realm instance. We'll discuss Realms later.2 SecurityManager securityManager =newDefaultSecurityManager(realm);3 //Make the SecurityManager instance available to the entire application via static memory:4 SecurityUtils.setSecurityManager(securityManager);
只需区区三行代码,我们就已经为任何类型的应用程序配置好了一个全功能的Shiro运行环境,你看,多简单。
SecurityManager对象图谱:
就像我们在架构一节中介绍的,SecurityManager的实现是模块化的,而且可以兼容JavaBean,所以你可以通过setter和getter方法来配置SecurityManager及其内部组件。
比如如果你想把一个自定义的SessionDAO配置为SecurityManager的Session管理器,你可以直接调用SessionManager的setSessionDAO方法。
... DefaultSecurityManager securityManager =newDefaultSecurityManager(realm); SessionDAO sessionDAO =newCustomSessionDAO(); ((DefaultSessionManager)securityManager.getSessionManager()).setSessionDAO(sessionDAO); ...
你可以通过这种调用setter方法的方式来设置SecurityManager的任何内置组件。但是对于现实的应用程序来说,这不是一种理想的配置方式。主要有以下几点原因:
#,这种直接编码的方式要求我们知道这个具体的实现类在哪,并且要自己去创建他。而我们一般建议是依赖于抽象而不是具体,所以最好不要让我知道他具体的实现在哪里。
#,由于java的类型安全特性,当我们通过getter方法获取到某个类的具体实现之后,我们将不得不把他们强制类型转换为具体的类型,如此多的强制类型转换太丑了,不是一种好的编程实践。
#,如果我们通过SecurityUtils.setSecurityManager方法为当前的应用设置一个虚拟机范围内的静态SecurityManager对象,在大多数应用中都是ok的。但是如果我们要在一个虚拟机上运行多个使用Shiro的应用程序时,就可能会出乱子了。所以如果能够为每个应用程序创建一个的单例就更好了;
#,每次你要修改一下Shiro的配置都不得不重新编译程序;
虽然有以上提到的种种缺点,但是如果你要在一个内

