SpringBoot+shiro1 螃蟹和骆驼先生Yvan

重新整理一下shiro吧!

先加依赖

SpringBoot+shiro1 螃蟹和骆驼先生Yvan_第1张图片

这里是测试类:

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();

}

}


SpringBoot+shiro1 螃蟹和骆驼先生Yvan_第2张图片

上面那些我会一点一点解说:

先说一下shiro的顺序:

Factory factory =newIniSecurityManagerFactory("classpath:shiro.ini");

一.建立SecurityManager工厂指定一个配置文件shiro.ini,你可以当作数据库存在两个用户:

1  账户:qian   密码: 123

2   账户:yong  密码:123

这样数据库数据拿到了,但是你要了解shiro工作原理如图(从这里我们可以发现直接交互的是Subject,也就是说Shiro的对外API核心就是Subjec):

SpringBoot+shiro1 螃蟹和骆驼先生Yvan_第3张图片
百度切图

二:我们现在想法很简单,通过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不难,技巧点比较重要,要懂大概原理,一个项目分分钟都是可以搭建起来的。

你可能感兴趣的:(SpringBoot+shiro1 螃蟹和骆驼先生Yvan)