shiro的简单测试
- 导入jia包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
- 创建shiro.ini配置文件,模拟数据库用户列表
- 简单应用
//1:创建SecurityManager工厂对象 加载配置文件,创建工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro");
//2:通过工厂对象,创建SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//3:将securityManager绑定到当前运行环境中,让系统随时随地都可以访问securityManager对象
SecurityUtils.setSecurityManager(securityManager);
//4:创建当前登陆的主体
Subject subject = SecurityUtils.getSubject();
//5:收集主体登陆的主体,注意:此时主体没有通过验证
UsernamePasswordToken token = new UsernamePasswordToken( "test","22");
//6:主体登陆
try {
subject.login(token);
if(subject.isAuthenticated()){
System.out.println("登录成功");
//hasRole:判断是否拥有这个角色
if(subject.hasRole( "admin")){
System.out.println("有admin角色");
}else{
System.out.println("没有admin角色");
}
//isPermitted:判断是否拥有这个权限
if(subject.isPermittedAll( "and","search")){
System.out.println("有search,search这个权限");
}else {
System.out.println("没有search,search这个权限");
}
}
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("用户名或密码错误,登录失败");
}
//7:判断登录是否成功
System.out.println("验证登陆是否成功:"+subject.isAuthenticated());
//8:登出(注销)
subject.logout();
System.out.println("验证登陆是否成功:"+subject.isAuthenticated());
常见方法
isAuthenticated:判断是否登录(true登录/false注销)
hasRole:判断是否拥有这个角色
isPermittedAll:判断是否拥有这个权限
login:登录
logout:注销
认证操作常见的异常
密码错误![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1b9e1924992320301a4e36413367e57e.jpeg)
找不到账户![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e49ae113cbb3c8f350c5857bccc2e579.jpeg)
操作流程分析
1,调用subject.login方法进行登录,其会自动委托给securityManager.login方法进行登录;
2,securityManager通过Authenticator(认证器)进行认证;
3,Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是iniRealm(shiro自带,相当于数据源);
4,IniRealm先根据token中的账号去ini中找该账号,如果找不到则给Modular RealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
5,最后调用Subject.logout进行退出操作。