参考链接:http://jinnianshilongnian.iteye.com/blog/2018936(张开涛老司机的博客)
一 shiro的功能(如下图)
二 shiro认证授权的大致过程
(一) application如何去调用shiro的东西:
1 从下面的代码中可以看出来:
我们在application中只需要两个东西就可以完整一次验证:subject和UsernamePasswordToken
(1)subject从securityUtils中获取,securityUtils中包含了具有配置信息的securityManager
(2)UsernamePasswordToken根据传过来的usename和password初始化
(3)调用subject.login方法进行登录,其会自动委托给SecurityManager.login方法进行登录
public void testHelloworld() {
//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
//2、得到SecurityManager实例 并绑定给SecurityUtils
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
try {
//4、登录,即身份验证
subject.login(token);
} catch (AuthenticationException e) {
//5、身份验证失败
}
Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
//6、退出
subject.logout();
}
2 具体流程:
(1)首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils. setSecurityManager()设置;
(2)SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
(3)Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;
(4)Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
(5)Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问