章节目录
1. Shiro
1.1 Shiro简介
以下为Shiro的简单介绍:
- Shiro 是一个强大、简单易用的 Java 安全权限框架
- Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在 JavaEE 环境
- Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存等。
具体的信息可进一步查看Shiro官网
1.2 Shiro三大核心组件
Shiro 有三大核心组件,即 Subject、SecurityManager 和 Realm。它们的关系如下图:
1.2.1 Subject
Subject 为认证主体,它包含 Principals 和 Credentials 两个信息。
- Principals:代表身份。可以是用户名、邮件、手机号码等等,用来标识一个登录主体的身份
- Credentials:代表凭证。常见的有密码,数字证书等等。
简单来说:这两者代表了需要认证的内容,最常见的便是用户名、密码了
1.2.2 SecurityManager
SecurityManager 为安全管理员,它是Shiro 架构的核心。所有具体的交互都通过SecurityManager进行控制;负责所有Subject、且负责进行认证和授权、及会话、缓存的管理
1.2.3 Realm
Realm 是一个域,它是连接 Shiro 和具体应用的桥梁。当需要与安全数据交互时,比如用户账户、访问控制等,Shiro 将会在一个或多个 Realm 中查找。
1.3 Shiro的认证和授权流程
官方的入门实例:http://shiro.apache.org/tutorial.html
大致代码如下:
shiro.ini
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
ini文件大致意思是:
- root=secret,admin:用户名root,密码secret,角色是admin
- schwartz=lightsaber:* :角色schwartz拥有权限 lightsaber:*
Java代码
public static void main(String[] args) {
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
if ( !currentUser.isAuthenticated() ) {
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
currentUser.login(token);
}
if ( currentUser.hasRole( "schwartz" ) ) {
log.info("May the Schwartz be with you!" );
} else {
log.info( "Hello, mere mortal." );
}
if ( currentUser.isPermitted( "lightsaber:wield" ) ) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
...
}
上面代码主要有两个步骤:
认证:
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
token.setRememberMe(true);
currentUser.login(token);
判断权限:
currentUser.hasRole( "schwartz" )
1.3.1 认证流程
shiro的认证流程如下:
- Subject进行login操作,参数是封装了用户信息的token
- Security Manager进行登录操作
- Security Manager委托给Authenticator进行认证逻辑处理
- 调用AuthenticationStrategy进行多Realm身份验证
- 调用对应Realm进行登录校验,认证成功则返回用户属性,失败则抛出对应异常
1.3.2 授权流程
授权流程如下:
- 调用Subject.isPermitted()/hasRole()方法
- 委托给SecurityManager
- 而SecurityManager接着会委托给Authorizer
- Authorizer会判断Realm的角色/权限是否和传入的匹配
- 匹配如isPermitted/hasRole会返回true,否则返回false表示授权失败
2. SpringBoot集成Shiro并完成登录操作
2.1 项目信息
2.1.1 开发环境
IDEA:2018.2(lombok插件)
SpringBoot:2.3.1.RELEASE
Shiro:1.3.2
freemarker(前端页面)
2.1.2 项目结构图
2.1.3 pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId&