01.shiro 初入门-无数据库校验用户具有的权限以及退出后的权限情况

80 阅读2分钟

shiro认证流程

image.png

  • QuickStartTest.java
package com.lzh;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:lzh_shiro
 * @name:QuickStartTest
 * @Date:2023/3/27 下午2:05
 * @Filename:QuickStartTest
 * @Description:填写功能描述
 * @Version:1.0
 */

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * 单元测试用例执行顺序
 * @BeforeClass -> @Before -> @Test -> @After -> @AfterClass
 */
public class QuickStartTest {

    private SimpleAccountRealm accountRealm = new SimpleAccountRealm();

    private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

    @Before
    public void init(){
        // 初始化数据源
        accountRealm.addAccount("lll","123");
        accountRealm.addAccount("lzh","123");

        // 构建环境
        defaultSecurityManager.setRealm(accountRealm);
    }

    @Test
    public void testAuthentication(){

        // 设置环境上下文
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        // 获取操作主体
        Subject subject = SecurityUtils.getSubject();

        // 模拟用户输入的用户名和密码
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lll", "123");
        subject.login(usernamePasswordToken);

        // 获取验证结果 isAuthenticated() 是否授权,结果是boolen
        System.out.println("认证结果"+subject.isAuthenticated());
    }
}
认证结果true

梳理shiro认证和授权流程以及常用api

授权是基于用户登录(认证)之后做的事情,比如:

普通用户购买和查看商品权限。

管理员拥有修改、上架商品的权限。


//是否有对应的角色
subject.hasRole("root")
​
//获取subject名
subject.getPrincipal()
​
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin")
​
//检查是否有对应的角色,有返回值,为boolen
subject.hasRole("admin")
​
//退出登录
subject.logout();

实战-使用shiro模拟用户登录与退出

package com.lzh;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh
 * @Project:lzh_shiro
 * @name:QuickStartTest
 * @Date:2023/3/27 下午2:05
 * @Filename:QuickStartTest
 * @Description:填写功能描述
 * @Version:1.0
 */

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;

/**
 * 单元测试用例执行顺序
 * @BeforeClass -> @Before -> @Test -> @After -> @AfterClass
 */
public class QuickStartTest2 {

    private SimpleAccountRealm accountRealm = new SimpleAccountRealm();

    private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

    @Before
    public void init(){
        // 初始化数据源

        // addAccount第三个参数是设置用户权限,root、admin、user
        accountRealm.addAccount("lll","123","root","admin");
        accountRealm.addAccount("lzh","123","user");

        // 构建环境
        defaultSecurityManager.setRealm(accountRealm);
    }

    @Test
    public void testAuthentication(){

        // 设置环境上下文
        SecurityUtils.setSecurityManager(defaultSecurityManager);

        // 获取操作主体
        Subject subject = SecurityUtils.getSubject();

        // 模拟用户输入的用户名和密码
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lll", "123");
        subject.login(usernamePasswordToken);

        // 获取验证结果 isAuthenticated() 是否授权,结果是boolen
        System.out.println("认证结果:"+subject.isAuthenticated());

        // 是否有对应的角色
        System.out.println("是否有对应的角色:"+subject.hasRole("root"));

        System.out.println("getPrincipal认证结果"+subject.getPrincipal());



        // 退出登录
        subject.logout();

        // 检查用户退出登录后的认证结果
        System.out.println("认证结果:"+subject.isAuthenticated());

    }
}
认证结果:true
是否有对应的角色:true
getPrincipal认证结果lll
认证结果:false