security
概述
演示 SpringSecurity + JWT 实现认证和授权功能
案例
自己制作的 SpringSecurity5 案例是 顺杰货运后台服务
创建工程
详情
按照如下操作,创建只有两个依赖的最简单项目 Spring Web 和 Spring Security

源码
登录表单默认属性名称
在 SpringSecurity 的源码类 UsernamePasswordAuthenticationFilter 中定义了两个常量 SPRING_SECURITY_FORM_USERNAME_KEY 和 SPRING_SECURITY_FORM_PASSWORD_KEY 分别是登录表单中用户名和密码的属性,要求前端页面中登录属性和这里一直。
特性
注解鉴权
默认没有开启通过注解鉴权,所以要使用 @EnableGlobalMethodSecurity 显式的开启,一般写在配置类或者启动类上:
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class SpringsecurityDemoApplication {
......
}
如果没有权限则报错500,抛出异常 org.springframework.security.access.AccessDeniedException,可以将相关注解在 service 的接口和方法上使用,也可以用于控制器方法上,一般用在后者上。注意使用了注解的方式就不要再使用配置鉴权。
注解的使用
@Secured
用于判断是否具有角色,用于方法或者类上,参数要以 ROLE_ 开头
@PreAuthorize 和 @PostAuthorize
@PreAuthorize 表示访问方法或者类之前先判断是否有权限,相反的后者是在执行之后判断权限,一般都用前者。
RememberMe
记住我的功能,登录时勾选,此后可以不登录进行访问。类似登录时默认表单属性是 username 和 password,这里默认的属性名称是 remember-me,详细步骤如下
详情
一、添加依赖
由于 remember-me 基于 jdbc 实现,所以要添加下面依赖
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
二、配置数据库连接
本功能默认会向指定表中记录 remember-me 的 token,由于上面添加了数据库依赖,必须填写数据库连接的参数,记得创建数据库 spring-security-demo,登录时勾选了记住我则会向表 persistent_logins 新增一行数据,相反则不会。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-security-demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: chanchaw
三、代码实现
- 准备
IOC容器管理的PersistentTokenRepository类型的Bean(在文件Meta4Config中) - 配置类
SecurityConfig中添加http.rememberMe()相关代码 - 查看
a3814d9d765a37cc2d9e2911e442d5a42674fecc后面一个提交
thymeleaf
thymeleaf 有专门对于 SpringSecurity 的支持,按照下面步骤集成
详情
添加如下依赖
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
