Apache Shiro 官网: http://shiro.apache.org/
从官网上,我们基本上可以了解到,她提供的服务非常明确:
Authentication(认证)
Authorization(授权)
Session Management(会话管理)
Cryptography(加密)
首先,她提供了 Authentication(认证)服务,也就是说,通过她可以完成身份认证,让她去判断您是否为真实的会员。
其次,她还提供了 Authorization(授权)服务,其实说白了就是“访问控制”服务,也就是让她来识别您是否可以做某件事情,毕竟不同的会员是拥有不同的权限的。
更有特色的是,她还提供了 Session Management(会话管理)服务,这个就厉害了,这并不是您熟知的 HTTP Session,而是一个独立的 Session 管理框架,不管是否为 Web 应用,都可以用这套框架。
最后(但并不是最不重要的),她还提供了 Cryptography(加密)服务,封装了许多密码学算法,有您知道的,也有您不知道的,总之琳琅满目,应有尽有。
除了以上 4 个基本服务以外,她也提供很好的系统集成方案,您可以轻松将其运用到 Web 应用中,可能这也是您最关心的。此外,还可以集成第三方框架,例如:Spring、Guice、CAS 等。
想必您已经了解了 Shiro 的主要功能,那么如何才能真正占有她呢?不妨先主动跟她打声招呼吧:Hello Shiro!
Hello Shiro
如果您与我一样,也使用 Maven 的话,可以将以下配置复制到您的 pom.xml 文件中:
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
需要说明的是,Shiro 依赖于 SLFJ 日志框架,而 SLFJ 只是一个接口,并没有提供具体的实现,您可以选择 Log4J 作为它的实现,正好 SLFJ 也提供了一个 slf4j-log4j12 的 Artifact,所以这就用上了。
下面是 hello 项目的 Maven 依赖图:
既然使用了 Log4J,那么就应该在 classpath 下提供一个 log4j.properties 文件:
log4j.rootLogger = INFO, console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-5p %c(%L) - %m%n
通过上面的配置将日志输出到控制台上,并配置了日志输出格式。
同样,既然使用了 Shiro,那么就应该在 classpath 下提供一个 shiro.ini 文件:
[users]
shiro = 201314
很简单的配置,我们配置了一个用户名为 shiro,密码为“爱你一生一世”的用户。当然,这里仅为演示,在您的实际项目中肯定不会把用户信息定义在配置文件中,除非这个项目的用户只有您自己。
我们就用这个用户来见识一下 Shiro 的认证服务功能吧,不妨写一个 main 方法试试:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloShiro {
private static final Logger logger = LoggerFactory.getLogger(HelloShiro.class);
public static void main(String[] args) {
// 初始化 SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
// 获取当前用户
Subject subject = SecurityUtils.getSubject();
// 登录
UsernamePasswordToken token = new UsernamePasswordToken("shiro", "201314");
try {
subject.login(token);
} catch (AuthenticationException ae) {
logger.info("登录失败!");
return;
}
logger.info("登录成功!Hello " + subject.getPrincipal());
// 注销
subject.logout();
}
}
我们分析一下这个 HelloShiro 吧:
需要读取 classpath 下的 shiro.ini 配置文件,并通过工厂类创建 SecurityManager 对象,最终将其放入 SecurityUtils 中,供 Shiro 框架随时获取。
同样通过 SecurityUtils 类获取 Subject 对象,其实就是当前用户,只不过在 Shiro 的世界里优雅地将其称为 Subject(主体)。
首先使用一个 Username 与 Password,来创建一个 UsernamePasswordToken 对象,然后我们通过这个 Token 对象调用 Subject 对象的 login 方法,让 Shiro 进行用户身份认证。
当登录失败时,您可以使用 AuthenticationException 来捕获这个异常;当登录成功时,您可以调用 Subject 对象的 getPrincipal 方法来获取 Username,此时 Shiro 已经为您创建了一个 Session。
最后还是通过 Subject 对象的 logout 方法来注销本次 Session。
感觉还不错吧?您只需要知道以上几个 Shiro 的核心成员的基本用法,Shiro 就是您的了。