项目结构
1、ini配置文件
[users]
##模拟数据库用户列表:账号=密码
zhangsan=666
lisi=888
2、test类
public class TestShiro {
public static void main(String[] args) {
//1、创建SecurityManager工厂对象,加载配置文件,创建工厂对象
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2、通过工厂对象,创建SecurityManager对象
SecurityManager securityManager = factory.getInstance();
//3、将SecurityManager绑定到当前运行环境中:让系统随时随地都可以访问SecurityManager对象
SecurityUtils.setSecurityManager(securityManager);
//4、创建当前登录的主体、注意:此时主体没有经过认证
Subject subject = SecurityUtils.getSubject();
//5、收集主体登录的身份/凭证,即账号密码
//参数1:将要登录的用户名,参数2:登录用户的密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "666");
//6:主体登录
try {
subject.login(token);
} catch (Exception e) {
//登录失败
e.printStackTrace();
}
//7、判断等是否成功
System.out.println("验证登录是否成功:"+subject.isAuthenticated());
//8:登出(注销)
subject.logout();
System.out.println("验证登录是否成功:"+subject.isAuthenticated());
}
}
出错信息
- 找不到账户异常
上面出错是因为没有账户 - 密码出错异常
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.
at org.apache.shiro.realm.AuthenticatingRealm.assertCredentialsMatch(AuthenticatingRealm.java:600)
at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:578)
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:180)
at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:267)
at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)
at org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106)
at org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:270)
at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:256)
at cn.com.zhangjh.shiro.TestShiro.main(TestShiro.java:37)
上面的错是因为密码错误
shiro验证流程
1、调用subject.login方法进行登录,其会自动委托给securityManager.login方法进行登录;
2、securityManager通过Authenticator(认证器)进行认证;
3、Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带,相当于数据源);
4、IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
5、最后调用Subject.logout进行退出操作。