1 Shiro
什么是
Shiro
官网:
http://shiro.apache.org/
是一款主流的
Java
安全框架,不依赖任何容器,可以运行在
Java SE
和
Java EE
项目中,它的主要作用是对访问系统的用户进行身份认证、
授权、会话管理、加密等操作。
Shiro
就是用来解决安全管理的系统化框架。
2 Shiro
核心组件
用户、角色、权限
会给角色赋予权限,给用户赋予角色
1
、
UsernamePasswordToken
,
Shiro
用来封装用户登录信息,使用 用户的登录信息来创建令牌 Token
。
2
、
SecurityManager
,
Shiro
的核心部分,负责安全认证和授权。
3
、
Suject
,
Shiro
的一个抽象概念,包含了用户信息。
4
、
Realm
,开发者自定义的模块,根据项目的需求,验证和授权的逻 辑全部写在 Realm
中。
5
、
AuthenticationInfo
,用户的角色信息集合,认证时使用。
6
、
AuthorzationInfo
,角色的权限信息集合,授权时使用。
7
、
DefaultWebSecurityManager
,安全管理器,开发者自定义的 Realm 需要注入到
DefaultWebSecurityManager
进行管理才能生 效。
8
、
ShiroFilterFactoryBean
,过滤器工厂,
Shiro
的基本运行机制是开 发者定制规则,Shiro
去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个
Filter
对象来完成。
Shiro
的运行机制如下图所示。
3 Spring Boot 整合 Shiro
1
、创建
Spring Boot
应用,集成
Shiro
及相关组件,
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-shiro</artifactId>
<version>0.1.0</version>
<properties>
<java.version>11</java.version>
<spring.boot.version>2.5.4</spring.boot.version>
<shiro.version>1.7.1</shiro.version>
</properties>
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- Shiro Starter -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- Other Dependencies -->
<!-- Add other dependencies here if needed -->
</dependencies>
<build>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</build>
</project>
2
、自定义
Shiro
过滤器
import sun.net.www.protocol.http.AuthenticationInfo;
public class AccoutRealm extends AuthorizingRealm {
@Autowired
private AccountService accountService;
/**
* 授权
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo
doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 认证
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo
doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
Account account = accountService.findByUsername(token.getUsername());
if (account != null) {
return new SimpleAuthenticationInfo(account, account.getPassword(), getName());
}
return null;
}
}
3、配置类
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean
shiroFilterFactoryBean(@Qualifier("securityManager")
DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new
ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
return factoryBean;
}
@Bean
public DefaultWebSecurityManager
securityManager(@Qualifier("accoutRealm") AccoutRealm
accoutRealm){
DefaultWebSecurityManager manager = new
DefaultWebSecurityManager();
manager.setRealm(accoutRealm);
return manager;
}
@Bean
public AccoutRealm accoutRealm(){
return new AccoutRealm();
}
}
编写认证和授权规则:
认证过滤器
anon
:无需认证。
authc
:必须认证。
authcBasic
:需要通过
HTTPBasic
认证。
user
:不一定通过认证,只要曾经被
Shiro
记录即可,比如:记住我。
授权过滤器
perms
:必须拥有某个权限才能访问。
role
:必须拥有某个角色才能访问。
port
:请求的端口必须是指定值才可以。
rest
:请求必须基于
RESTful
,
POST
、
PUT
、
GET
、
DELETE
。
ssl
:必须是安全的
URL
请求,协议
HTTPS
。
创建
3
个页面,
main.html
、
manage.html
、
administrator.html
访问权限如下:
1
、必须登录才能访问
main.html
2
、当前用户必须拥有
manage
授权才能访问
manage.html
3
、当前用户必须拥有
administrator
角色才能访问
administrator.html
Shiro
整合 Thymeleaf
1
、
pom.xml
引入依赖
<dependency><groupId> com.github.theborakompanioni </groupId><artifactId> thymeleaf-extras-shiro </artifactId><version> 2.0.0 </version></dependency>
2
、配置类添加
ShiroDialect
@Beanpublic ShiroDialect shiroDialect (){return new ShiroDialect ();}
3
、
index.html
<!DOCTYPE html><html lang = "en" xmlns:th = "http://www.thymeleaf.org"xmlns:shiro = "http://www.thymeleaf.org/thymeleaf-extrasshiro" ><head><meta charset = "UTF-8" ><title> Title </title><link rel = "shortcut icon" href = "#" /></head><body><h1> index </h1><div th:if = "${session.account != null}" ><span th:text = "${session.account.username}+' 欢迎回来! '" ></span><a href = "/logout" > 退出 </a></div><a href = "/main" > main </a> <br/><div shiro:hasPermission = "manage" ><a href = "manage" > manage </a> <br/></div><div shiro:hasRole = "administrator" ><a href = "/administrator" > administrator </a></div></body> </html>
数据库