本篇文章来自慕课网Shiro安全框架入门视频教程,以下内容为作者观看视频后总结内容。
一、什么是Shiro
- Apache下的一个强大灵活的开源安全框架
- 认证、授权、企业会话管理、安全加密
- 可以帮助快速完成权限管理模块的开发
二、Shiro与Spring Security比较
- 前者简单、灵活-----------后者复杂、笨重
- 前者可以脱离spring------后者不可脱离spring
- 前者权限控制粒度较粗--后者权限控制力度较细
三、Shiro架构图
Shiro通过security Manager管理。
Authenticator:认证器,管理登入与登出。
Authorizer:授权器,赋予主体拥有哪些权限
Session Manager:会话管理器
Session Dao:提供session操作,包括增删改查
Cache Manager:缓存管理器
四、Shiro认证
1、首先生成一个简单的认证代码,如下。
public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void add(){ simpleAccountRealm.addAccount("yxf", "123"); } @Test public void testAuthentication(){ //1.构建SecurityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2.主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123"); subject.login(token); System.out.println("isAuthenticated:" + subject.isAuthenticated()); } }
在上面代码中可见的认证过程,
1、创建一个Realm,并将用户名与密码添加进去。
2、构建SecurityManager环境,将Realm放入安全管理环境中。
3、接收主体提交来的认证请求(这里我们为了方便测试使用手动创建的token)。
4、对请求进行认证。
认证结果:
1、用户已登录:方法将返回true。
2、用户未登录:方法将返回false。
2、用户名不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.UnknownAccountException(未知的用户)。
3、密码不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.IncorrectCredentialsException(非法凭证)。
4、用户名密码都不正确:同2.
五、Shiro授权
生成一个简单授权代码,如下
public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void add(){ simpleAccountRealm.addAccount("yxf", "123", "admin", "user"); } @Test public void testAuthentication(){ //1.构建SecurityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2.主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123"); subject.login(token); //认证 System.out.println("isAuthenticated:" + subject.isAuthenticated()); subject.checkRole("admin"); subject.checkRole("user"); subject.checkRoles("admin", "user"); } }
如上代码中,用户首先经过认证,认证通过,可以检查权限。可以一次检查一个权限,也可以一次检查多个权限。如果权限不存在,程序将抛出如下异常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have role [user2](无法授权,找不到“user2”这样的角色)