一、前言
Shiro快速入门之一 介绍了Shiro三大核心组件,四大核心功能,以及一个简单的Test Demo,接下来两篇我会用一个比较完整的例子来讲述Shiro的认证及授权是怎么做的,本篇侧重于介绍认证的过程
二、Shiro认证例子
1、例子概述
-
使用SpringBoot+ThymeLeaf+Jpa搭建的例子
-
ThymeLeaf 是一个和Velocity差不多的模板引擎,如果不是前后端分离的项目,页面可以用SpringBoot官方推荐的ThymeLeaf模板,使用ThymeLeaf还可以解决发送HTML邮件内容拼接的问题,具体可看 从一坨代码说起。
-
Jpa是Java Persistence API,它需要Provider来提供实现,Hibernate是JPA Provider 最强一个实现。 注:后续会整理一篇介绍一下tk-mybatis、mybatis、jpa的区别。
2、pom.xml
用spring.io快速创建springboot project,然后加入依赖
-
spring-boot-starter-web
-
spring-boot-starter-thymeleaf
-
spring-boot-starter-data-jpa
-
mysql-connector-java
-
shiro-spring
3、application.properties
配置数据库连接和ThymeLeaf
spring.jpa.properties.hibernate.hbm2ddl.auto=update
注:该行设置为update,加载时会根据model类自动建立表结构,用jpa做demo这点还是很方便的,不用自己创建表结构。
对于配置文件spring.jpa.properties.hibernate.dialect,要写一个MySQLConfig来设置字符集。
4、实体类
权限类
角色类
用户类
注:创建三个实体类 权限类、角色类、用户类,并设置好关联关系,权限与角色多对多,角色与用户多对多,这样在应用启动后会自动创建5张表。
permission、role、role_permission、user、user_role,但数据库还是需要先创建好的,表是会自动创建。
初始化一条数据到用户表,用于测试。
5、UserService、Dao类
6、MyShiroRealm
自定义的Realm实现,主要实现两个方法一个是认证,一个是授权
上面这段就是认证(登录)的代码,先获取用户登录输入的账号(注:登录的代码subject.login(token);会调用该方法),然后到数据库中根据用户名获取用户对象信息,再用从数据库获取的信息(密码,salt)来构造SimpleAuthenticationInfo对象。
注:授权代码下篇再讲
7、ShiroConfig
注:配置Shiro过滤器,哪些地址不拦截,哪些地址要拦截,需要注意顺序,以及登录页地址,成功或失败后跳转页面地址。
注:将自定义的MyShiroRealm设置到SecurityManager中。
8、UserController
登录认证Controller,调用subject.login(token)进行认证,成功或失败后跳到对应的页面。
login.html
index.html
三、总结
用Shiro写认证代码,第一步要先实现Realm的认证方法,将从数据库查出来的密码,salt设置到AuthenticationInfo对象中,在用户登录时会将输入的用户名密码传给SecurityManger,然后进行比对用户名和密码是否正确。
核心代码,判断realm对象是否支持用户的token。