从这一篇开始记录一下shiro相关的学习笔记,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
学习一门新技术的最好的参考就是官方文档了,中文官方文档地址 当然如果你们找到一个成系列的博客由简入神的进行讲解也是很好的,我在学习的过程中会尽量记录的完善一些,方便自己后续查阅,也方便新入门的小伙伴参考学习。
我们知道,shiro是一个安全框架,我们是想通过shiro保护我们的程序,那当保护我们的程序时,最关注的问题可能就是“当前的用户是谁?”或“用户是否允许执行某项操作?”等等。
首先,怎么获取当前用户呢?
Subject currentUser = SecurityUtils.getSubject();
现在有了Subject
,可以做些什么呢?
如果想让某些数据在用户的当前会话中都可使用,可以如下:
Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );
现在可以得到Subject
以及Session
了,那么怎么检查是否允许做什么或是查看权限角色呢?
好吧,我们只能对一个已知的用户做那样的判定/检查。Subject
的实例虽然代表的是当前用户,不过,当前用户又是谁呢?至少在登录过前还是匿名的,所以我们需要这么做:
if ( !currentUser.isAuthenticated() ) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
// 使用“记住我”就只需这一行
token.setRememberMe(true);
currentUser.login(token);
}
不过要是登录失败了呢?你可以通过捕捉各种异常来知晓原因并做出相应的回应:
try {
currentUser.login( token );
// 如果没有问题,那就对了,搞定!
} catch ( UnknownAccountException uae ) {
// 未知用户的帐号,告诉他们错误信息?
} catch ( IncorrectCredentialsException ice ) {
// 密码不匹配,重试?
} catch ( LockedAccountException lae ) {
// 该帐号被锁定了,无法登录。给他们显示一条信息?
}
... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
//unexpected condition - error?
}
不过像上面这样提示具体的异常肯定是不好的,安全领域的最佳实践是给用户提供通用的登录错误信息,毕竟你也不想帮助黑客们根据不同的提示攻破系统。
好吧,现在有一个登录的用户了,还可以做点什么呢?我们可以进行查看用户身份、验证角色、验证权限等操作。
看看登录用户的身份吧:
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.");
}
最后,当用户完成操作时就可以登出了:
currentUser.logout();
从上面的简单介绍,貌似shiro可以满足我们对于权限管理的基本需求,具体的使用及更多的拓展,会在接下来的shiro系列博客中不断完善,欢迎小伙伴们关注。