SpringSecurity:简单入门
SpringSecurity能做什么
SpringSecurity是一个安全框架,使用它可以让我们的系统变得安全一点,它可以对登陆系统的用户进行验证和授权
一个安全的系统需要做的事情很多,比如:防SQL注入、XSS攻击、CSRF等等,
还需要对每一个登陆系统的用户进行权限认证,即决定了每个用户能做什么、不能做什么
在权限管理之前,还得对用户进行授权,授权后根据权限区分用户
授予和权限认证就是SpringSecurity主要做的事情
很重要的一点是,在SpringBoot中使用,可以让原本对开发者来说复杂的SpringSecurity变得简单易用
当然SpringSecurity也有很明显的缺点,就是导入依赖之后,就默认实现了很多奇奇怪怪的东西,让人感觉莫名其妙
SpringSecurity怎么使用
1、首先使用maven导入依赖包
这里是直接在SpringBoot中集成的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency> <dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
2、创建一个Controller类测试一下,所以还要导入web依赖包
SecretController.java
1 import org.springframework.web.bind.annotation.GetMapping;
2 import org.springframework.web.bind.annotation.RestController;
3
4 @RestController
5 public class SecretController {
6 @GetMapping("/secret")
7 public String getSecret(){
8 return "this is secret";
9 }
10 }
然后运行项目我们直接访问 http://localhost:8080/secret ,会发现页面重定向了,跳转到了一个登陆页面
我们甚至没有设置登陆用户名和密码
这个地方SpringSecurity默认的用户名是user,密码是动态生成的,在日志中会显示
这就是SpringSecurity强大的地方,仅仅是导入了依赖包,就默认进行了登陆验证,当然这也是弊端,因为我们根本不知道它是怎么配置的。
上面是SpringSecurity为我们默认配置的一个登陆页面,下面我们自己进行配置
2、使用SpringSecurity的配置(简单的例子)
这里是整个例子的文件结构还有pom.xml,以及使用了thymeleaf,所以要导入依赖
文件结构
pom.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6
7 <groupId>org.example</groupId>
8 <artifactId>SecurityTest</artifactId>
9 <version>1.0-SNAPSHOT</version>
10
11 <parent>
12 <groupId>org.springframework.boot</groupId>
13 <artifactId>spring-boot-starter-parent</artifactId>
14 <version>2.5.2</version>
15 </parent>
16
17 <dependencies>
18 <dependency>
19 <groupId>org.springframework.boot</groupId>
20 <artifactId>spring-boot-starter-web</artifactId>
21 </dependency>
22
23 <dependency>
24 <groupId>org.springframework.boot</groupId>
25 <artifactId>spring-boot-starter-thymeleaf</artifactId>
26 </dependency>
27
28 <dependency>
29 <groupId>org.springframework.boot</groupId>
30 <artifactId>spring-boot-starter-security</artifactId>
31 </dependency>
32 </dependencies>
33
34 <properties>
35 <maven.compiler.source>8</maven.compiler.source>
36 <maven.compiler.target>8</maven.compiler.target>
37 </properties>
38
39 </project>
首先我们要自己创建一个login页面,以及登录以后访问的页面
login.html
1 <!DOCTYPE html>
2 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
3 xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
4 <head>
5 <title>Spring Security Example </title>
6 </head>
7 <body>
8 <div th:if="${param.error}">
9 Invalid username and password.
10 </div>
11 <div th:if="${param.logout}">
12 You have been logged out.
13 </div>
14 <form th:action="@{/login}" method="post">
15 <div><label> User Name : <input type="text" name="username"/> </label></div>
16 <div><label> Password: <input type="password" name="password"/> </label></div>
17 <div><input type="submit" value="Sign In"/></div>
18 </form>
19 </body>
20 </html>
hello.html
1 <!DOCTYPE html>
2 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
3 xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
4 <head>
5 <title>Hello World!</title>
6 </head>
7 <body>
8 <h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
9
10 </body>
11 </html>
然后再MVC里面配置一下这两个页面,才可以通过url进行访问,MVC的配置需要实现WebMvcConfigurer接口
MvcConfig.java
1 import org.springframework.context.annotation.Configuration;
2 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
3 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
4
5 @Configuration
6 public class MvcConfig implements WebMvcConfigurer {
7
8 @Override
9 public void addViewControllers(ViewControllerRegistry registry) {
10
11 registry.addViewController("/").setViewName("login");
12 registry.addViewController("/hello").setViewName("hello");
13 registry.addViewController("/login").setViewName("login");
14 }
15 }
然后我们需要进行SpringSecurity的配置,定义页面访问请求时,用户需要哪些权限,需要继承WebSecurityConfigurerAdapter类进行配置
现在配置中自己定义了一个用户(在实际项目中从数据库获取),而不再是由SpringSecurity默认定义
WebSecurityConfig.java
1 import org.springframework.context.annotation.Bean;
2 import org.springframework.context.annotation.Configuration;
3 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
4 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
5 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
6 import org.springframework.security.core.userdetails.User;
7 import org.springframework.security.core.userdetails.UserDetails;
8 import org.springframework.security.core.userdetails.UserDetailsService;
9 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
10 import org.springframework.security.crypto.password.PasswordEncoder;
11 import org.springframework.security.provisioning.InMemoryUserDetailsManager;
12
13 @Configuration
14 @EnableWebSecurity
15 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
16 /*
17 @EnableWebSecurity注解让springsecurity集成springmvc
18 */
19 @Override
20 protected void configure(HttpSecurity http) throws Exception {
21 /*
22 定义了哪些路径访问是需要权限的,哪些不用
23 /和/login两个url是不需要权限就可以访问的
24 /hello需要有“USER”权限才能够访问
25 */
26 http.authorizeRequests()
27 .antMatchers("/hello")
28 .hasRole("USER")
29 .and()
30 .formLogin()
31 .loginPage("/login")
32 .permitAll();
33 }
34
35
36 @Bean
37 public PasswordEncoder passwordEncoder(){
38 /*
39 声明一个加密工具的Bean,供用户进行加密时调用
40 */
41 return new BCryptPasswordEncoder();
42 }
43
44 @Bean
45 @Override
46 protected UserDetailsService userDetailsService() {
47 /*
48 设置了一个预先存储在系统中的用户
49 赋予用户“USER”权限,才能够访问hello页面
50 */
51 String username = "user";
52 String password = "password";
53 UserDetails user = User.withUsername(username).password(new BCryptPasswordEncoder().encode(password)).roles("my").build();
54 return new InMemoryUserDetailsManager(user);
55 }
56 }
现在运行项目,在没有登录之前,访问/hello会被重定向到login页面,登录之后就能访问hello页面了
如果把上面代码里,用户的角色权限“USER”改成其他的,登录之后访问\hello则会抛出403错误,因为权限不够
SpringSecurity:简单入门的更多相关文章
- SpringSecurity简单入门
1.简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spr ...
- spring security 简单入门
spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...
- 用IntelliJ IDEA创建Gradle项目简单入门
Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...
- [原创]MYSQL的简单入门
MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...
- Okio 1.9简单入门
Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Docker 简单入门
Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- git简单入门
git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...
随机推荐
- Mysql在线DDL
1. Mysql各版本DDL方式 1.1 MysqlDDL演进 当mysql某个业务表上有未提交的活动事务的时候,你去执行在线DDL,这相当危险,直接会被卡住,show processlist里面会 ...
- 【Azure 应用服务】Azure Function App 执行PowerShell指令[Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt]错误
问题描述 使用PowerShell脚本执行获取Azure订阅列表的指令(Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt).在本地 ...
- 『心善渊』Selenium3.0基础 — 25、unittest单元测试框架
目录 1.unittest基本简介 2.unittest基本概念 (1)unittest核心的四个概念 (2)如何创建一个测试类 (3)test fixture常用的四个方法 (4)unittest编 ...
- 简单学习java内存马
看了雷石的内存马深入浅出,就心血来潮看了看,由于本人java贼菜就不介绍原理了,本文有关知识都贴链接吧 前置知识 本次主要看的是tomcat的内存马,所以前置知识有下列 1.tomcat结构,tomc ...
- flex布局制作自适应网页
网页布局是css的一个重点应用.传统的布局都是依赖display.position.float属性来实现的,但是特殊布局就不易实现,如垂直居中. 01 flex布局是什么? Flex 是 Flexi ...
- MQTT 3 ——MQTT与Spring Mvc整合
本篇记录一下MQTT客户端与Spring Mvc整合 网络上已经有很多的MQTT客户端与SpringBoot整合的技术文档,但是与Spring Mvc框架的整合文档似乎并不太多,可能是因为Spri ...
- Beautifulsoup网页解析——爬取豆瓣排行榜分类接口
我们在网页爬取的过程中,会通过requests成功的获取到所需要的信息,而且,在返回的网页信息中,也是通过HTML代码的形式进行展示的.HTML代码都是通过固定的标签组合来实现页面信息的展示,所以,最 ...
- IDEA 生成类注释和方法注释
目录 一.生成类注释-01 1.1.生成类注解模板 1.2.把模板设置到IDEA中 1.3.效果图 二.生成类注释-02 2.1.生成类注释模板 2.2.把模板设置到IDEA中 2.3.效果图 2.4 ...
- ORM研究3 - odoo fields常用的字段属性
之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...
- 微信小程序云开发-云函数-数据库和云函数获取数据的区别
一.数据库获取数据 1.1 数据库获取数据的写法 在本地创建的页面js文件中写代码 1.2 数据库获取数据返回数据限制20条 数据库获取数据,每次返回20条数据(数据库有108条数据) 1.3 数据库 ...