1、身份认证
【1】基本流程
流程如下:
1、Shiro把用户的数据封装成标识token,token一般封装着用户名,密码等信息
2、使用Subject门面获取到封装着用户的数据的标识token
3、Subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager把标识token委托给认证器Authenticator进行身份验证。认证器的作用一般是用来指定如何验证,它规定本次认证用到哪些Realm
4、认证器Authenticator将传入的标识token,与数据源Realm对比,验证token是否合法
【2】案例演示
【2.1】需求
1、使用shiro完成一个用户的登录
【2.2】实现
【2.2.1】新建项目
shiro-day01-01authenticator
【2.2.2】导入依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.newbies.shiro</groupId><artifactId>shiro-day01-01authenticator</artifactId><version>1.0-SNAPSHOT</version><name>shiro-day01-01authenticator</name><!-- FIXME change it to the projects website --><url></url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies><build><plugins><!-- compiler插件, 设定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>8</source><target>8</target><showWarnings>true</showWarnings></configuration></plugin></plugins></build></project>
【2.2.3】编写shiro.ini
#声明用户账号[users]jay=123
【2.2.4】编写HelloShiro
package com.newbies.shiro;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;import org.junit.Test;/*** @Description:shiro的第一个例子*/public class HelloShiro {@Testpublic void shiroLogin() {//导入权限ini文件构建权限工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");//工厂构建安全管理器SecurityManager securityManager = factory.getInstance();//使用SecurityUtils工具生效安全管理器SecurityUtils.setSecurityManager(securityManager);//使用SecurityUtils工具获得主体Subject subject = SecurityUtils.getSubject();//构建账号tokenUsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jay", "123");//登录操作subject.login(usernamePasswordToken);System.out.println("是否登录成功:" + subject.isAuthenticated());}}
【2.2.4】测试
【2.3】小结
1、权限定义:ini文件2、加载过程:导入权限ini文件构建权限工厂工厂构建安全管理器使用SecurityUtils工具生效安全管理器使用SecurityUtils工具获得主体使构建账号token用SecurityUtils工具获得主体构建账号token登录操作
2、Realm
【1】Realm接口
所以,一般在真实的项目中,我们不会直接实现Realm接口,我们一般的情况就是直接继承AuthorizingRealm,能够继承到认证与授权功能。它需要强制重写两个方法
public class DefinitionRealm extends AuthorizingRealm {/*** @Description 认证* @param authcToken token对象* @return */public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {return null;}/*** @Description 鉴权* @param principals 令牌* @return*/public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){return null;}}
【2】自定义Realm
【2.1】需求
1、自定义Realm,取得密码用于比较
【2.2】实现
【2.2.1】创建项目
shiro-day01-02realm