Shiro 入门与身份认证
用户信息存放在内存中
用户信息存放在数据库中
本节介绍了 Shiro 的入门示例程序。
“身份认证”是 Shiro 里很重要的概念。“认证”就是通过输入用户名和密码,到内存中或者到数据库中去查询是否有这个用户名的信息(且密码也匹配)。

用户信息存放在“内存”中,意即将用户的用户名和密码信息存放在一个名为 shiro.ini 的文件中。更多的情况是,我们把用户的用户名和密码信息存放在数据库中,这也是我们以前做的项目的绝大多数情况下的做法。
项目结构:
创建 maven 项目。
1、引入 gav 依赖:
如果使用 gradle 构建,则坐标为
2、编写 shiro 核心配置文件 shiro.ini
3、编写 HelloWorld 代码
这里要特别注意:<code>SecurityManager</code> 所在的包名应该是<code>org.apache.shiro.mgt</code>。
4、引入 slf4j 的 log4j 实现配置文件:log4j.properties
Subject 认证主体包含两个信息:
Principals:身份,可以是用户名,邮件,手机号码等等,用来标识一个登录主体身份;(我们可以理解成用户名)
Credentials:凭证,常见有密码,数字证书等等;(我们可以理解成密码)
下面我们介绍使用 JdbcRealm。那么什么是 Realm 呢?Realm 可以理解为主体的数据源(数据来源,里面存放的都是正确的用户名和密码)。
Realm 的意思是域,Shiro 从 Realm 中获取验证数据。
只须要对上面的代码稍稍作修改就可以实现将用户信息存放在数据库中,通过数据库中的用户信息进行登录匹配。既然使用的是 JdbcRealm,就须要使用到 jdbc 的相关技术。
首先我们引入依赖:
再向数据库里写入数据:
这里的表名和字段名都是固定的,这一点我们通过看 JdbcRealm 的源代码就可以知道。不过显然这样的方式显然是不灵活的。
配置文件 jdbc_realm.ini:
配置文件解释:
<code>jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm</code> 表示实例化右边字符串表示的类,赋给左边字符串表示的变量。
<code>dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro</code> 表示对 dataSource 这个变量设置属性值 jdbcUrl ,这个属性值是一个字符串。
<code>jdbcRealm.dataSource=$dataSource</code> 表示对 jdbcRealm 这个变量设置属性值 dataSource , 这个 dataSource 属性是上面实例化的一个对象,所以表示这个对象要使用前缀 <code>$</code>。
测试代码(和上一节没有什么不同,只是配置文件不一样而已):
补充:在 <code>currentUser.login(token);</code> 这一行捕获的异常,这里只是简单地捕获了 <code>AuthenticationException</code> 这个异常,我们还可以具体地捕获用户名不存在异常和密码不存在异常。
总结:
使用 Shiro 进行身份认证的流程是:将用户的用户名和密码信息存放在一个 <code>UsernamePasswordToken</code> 对象中,通过 <code>Subject</code> 的 <code>login()</code> 方法把 <code>UsernamePasswordToken</code> 对象传进去。
此时 Shiro 框架会去 shiro.ini 文件中找指定的安全数据源 <code>Realm</code>。默认是 IniRealm ,如果我们配置了 JdbcRealm ,就使用 JdbcRealm。
用户名是否存在,用户名存在的前提下密码是否也匹配,这个操作是由 Shiro 帮助我们完成的。