springboot与安全

概念:

  • 安全

    Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型。他可以实现强大的web安全控制。对于安全控制,我们仅需引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理。

几个类:

       WebSecurityConfigurerAdapter:自定义Security策略

       AuthenticationManagerBuilder:自定义认证策略

       @EnableWebSecurity:开启WebSecurity模式

  1. 应用程序的两个主要区域是“认证”和“授权”(或者访问控制)。这两个主要区域是Spring Security 的两个目标。

  2. 认证”(Authentication),是建立一个他声明的主体的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统)。

  3. “授权”(Authorization)指确定一个主体是否允许在你的应用程序执行一个动作的过程。为了抵达需要授权的店,主体的身份已经有认证过程建立。

  4. 这个概念是通用的而不只在Spring Security中。

  • Web&安全 
  1. 登陆/注销 HttpSecurity配置登陆、注销功能

  2. Thymeleaf提供的SpringSecurity标签支持

    1. 需要引入thymeleaf-extras-springsecurity4

    2. sec:authentication=“name”获得当前用户的用户名

    3. sec:authorize=“hasRole(‘ADMIN’)”当前用户必须拥有ADMIN权限时才会显示标签内容

  3. remember me

    1. 表单添加remember-me的checkbox

    2. 配置启用remember-me功能

  4. CSRF(Cross-site request forgery)跨站请求伪造:HttpSecurity启用csrf功能,会为表单添加_csrf的值,提交携带来预防CSRF;

pom文件引入规则:

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <!-- 这里springbooot必须是2.0.7版本,否则sec:authorize="isAuthenticated()"不起作用--> 9 <version>2.0.7.RELEASE</version> 10 <relativePath/> <!-- lookup parent from repository --> 11 </parent> 12 <groupId>com.springbootTest</groupId> 13 <artifactId>springboot05-security</artifactId> 14 <version>0.0.1-SNAPSHOT</version> 15 <name>springboot05-security</name> 16 <description>Demo project for Spring Boot</description> 17 18 <properties> 19 <java.version>1.8</java.version> 20 <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version> 21 <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version> 22 <thymeleaf-extras-springsecurity4.version>3.0.4.RELEASE</thymeleaf-extras-springsecurity4.version> 23 </properties> 24 25 26 <dependencies> 27 <!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 --> 28 <!--thmeleaf和springsecurity的依赖--> 29 <dependency> 30 <groupId>org.thymeleaf.extras</groupId> 31 <artifactId>thymeleaf-extras-springsecurity4</artifactId> 32 <version>3.0.4.RELEASE</version> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-thymeleaf</artifactId> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-starter-security</artifactId> 41 </dependency> 42 <dependency> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-starter-web</artifactId> 45 </dependency> 46 47 <dependency> 48 <groupId>org.springframework.boot</groupId> 49 <artifactId>spring-boot-starter-test</artifactId> 50 <scope>test</scope> 51 </dependency> 52 </dependencies> 53 54 <build> 55 <plugins> 56 <plugin> 57 <groupId>org.springframework.boot</groupId> 58 <artifactId>spring-boot-maven-plugin</artifactId> 59 </plugin> 60 </plugins> 61 </build> 62 63</project>

自定义Security策略类写法:

