版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34598667/article/details/84639985
1)新建maven项目shiro_test,导入jar包
下面是jar包的坐标:
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
</dependencies>
2)Shiro认证流程
3)创建shiro-first.ini
在classpath下创建shiro-first.ini,通过此配置文件创建securityManager工厂。
#对用户信息进行配置
[users]
#用户账号和密码
admin=123
4)测试认证入门案例
public class AuthenticationTest {
@Test
public void testLoginAndLogout(){
//1、创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-first.ini");
//2、创建SecurityManager
SecurityManager securityManager=factory.getInstance();
//3、将securityManager设置到当前运行环境中
SecurityUtils.setSecurityManager(securityManager);
//4、从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject();
//5、在认证提交前准备token(令牌)
UsernamePasswordToken token=new UsernamePasswordToken("admin","1123");
//6、执行认证提交--认证失败会抛异常
subject.login(token);
//是否认证通过
boolean isAuthenticated =subject.isAuthenticated();
System.out.println("是否认证通过:"+isAuthenticated);
//退出操作
subject.logout();
//是否认证通过
isAuthenticated=subject.isAuthenticated();
System.out.println("是否认证通过:"+isAuthenticated);
}
}
注意:如果认证失败则会排除两个异常,一是账号不一致会抛出(org.apache.shiro.authc.UnknownAccountException)
,二是密码不一致会抛出(org.apache.shiro.authc.IncorrectCredentialsException)
下面会详细讲解过程。
5)执行流程
- 通过ini配置文件创建securityManager
- 调用subject.login方法主体提交认证,提交的token
- securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证
- ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
- IniRealm根据输入的token(UsernamePasswordToken)从 shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)
- 如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
- 如果查询不到,就给ModularRealmAuthenticator返回null
- ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
- 如果返回的认证信息是null,ModularRealmAuthenticator抛出异常
(org.apache.shiro.authc.UnknownAccountException)
- 如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常
(org.apache.shiro.authc.IncorrectCredentialsException)
- 如果返回的认证信息是null,ModularRealmAuthenticator抛出异常
6)自定义realm
realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null。这里我们使用自定义reaml来完成此案例
1)编写自定义realm
自定义realm需要继承AuthorizingRealm抽象类,实现其中的抽象方法:
public class CustomRealm extends AuthorizingRealm{
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
//token是用户输入的
//1、从token中取出身份信息
String userCode=(String) token.getPrincipal();
//2、根据用户输入的userCode从数据库查询
//假设数据库用户是admin
//如果查询不到则返回null
/*if(!userCode.equals("admin")){
return null;
}*/
//模拟从数据库查到密码
String pwd="123";
//如果查询到则返回认证信息AuthenticationInfo
SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(
userCode,pwd,this.getName());
return simpleAuthenticationInfo;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
return null;
}
}
2)配置realm
在classpath下新建shiro-realm.ini,在其中配置realm注入到securityManager中
[main]
#自定义realm
customRealm=com.oak.shiro.CustomRealm
#将realm设置到securityManager,相当于Spring注入
securityManager.realms=$customRealm
3)修改test中创建securityManager工厂的配置文件
//创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");
4)测试即可
下一章讲解Shiro授权入门案例