Shiro中的认证
什么是认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确
三个概念
Subject
访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体
Principal
身份信息,是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)
credential
凭证信息,是只有主体自己知道的安全信息,如密码、证书等
认证的实现
创建一个普通的maven项目,引入shiro的pom依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
引入shiro配置文件shiro.ini,并加入以下配置
# 约定写法
[users]
# 用户名=密码
christy=123456
tide=654321
shiro的配置文件是一个.ini文件,类似于.txt文件
.ini文件经常用作某些软件的特定的配置文件,可以支持一些复杂的数据格式,shiro可以按照内部约定的某种格式读取配置文件中的数据
之所以提供这个配置文件是用来学习shiro时书写我们系统中相关的权限数据,从而减轻配置数据库并从数据库读取数据的压力,降低学习成本,提高学习效率
测试Java代码
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
public class ShiroAuthenticatorTest {
public static void main(String[] args){
// 1、创建安全管理器对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 2、给安全管理器设置realm
securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
// 3、给全局安全工具类SecurityUtils设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
// 4、拿到当前的subject
Subject subject = SecurityUtils.getSubject();
// 5、创建令牌
AuthenticationToken token = new UsernamePasswordToken("christy","123456");
try {
// 6、用户认证
System.out.println("认证状态:"+subject.isAuthenticated());
subject.login(token);
System.out.println("认证状态:"+subject.isAuthenticated());
} catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("认证失败:用户不存在!");
} catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("认证失败:密码不正确!");
} catch (Exception e){
e.printStackTrace();
}
}
认证的几种状态
UnknownAccountException:用户名错误
IncorrectCredentialsException:密码错误
DisabledAccountException:账号被禁用
LockedAccountException:账号被锁定
ExcessiveAttemptsException:登录失败次数过多
ExpiredCredentialsException:凭证过期