1package com.springboottest.security.config; 2 3import org.springframework.context.annotation.Configuration; 4import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 5import org.springframework.security.config.annotation.web.builders.HttpSecurity; 6import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 7import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 8 9 10@EnableWebSecurity 11public class MySecurityConfig extends WebSecurityConfigurerAdapter { 12 @Override 13 protected void configure(HttpSecurity http) throws Exception { 14 //super.configure(http); 15 //定制请求的授权规则 16 http.authorizeRequests().antMatchers("/").permitAll() 17 .antMatchers("/level1/**").hasRole("VIP1") 18 .antMatchers("/level2/**").hasRole("VIP2") 19 .antMatchers("/level3/**").hasRole("VIP3"); 20 //开启自动配置的登陆功能,效果:如果没有登陆,没有权限就会来到登陆页面 21 http.formLogin().usernameParameter("user").passwordParameter("pwd") 22 .loginPage("/userlogin");//告诉登录页发送什么请求 23 //1. /login来到登录页 24 //2. /login?error表示登陆失败 25 //3. 用户名密码等等更多详细规则 26 //4. 默认post形式的/login代表处理登陆 27 //5. 一但定制LoginPage;那么LoginPage的post请求就是登陆 28 29 //开启自动配置的注销功能 30 http.logout().logoutSuccessUrl("/");//注销成功以后来到首页 31 //1. 访问/logout 表示用户注销,清空session 32 //2. 注销成功会返回 /login?logout 页面 33 34 35 //开启记住我功能 36 http.rememberMe().rememberMeParameter("remember"); 37 //登陆成功以后,将cookie发给浏览器,以后登陆带上这个cookie,只要通过检查就可以免登陆 38 //点击注销会删除cookie 39 } 40 41 //定义认证规则 42 @Override 43 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 44 //super.configure(auth); 45 // //.passwordEncoder(new MyPasswordEncoder())。 46 //这样,页面提交时候,密码以明文的方式进行匹配。看下面解释。 47 auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("zhangsan").password("123456").roles("VIP1","VIP2") 48 .and() 49 .withUser("lisi").password("123456").roles("VIP2","VIP3") 50 .and() 51 .withUser("wangwu").password("123456").roles("VIP1","VIP3"); 52 } 53}

密码不文明方式报错:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

解决方法:

这是因为Spring boot 2.0.3引用的security 依赖是 spring security 5.X版本,此版本需要提供一个PasswordEncorder的实例,否则后台汇报错误:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
并且页面毫无响应。
因此,需要创建PasswordEncorder的实现类。
MyPasswordEncoder.class:

1@Component 2public class MyPasswordEncoder implements PasswordEncoder { 3 4 5 @Override 6 public String encode(CharSequence charSequence) { 7 return charSequence.toString(); 8 } 9 10 @Override 11 public boolean matches(CharSequence charSequence, String s) { 12 return s.equals(charSequence.toString()); 13 } 14}

welcome.html:

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org" 3 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> 4<head> 5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6<title>Insert title here</title> 7</head> 8<body> 9<h1 align="center">欢迎光临武林秘籍管理系统</h1> 10<div sec:authorize="!isAuthenticated()"> 11 <h2 align="center">游客您好,如果想查看武林秘籍 <a th:href="@{/userlogin}">请登录</a></h2> 12</div> 13<div sec:authorize="isAuthenticated()"> 14 <h2><span sec:authentication="name"></span>,您好,您的角色有: 15 <span sec:authentication="principal.authorities"></span></h2> 16 <form th:action="@{/logout}" method="post"> 17 <input type="submit" value="注销"/> 18 </form> 19</div> 20 21<hr> 22 23<div sec:authorize="hasRole('VIP1')"> 24<h3>普通武功秘籍</h3> 25<ul> 26 <li><a th:href="@{/level1/1}">罗汉拳</a></li> 27 <li><a th:href="@{/level1/2}">武当长拳</a></li> 28 <li><a th:href="@{/level1/3}">全真剑法</a></li> 29</ul> 30</div> 31 32<div sec:authorize="hasRole('VIP2')"> 33<h3>高级武功秘籍</h3> 34<ul> 35 <li><a th:href="@{/level2/1}">太极拳</a></li> 36 <li><a th:href="@{/level2/2}">七伤拳</a></li> 37 <li><a th:href="@{/level2/3}">梯云纵</a></li> 38</ul> 39</div> 40 41<div sec:authorize="hasRole('VIP3')"> 42<h3>绝世武功秘籍</h3> 43<ul> 44 <li><a th:href="@{/level3/1}">葵花宝典</a></li> 45 <li><a th:href="@{/level3/2}">龟派气功</a></li> 46 <li><a th:href="@{/level3/3}">独孤九剑</a></li> 47</ul> 48</div> 49</body> 50</html>

login.html:

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8"> 5<title>Insert title here</title> 6</head> 7<body> 8 <h1 align="center">欢迎登陆武林秘籍管理系统</h1> 9 <hr> 10 <div align="center"> 11 <form th:action="@{/userlogin}" method="post"> 12 用户名:<input name="user"/><br> 13 密码:<input name="pwd"><br/> 14 <input type="checkbox" name="remember"> 记住我 15 <br/> 16 <input type="submit" value="登陆"> 17 </form> 18 </div> 19</body> 20</html>

完整代码见资源(Spring Security框架)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Spring Security使用详解1(基本用法 )

一般项目都会有严格的认证和授权操作,而在Java开发领域常见的安全框架有Shiro和SpringSecurity。本文首先介绍下后者。一、基本用法1、什么是SpringSecurity?SpringSecurity是一个相对复杂的安全管理框架,功能比Shiro更加强大,权限控制细粒度更高,对O

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid

Python之time模块的时间戳、时间字符串格式化与转换

Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y