跳至主要內容

security

chanchaw大约 2 分钟javaspring

概述

演示 SpringSecurity + JWT 实现认证和授权功能

案例

自己制作的 SpringSecurity5 案例是 顺杰货运后台服务open in new window

创建工程

详情

按照如下操作,创建只有两个依赖的最简单项目 Spring WebSpring Security

源码

登录表单默认属性名称

SpringSecurity 的源码类 UsernamePasswordAuthenticationFilter 中定义了两个常量 SPRING_SECURITY_FORM_USERNAME_KEYSPRING_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

记住我的功能,登录时勾选,此后可以不登录进行访问。类似登录时默认表单属性是 usernamepassword,这里默认的属性名称是 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-metoken,由于上面添加了数据库依赖,必须填写数据库连接的参数,记得创建数据库 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>