Shiro:学习笔记——身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro:学习笔记——身份验证相关的知识,希望对你有一定的参考价值。

Shiro——学习笔记(1)

1.核心概念

1.Shiro不会自己去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro。
2.应用代码直接交互的对象是Subject,也就是说Shiro的对外核心是Subject
技术分享

  Subject:主体,代表了当前用户,不一定是一个具体的人,与当前交互的任何东西都是Subject,如网络爬虫、机器人等,是一个抽象概念。所有的Subject都会绑定到SecurityManager。可以把Subject认为是一个门面;SecurityManager才是实际的执行者。

  Security Manager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有的Subject,且负责与后面介绍的其他组件进行交互。它是Shiro内部的核心。可以理解为前端控制器。

  Realm:域,Shiro从Realms获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,他需要从Realm获取相应的用户进行比较以确定用户身份是否合法。可以看作是DataSource,即安全数据源。

2.HelloWorld代码:

//获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
        //得到SecurityManager实例,并绑定给SecurityUtils
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //得到Subject及创建用户名/密码身份验证Token
        Subject subject =SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
        try {
            //登陆,即身份验证
            subject.login(token);
        }catch (AuthenticationException e)
        {
            //身份验证失败
        }
        System.out.println(subject.isAuthenticated()); //用户已经登陆
        //退出
        subject.logout();

基于ini的验证方式

[users]
zhang=123
wang=132

自定义Realm

package main.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;

/**
 * Created by ZY on 2017/9/12.
 */
public class MyRealm implements Realm {

    /**
     * 返回一个唯一的Realm名字
     * @return
     */
    public String getName() {
        return "MyRealm";
    }

    /**
     * 判断此Realms是否支持此Token
     * @param authenticationToken
     * @return
     */
    public boolean supports(AuthenticationToken authenticationToken) {
        //仅支持UsernamePassword类型的Token
        return authenticationToken instanceof UsernamePasswordToken;
    }

    /**
     * 根据Token获取认证信息
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String username = (String) authenticationToken.getPrincipal(); //得到用户名
        String password =new String((char[])authenticationToken.getCredentials()); //得到密码

        if(!"zha".equals(username))
        {
            throw new UnknownAccountException(); //如果用户名错误
        }
        if(!"123".equals(password))
        {
            throw new IncorrectCredentialsException(); //如果密码错误。
        }
        //如果验证成功,返回一个实现。
        return new SimpleAuthenticationInfo(username,password,getName());
    }
}
myRealm1=main.realm.MyRealm
securityManager.realms=$myRealm1

基于数据库的方式

[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/shiro
dataSource.username=root
dataSource.password=123456
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm

 



以上是关于Shiro:学习笔记——身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Shiro笔记身份验证

Shiro 学习笔记——shiro简介

Shiro学习笔记

Shiro学习身份验证

Shiro笔记基本概念

Shiro安全框架学习01 -入门