shiro认证流程

jar包导入

由于使用时junitjar包的错误所以选择低版本
- [x] commons-beanutils-1.9.3.jar
- [x] commons-logging-1.2.jar
- [x] log4j-1.2.17.jar
- [x] shiro-core-1.3.2.jar
- [x] slf4j-api-1.7.12.jar
- [x] slf4j-log4j12-1.7.12.jar
- [x] junit-4.9.jar

日志

log4j.rootLogger=Debug,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN

创建ini文件

#对用户信息进行配置
[users]
#用户账号和密码
zhangsan=111111
lisi=222222

代码

public class AuthenticationTest {
    // 用户登录和退出
    @Test
    public void testLoginAndLogout() {
        // 创建securityManager工厂,用过ini配置文件创建securityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");
        // 创建SecurityManager
        SecurityManager securityManager = factory.getInstance();
        // 将securityManager设置到当前的运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        // 从SecurityUtils里边创建一个subject
        Subject subject = SecurityUtils.getSubject();
        // 在认证提交前准备token(令牌)
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");
        try {
            // 执行认证提交
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //是否认证通过
        boolean isAuthenticated = subject.isAuthenticated();
        System.out.println("是否认证通过: " + isAuthenticated);
        //退出操作
        subject.logout();
        //是否认证通过
        isAuthenticated = subject.isAuthenticated();
        System.out.println("是否认证通过: " + isAuthenticated);
    }
}

结果输出

是否认证通过: true
2018-04-17 15:45:18,582 [main] DEBUG org.apache.shiro.mgt.DefaultSecurityManager - Logging out subject with primary principal zhangsan
2018-04-17 15:45:18,582 [main] DEBUG org.apache.shiro.session.mgt.AbstractSessionManager - Stopping session with id [1c0028fe-8c6b-437d-a1a6-03ff229e9478]
是否认证通过: false

两种异常

用户不存在引发的异常
org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@2eee9593]
   was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - zhangsans, rememberMe=false].
密码不匹配引发的异常
org.apache.shiro.aut
   hc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.

执行流程

  1. 通过ini配置文件创建securityManager
  2. 调用subject.login方法主体提交认证
  3. securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证
  4. ModularRealmAuthenticator调用IniRealmquini配置文件中查询用户信息
  5. IniRealm根据输入的token(UsernamePasswordToken)从shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)
    如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
    如果查询不到,就给ModularRealmAuthenticator返回null
  6. ModularRealmAuthenticator接收IniRealm返回Authenti认证信息,如果返回的认证信息是null,ModularRealmAuthenticator
    抛出异常(org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@2eee9593]
    was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - zhangsans, rememberMe=false].)
    如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码(在ini文件中存在)和token中的密码进行对比,如果不一致抛出异常(org.apache.shiro.aut
    hc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - zhangsan, rememberMe=false] did not match the expected credentials.)

小结

ModularRealmAuthenticator作用进行认证,需要调用realm查询用户信息(在数据库中存在用户信息)
ModularRealmAuthenticator进行密码对比(认证过程)
realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查询到用户返回认证信息,如果查询不到返回null
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38087648/article/details/79976625
文章标签: shiro
个人分类: shiro
想对作者说点什么? 我来说一句

shiro 权限认证以及授权demo

2016年09月10日 1.21MB 下载

没有更多推荐了,返回首页

不良信息举报

shiro认证流程

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