- 安全时互联网公司的一道生命线,几乎所有公司都会涉及到这方面的需求。在Java领域一般有Spring Security、Apache Shiro等安全框架,但是由于Spring Security过于庞大和复杂,大多数公司选择Apache Shiro来使用。
- Apache Shiro是一个功能强大、灵活的、开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。Apache Shiro的首要目标是易于使用和理解。安全通常很复杂,甚至让人感到痛苦,但是Shiro却不是这样子的。一个好的安全框架应该是屏蔽复杂性,向外暴露简单、直观的API来简化开发人员实现应用程序安全所花费的时间和精力。
Shiro能做什么呢?
- 验证用户身份
- 用户访问权限控制,比如:1.判断用户是否分配了一定的安全角色。2.判断用户是否被授予完成某个操作的权限
- 在非Web或EJB容器的环境下可以任意使用Session API
- 可以响应认证、访问控制、或则Session生命周期中发生的事件
- 可以将一个或以上用户安全数据源数据组合成一个复合的用户“view(视图)”
- 支持单点登录(SSO)功能
- 支持提供“Remember Me”服务,获取用户关联信息而无需登录
等都集成到一个有凝聚力的易于使用的API。Shiro致力在所有应用环境下实现上诉功能,小到命令行应用程序,大到企业应用中,而且不需要借助第三方框架、容器、应用服务器等。当然Shiro的目的是尽量的融入到这样的应用环境中去,但也可以在它们之外的任何环境下开箱即用。
Shiro特性
- 是一个全面的、蕴含丰富功能的安全框架。
- Authentication(认证),Authorization(授权),Session Management(会话管理),Cryptography(加密)被Shiro框架的开发团队称之为应用安全的四大基石。
- Authentication(认证):用户身份识别,通常被称为用户“登录”
- Authorization(授权):访问控制,比如某个用户是否具有某个操作的权限
- Session Management(会话管理):特定于用户的会话管理,甚至在非web或EJB应用程序
- Cryptography(加密):在对数据源使用加密算法加密的同时,保证易于使用
它还有其他功能来支持和加强这些不同应用环境下安全领域的关注点。
- Web支持:Shiro提供Web支持api,可以很轻松保护Web应用程序的安全
- 缓存:缓存Apache Shiro保证安全操作快速、高效的重要手段
- 并发:Apache Shiro支持多线程应用程序的并发特性
- 测试:支持单元测试和集成测试,确保代码和预想的一样安全
- “Run As”:这个功能允许用户假设另一个用户的身份(在许可的前提下)
- “Remember Me”:跨session记录用户的身份,只有在强制需要时才需登录
Shiro不会去维护用户、维护权限、这些需要我们自己去涉及/提供,之后通过相应的接口注入给Shiro
pom文件引入依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>1.2.1</version>
</dependency>
项目中预先准备用户表,角色表,用户角色表,权限菜单表,角色权限菜单表
/*
Navicat MySQL Data Transfer
Source Server : 本机mysql
Source Server Version : 50713
Source Host : localhost:3306
Source Database : zmx
Target Server Type : MYSQL
Target Server Version : 50713
File Encoding : 65001
Date: 2019-09-03 15:43:05
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` bigint(20) NOT NULL,
`avatar` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
`realname` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user