Shiro框架学习笔记(二)基于内置ini文件的身份认证

2020-08-26 11:00:06 浏览数 (2)

一开始学习我们先从简单的开始学习,先不从数据库中取数据来进行交互检测,先通过内置一个shiro.ini文件来进行简单的身份验证。 shiro.ini文件如下:

代码语言:javascript复制
#定义⽤户信息
#格式:⽤户名=密码,⻆⾊1,⻆⾊2,....
[users]
zhangsan=123,admin
lisi=456,manager,seller
wangwu=789,clerk
# -----------------------------------------------------------------------------
# ⻆⾊及其权限信息
# 预定权限:user:query
# user:detail:query
# user:update
# user:delete
# user:insert
# order:update
# ....
[roles]
# admin 拥有所有权限,⽤*表示
admin=*
# clerk 只有查询权限
clerk=user:query,user:detail:query
# manager 有 user 的所有权限
manager=user:*

shiro.ini文件位置如下

我们先通过控制台程序先测试,之后会集成到web项目中,接下来就是程序代码:

代码语言:javascript复制
// 定义main函数测试效果
// 创建 "SecurityFactory",加载ini配置,并通过它创建SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

// 将SecurityManager托管到SecurityUtils⼯具类中(ops:之后可以不必关⼼SecurityManager)
//因为直接操作SecurityManager太复杂、易出错。
SecurityUtils.setSecurityManager(securityManager);

// 获得Subject,通过subject可以执⾏shiro的相关功能操作(身份认证或权限校验等)
//几乎所有操作,除了加密,因为加密是其他模块,可以在架构图看到。每次创建了subject都会从session中同步一下信息。直接由用户使用,调用功能简单,其底层调用Securitymanager的相关流程
Subject currentUser = SecurityUtils.getSubject();

// 身份认证( 类似登录逻辑 )
if (!currentUser.isAuthenticated()) {//判断是否已经登录
    //如果未登录,则封装⼀个token,其中包含 ⽤户名和密码
    //这里是我们的主要测试步骤,读者们可以通过简单修改用户名和密码来进行一般的检测
    UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
    try {
        //将token传⼊login⽅法,进⾏身份认证 (判断⽤户名和密码是否正确)
        currentUser.login(token);//如果失败则会抛出异常
    } catch (UnknownAccountException uae) {//⽤户不存在
        System.out.println("There is no user with username of "   token.getPrincipal());
    } catch (IncorrectCredentialsException ice) {//密码错误
        System.out.println("Password for account "   token.getPrincipal()   " was incorrect!");
    } catch (LockedAccountException lae) {//账户冻结,例如多次登陆
        System.out.println("The account for username " 
                     token.getPrincipal() 
                     " is locked. Please contact your administrator to unlock it.");
    }catch (AuthenticationException ae) {//其他认证异常
    }
}

// 认证成功则⽤户信息会存⼊ currentUser(Subject)
System.out.println("User ["   currentUser.getPrincipal()   "] logged in successfully.");
// ⽤户退出,会清除⽤户状态 身份信息,登录状态信息,权限信息,角色信息,会话信息 全部抹除
currentUser.logout();
// System.exit(0);

主要是先创建SecurityManager对象,之后将该对象交由SecurityUtils来进行管理,之后在进行身份验证时主要是通过获取SecurityUtils获取到当前的登录用户,之后通过该用户的用户名以及密码创建相应的令牌,之后通过subject.login(token)来实现身份的验证,不再像之前一样进行复杂的sql语句的验证。

0 人点赞