将 Apache Shiro 源码克隆到本地 centos7:
$ git clone https://github.com/apache/shiro.git
shiro 带有一些示范,如 QuickStart,下面进入 QuickStart 目录,并利用 mvn 下载好依赖包。
$ cd shiro/samples/quickstart (这个目录下有个pom.xml是maven配置文件)
$ mvn compile
maven 会根据 pom.xml 中的配置下载一系列依赖包。
进入 quickstart 目录后,尝试编辑 src/main/java/Quickstart.java 文件。该文件中已经示范了典型的 shiro 编程写法,现在将 main 方法的最开始放入以下代码:
public static void main(String[] args) {
log.info("My First Apache Shiro Application");
System.exit(0);
}
然后在 quickstart 目录下执行:
$ mvn compile exec:java
屏幕上会显示很多提示信息,但最后会显示:
2017-11-01 05:52:29,537 INFO [Quickstart] - My First Apache Shiro Application
shiro.ini 是 shiro 配置文件,可以找一下它的位置。在 quickstart 目录下执行:
$ find . -name shiro.ini
./src/main/resources/shiro.ini
可以查看一下 src/main/java/Quickstart.java 看看 shiro 的基本用法。其中三行代码是最关键的:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
在上面的代码中:
几乎在所有的环境中,你可以通过下面的调用获取当前正在执行的用户:
Subject currentUser = SecurityUtils.getSubject();
使用 SecurityUtils.getSubject(),我们可以获得当前正在执行的 Subject。Subject 是一个安全术语,它基本上的意思是“当前正在执行的用户的特定的安全视图”。
它并没有被称为"User"是因为"User"一词通常和人类相关联。在安全界,术语"Subject"可以表示为人类,而且可是第三方进程,cron job,daemon account,或其他类似的东西。它仅仅意味着“该事物目前正与软件交互”。对于大多数的意图和目的,你可以把 Subject 看成是 Shiro 的"User"概念。
现在你拥有了一个 Subject,你能拿它来获得当前 Subject 的会话:
Session session = currentUser.getSession();
session.setAttribute("someKey", "aValue");
Session时Shiro的特定实现,功能与JDK的HttpSessoins,除了一些额外的好处以及一个巨大的区别:它不需要一个HTTP环境!
如果在一个Web应用程序内部部署,默认的Session将会是基于HttpSession的。但,在一个非Web环境中,像这个简单的教程应用程序,Shiro将会默认自动地使用它的Enterprise Session Management。这意味着应用程序不再被强制使用HttpSession。并且,任何客户端技术现在能够共享会话数据。
下面的代码演示了用户登录:
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
currentUser.login(token);
}
如果登录失败,QuickStart.java中还示范了登录失败的处理:
try {
currentUser.login(token);
} catch (UnknownAccountException uae) {
log.info("There is no user with username of " + token.getPrincipal());
} catch (IncorrectCredentialsException ice) {
log.info("Password for account " + token.getPrincipal() + " was incorrect!");
} catch (LockedAccountException lae) {
log.info("The account for username " + token.getPrincipal() + " is locked. " +
"Please contact your administrator to unlock it.");
}
现在用户已经登录了,我们想知道他是谁:
log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
也可以测试他们是否有特定的角色:
if (currentUser.hasRole("schwartz")) {
log.info("May the Schwartz be with you!");
} else {
log.info("Hello, mere mortal.");
}
我们还可以判断他们是否有权限在一个确定类型的实体上进行操作:
//test a typed permission (not instance-level)
if (currentUser.isPermitted("lightsaber:wield")) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
当然,我们可以执行极其强大的实例级权限检查——判断用户是否有能力访问某一类型的特定实例的能力:
//a (very powerful) Instance Level permission:
if (currentUser.isPermitted("winnebago:drive:eagle5")) {
log.info("You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'. " +
"Here are the keys - have fun!");
} else {
log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}
最后,当用户完成了对应用程序的使用,他们可以注销:
//all done - log out!
currentUser.logout();
这里 是上面 QuickStart.java 的完整代码。

