【Shiro】03 ini认证实现

【基本概念】

1、身份验证

即在应用中谁能证明他就是他本人。

一般提供如他们的身份ID 一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。

在 shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:

2、身份 principals 【/'prɪnsəpl】

身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。

一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。

3、凭证 credentials 【/krə'dɛnʃlz/】

证明/凭证,即只有主体知道的安全值,如密码/数字证书等。

最常见的principals和credentials组合就是用户名/密码了。

认证流程

 

 

 

新建一个Maven工程,如果后续功能很多,我们可以删除主工程的SRC目录

再新建一个一个模块来开发学习。

需要的依赖包的坐标:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.5.3</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.21</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

日志配置文件:

log4j.properties

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

认证信息配置:

shiro.ini

#配置用户
[users]admin=123456user=123456

存放位置:

编写测试类:

 代码中的用户信息即表示我们的目标主体的信息

我们使用信息生成令牌进行登陆,对安全管理器加载好的ini认证信息进行核对

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author DaiZhiZhou
 * @file Shiro
 * @create 2020-08-01 16:47
 */
public class AuthenticationTest {

    // 日志输出工具
    private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class);

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        String username = "admin";
        String password = "123456";
        log.info("My First Apache Shiro Application");

        // 新版已经摈弃了工厂模式创建对象,直接使用DefaultSecurityManager创建实例
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

        // 认证配置信息单独由IniRealm创建加载
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");

        // 在安全管理器中注册认证
        defaultSecurityManager.setRealm(iniRealm);

        // 在安全工具类中设置安全管理器
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        // 得到目标主体
        Subject subject = SecurityUtils.getSubject();

        // 创建令牌实例
        AuthenticationToken userToken = new UsernamePasswordToken(username, password);

        try {
            // 主体携带令牌登陆
            subject.login(userToken);

        } catch (Exception exception) {
            exception.printStackTrace();
        }

        Subject subject2 = SecurityUtils.getSubject();
        aaaa();
        System.out.println(subject == subject2);

    }

    public static void quickStart(){
        // 1,创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;  不能使用java.lang.SecurityManager
        //Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        // 2,使用工厂创建安全管理器
        //SecurityManager securityManager = factory.getInstance();

        // 3,把当前的安全管理器绑定当到线的线程
        //SecurityUtils.setSecurityManager(securityManager);

        // 4,使用SecurityUtils.getSubject得到主体对象
        //Subject subject = SecurityUtils.getSubject();

        // 5,封装用户名和密码
        //AuthenticationToken token = new UsernamePasswordToken(username, password);

        // 6,得到认证
        //try {
        //    subject.login(token);
        //    System.out.println("认证通过");
        //} catch (AuthenticationException e) {
        //    System.out.println("用户名或密码不正确");
        //}
        /*} catch (IncorrectCredentialsException e) {
            System.out.println("密码不正确");
        } catch (UnknownAccountException e) {
            System.out.println("用户名不存在");
        }*/

        //Subject subject2 = SecurityUtils.getSubject();

        //System.out.println(subject);
        //System.out.println(subject2);

        //aaaa();
    }

    public static void aaaa() {
        Subject subject2 = SecurityUtils.getSubject();
        System.out.println(subject2);
    }
}

 

posted @ 2020-08-01 17:35  emdzz  阅读(172)  评论(0编辑  收藏  举报