重新整理一下shiro吧!
先加依赖
这里是测试类:
packagecom.test.qian.Controller;
importjunit.framework.Assert;
importorg.apache.shiro.SecurityUtils;
importorg.apache.shiro.authc.AuthenticationException;
importorg.apache.shiro.authc.UsernamePasswordToken;
importorg.apache.shiro.config.IniSecurityManagerFactory;
importorg.apache.shiro.subject.Subject;
importorg.apache.shiro.util.Factory;
importorg.junit.Test;
public classtestHelloworld {
@Test
public voidtestHelloworld() {
//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory factory =
newIniSecurityManagerFactory("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 =newUsernamePasswordToken("zhang","123");
try{
//4、登录,即身份验证
subject.login(token);
}catch(AuthenticationException e) {
//5、身份验证失败
}
Assert.assertEquals(true, subject.isAuthenticated());//断言用户已经登录
//6、退出
subject.logout();
}
}
上面那些我会一点一点解说:
先说一下shiro的顺序:
Factory factory =newIniSecurityManagerFactory("classpath:shiro.ini");
一.建立SecurityManager工厂指定一个配置文件shiro.ini,你可以当作数据库存在两个用户:
1 账户:qian 密码: 123
2 账户:yong 密码:123
这样数据库数据拿到了,但是你要了解shiro工作原理如图(从这里我们可以发现直接交互的是Subject,也就是说Shiro的对外API核心就是Subjec):
二:我们现在想法很简单,通过SecurityUtils得到Subject,
Subject subject = SecurityUtils.getSubject();
这个方法就是让你得到Subject
三:我们现在进一步思考,就是我们现在拿到了数据库数据,也来到交互核心Subject,
现在缺的是什么。
(1)用户自己登录的账户和密码(记得这里账户密码有可能填写错误,或者密码错误,所以才要第2步骤),
(2)shiro去验证这些账户和密码是否正确。
1.先说用户自己登录的账户和密码,就是下面这个方法:
UsernamePasswordToken token =newUsernamePasswordToken("zhang","123");
2.这里效验因为用到shiro验证我就必须了解其中执行顺序以及内部调用和上图差不多:
Subject.login(token)进行登录;
其会自动委托给Security Manager:
Manager---------调用SecurityUtils.setSecurityManager()设置-------委托给Authenticator进行身份验证---------Authenticator默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证同时Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了
了解这些你可以自己手动写一个MyShiroRealm继承AuthorizingRealm,在把这个方法调用注入就行拉。
这里主要还是要说一下shiro不难,技巧点比较重要,要懂大概原理,一个项目分分钟都是可以搭建起来的。