1、Shiro是Apache下的一个开源项目,我们称之为Apache Shiro。它是一个很易用与Java项目的的安全框架,提供了认证、授权、加密、会话管理,与spring Security 一样都是做一个权限的安全框架,但是与Spring Security 相比,在于 Shiro 使用了比较简单易懂易于使用的授权方式。shiro属于轻量级框架,相对于security简单的多,也没有security那么复杂。所以我这里也是简单介绍一下shiro的使用。
2、非常简单;其基本功能点如下图所示:
![Springboot+Shiro+redis整合](http://p2.ttnews.xyz/loading.gif)
![Springboot+Shiro+redis整合](http://p2.ttnews.xyz/loading.gif)
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
Web Support:Web支持,可以非常容易的集成到Web环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。
记住一点,Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可。
3、这里我就简单介绍一下springboot和shiro整合与基本使用。
需要的基础包:pom.xml
<project>
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.winter/<groupid>
<artifactid>HtmlCssJs/<artifactid>
<version>0.0.1-SNAPSHOT/<version>
<packaging>war/<packaging>
<name>HtmlCssJs/<name>
<description>This is Html Css Js Demo Project/<description>
<parent>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-parent/<artifactid>
<version>1.5.3.RELEASE/<version>
<relativepath>
<properties>
<project.build.sourceencoding>UTF-8/<project.build.sourceencoding>
<project.reporting.outputencoding>UTF-8/<project.reporting.outputencoding>
<java.version>1.8/<java.version>
<dependencies>
<dependency>
<groupid>net.sourceforge.nekohtml/<groupid>
<artifactid>nekohtml/<artifactid>
<dependency> /<dependency>
<groupid>net.sf.json-lib/<groupid>
<artifactid>json-lib/<artifactid>
<version>2.4/<version>
<classifier>jdk15/<classifier>
<dependency>
<groupid>org.apache.shiro/<groupid>
<artifactid>shiro-spring/<artifactid>
<version>1.4.0/<version>
<dependency> /<dependency>
<groupid>org.quartz-scheduler/<groupid>
<artifactid>quartz/<artifactid>
<version>2.2.1/<version>
<dependency> /<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context-support/<artifactid>
<dependency>
<groupid>org.mybatis.spring.boot/<groupid>
<artifactid>mybatis-spring-boot-starter/<artifactid>
<version>1.3.0/<version>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-thymeleaf/<artifactid>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-aop/<artifactid>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
<exclusions>
<exclusion>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-tomcat/<artifactid>
<dependency>
<groupid>org.apache.tomcat/<groupid>
<artifactid>tomcat-servlet-api/<artifactid>
<version>8.0.36/<version>
<scope>provided/<scope>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-jpa/<artifactid>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-test/<artifactid>
<scope>test/<scope>
<dependency> /<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-mail/<artifactid>
<dependency>
<groupid>mysql/<groupid>
<artifactid>mysql-connector-java/<artifactid>
<dependency>
<groupid>javax.servlet/<groupid>
<artifactid>javax.servlet-api/<artifactid>
<dependency>
<groupid>javax.servlet/<groupid>
<artifactid>jstl/<artifactid>
<dependency>
<groupid>org.apache.tomcat/<groupid>
<artifactid>tomcat-jsp-api/<artifactid>
<dependency>
<groupid>org.apache.tomcat.embed/<groupid>
<artifactid>tomcat-embed-core/<artifactid>
<dependency>
<groupid>org.apache.tomcat.embed/<groupid>
<artifactid>tomcat-embed-jasper/<artifactid>
<dependency>
<groupid>com.fasterxml.jackson.core/<groupid>
<artifactid>jackson-core/<artifactid>
<dependency>
<groupid>com.fasterxml.jackson.core/<groupid>
<artifactid>jackson-databind/<artifactid>
<dependency>
<groupid>com.fasterxml.jackson.datatype/<groupid>
<artifactid>jackson-datatype-joda/<artifactid>
<dependency>
<groupid>com.fasterxml.jackson.module/<groupid>
<artifactid>jackson-module-parameter-names/<artifactid>
<dependency>
<groupid>com.github.pagehelper/<groupid>
<artifactid>pagehelper-spring-boot-starter/<artifactid>
<version>1.1.2/<version>
<dependency>
<groupid>com.alibaba/<groupid>
<artifactid>druid-spring-boot-starter/<artifactid>
<version>1.1.0/<version>
<dependency>
<groupid>redis.clients/<groupid>
<artifactid>jedis/<artifactid>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-redis/<artifactid>
<dependency>
<groupid>org.springframework.data/<groupid>
<artifactid>spring-data-redis/<artifactid>
<dependency>
<groupid>aspectj/<groupid>
<artifactid>aspectjweaver/<artifactid>
<version>1.5.3/<version>
<dependency>
<groupid>org.weixin4j.spring.boot/<groupid>
<artifactid>weixin4j-spring-boot-starter/<artifactid>
<version>1.0.0/<version>
<dependency>
<groupid>com.soecode.wx-tools/<groupid>
<artifactid>wx-tools/<artifactid>
<version>2.1.4-RELEASE/<version>
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-maven-plugin/<artifactid>
/<project>基本配置application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/world?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
mybatis.mapper-locations=classpath*:mapper/*Mapper.xml
mybatis.type-aliases-package=com.cwh.springbootMybatis.entity
#thymeleaf模板使用
#关闭thymeleaf缓存
spring.thymeleaf.cache=false
#去掉thymeleaf的严格的模板校验
#spring.thymeleaf.mode=LEGACYHTML5
#Spring Jpa
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
OK ,开始我们需要3个实体,用户,角色和权限
// 实体类名
@Entity
// 映射数据库表名
@Table(name="tb_user")
public class User implements Serializable{
/**
*/
private static final long serialVersionUID = 1L;
@Id
// 主键自增长
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;
// 列名
@Column
public String name;
@Column
public String password;
@OneToMany(cascade=CascadeType.ALL)
private List<role> roles;/<role>
// 省略get set..
@Entity
@Table(name="tb_role")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String roleName;
@ManyToOne(fetch = FetchType.EAGER)
private User user;
@OneToMany(cascade = CascadeType.ALL)
private List<permission> permissions;/<permission>
// 省略get set..
@Entity
@Table(name="tb_permission")
public class Permission {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String permission;
@ManyToOne(fetch = FetchType.EAGER)
private Role role;
// 省略get set..
閱讀更多 JAVA君 的文章