一.定义:Apche Shiro 是一个功能强大,使用简答的Java安全框架,为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案.
其主要功能是:管理应用程序中与安全相关的全部,同时尽可能的支持多种实现方法.
下载路径:http://shiro.apache.org/download.html
-
进入快速指南文件夹
cd shiro-root-1.1.0/samples/quickstart
-
运行快速指南
mvn compile exec:java
3.代码剖析 几乎所有的环境下,都可以通过这种方式获取当前用户:
Subject currentUser = SecurityUtils.getSubject();
Subject是应用中用户的一个特定安全的缩影,虽然感觉上直接使用User会更贴切,但是实际上它的意义远远超过了User。 而且每个应用程序都会有自己的用户以及框架,我们可不想和它们混淆在一起,况且Subject就是安全领域公认的名词。
如果你想得到应用中用户当前Session的其他参数,可以这样获取Session对象:
Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );
这个Session对象是Shiro中特有的对象,它和我们经常使用的HttpSession非常相似,但还提供了额外的东西,其中与HttpSession最大的不同就是Shiro中的Session不依赖HTTP环境(换句话说,可以在非HTTP 容器下运行)。
如果将Shiro部署在web应用程序中,那么这个Session就是基于HttpSession的。但是像QuickStart示例那样,在非web环境下使用,Shiro则默认使用EnterpriseSessionManagment。
补:API:应用程序接口
现在你可以得到当前Subject和它的Session对象。那么我们如何验证比如角色和权限这些东西呢?
可以通过已得到的user对象进行验证。Subject对象代表当前用户,但是,谁才是当前用户呢?
if ( !currentUser.isAuthenticated() ) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
currentUser.login(token);
}try {
currentUser.login( token );
} catch ( UnknownAccountException uae ) {
}
可以捕获Shiro提供的各种异常,最安全的做法是将登录失败的消息告知用户
//拿到登录的用户
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." );
}
还可以判断用户是否对特定某实体有操作权限:
if ( currentUser.isPermitted( "lightsaber:weild" ) ) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
当然,还可以进行功能强大的实例级别的权限验证。通过它可以判断用户是否有访问特定类型实例的权限:
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!");
}
最后,当用户使用完毕,还可以退出应用。
currentUser.logout();
session too.