【前提情要】

Security学习地址:

https://www.bilibili.com/video/BV1KE411i7bC

狂神的微信笔记:

https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247483957&idx=1&sn=fc30511490b160cd1519e7a7ee3d4ed0&chksm=ce610496f9168d8082bf6cb2e54b0b8628a1db596c1d297d06e756e621569dc3047334b3062c&mpshare=1&scene=23&srcid=0729Qvgf1Lb6AstEnrABaRiH&sharer_sharetime=1595987265426&sharer_shareid=04a2988e19defb0bbbb3d27a02ec4289#rd

【演示案例搭建】

首先是新建一个SpringBoot工程,

不要勾选任何组件,直接添加依赖即可:

<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency> <dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

把静态资源文件和配置导入资源目录中:

每个Level目录中的页面都一样的【空的,啥都没有】,只是为了代表不同的可访问级别的资源

首页展示了所有可以访问的内容:

然后这是登陆页面:

编写一个路由控制器,实现页面之间的跳转访问:

package cn.echo42.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; /**
* @author DaiZhiZhou
* @file SpringSecurity
* @create 2020-07-29 9:53
*/ @Controller
public class RouterController { @RequestMapping({"/","/index"})
public String index(){
return "index";
} @RequestMapping("/toLogin")
public String toLogin(){
return "views/login";
} @RequestMapping("/level1/{id}")
public String level1(@PathVariable("id") int id){
return "views/level1/" + id;
} @RequestMapping("/level2/{id}")
public String level2(@PathVariable("id") int id){
return "views/level2/" + id;
} @RequestMapping("/level3/{id}")
public String level3(@PathVariable("id") int id){
return "views/level3/" + id;
} }

在我们启动工程之后,所有的页面毫无阻拦的就可以被所有的访问者访问到

用户的隐私数据就可以被攻击者窃取。简而言之就是安全隐患

从这里引入安全的概念,然后就是SpringSecurity这样一个解决方案:

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。
它实际上是保护基于spring的应用程序的标准。 Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。
与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求 从官网的介绍中可以知道这是一个权限框架。
想我们之前做项目是没有使用框架是怎么控制权限的?
对于权限 一般会细分为功能权限,访问权限,和菜单权限。
代码会写的非常的繁琐,冗余。 怎么解决之前写权限代码繁琐,冗余的问题,
一些主流框架就应运而生而Spring Scecurity就是其中的一种。

首先引入安全框架组件坐标:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

我们之前编写的内容不需要做出任何的改动:

【授权authorize】

编写一个SpringSecurity配置类:

package cn.echo42.config;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /**
* @author DaiZhiZhou
* @file SpringSecurity
* @create 2020-07-29 10:34
*/ @EnableWebSecurity // 注册为WebSecurity的一个Bean
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override // 注意重写的是这个HttpSecurity参数的configure方法
protected void configure(HttpSecurity http) throws Exception {
// 首页允许所有人访问,那些LEVEL页面只有对应具备的权限的用户才可以访问 http.
authorizeRequests(). // 对以下请求进行授权
antMatchers("/"). // /表示我们的首页
permitAll(). // 表示完全允许访问 // 对相应的地址进行相应的角色设置
antMatchers("/level1/**").hasRole("vip1").
antMatchers("/level2/**").hasRole("vip2").
antMatchers("/level3/**").hasRole("vip3");
}
}

这时候运行工程:

虽然首页所有人均可以访问,但是点击下面的这些LEVEL页面就会被拒绝

There was an unexpected error (type=Forbidden, status=403).

访问被禁止了,也就是我们Security起效了

但是如果访问禁止,按照业务流程,我们应该是将这个请求返回到登录页面:

所以需要进行下一步的设置:

        // 没有权限,重定向到登录页面
http.formLogin();

这时候再来访问就会跳转到登录页面:

不过这登陆页面并不是我们自己那个素材的登录页,而是Security提供的

【权限认证】

重写 重载的config方法,是参数为AuthenticationManagerBuilder的方法

    @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
}

但是我们这个案例没有涉及数据库,所以使用的是从内存中获取数据用以认证

    @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().
// 认证角色 用户名称、密码、对应的多个角色 // 超级管理员就直接赋值所有角色即可
withUser("admin").password("admin").roles("vip1","vip2","vip3").
// 如果是多个角色则使用and方法加上
and().withUser("user1").password("123").roles("vip1").
and().withUser("user2").password("123").roles("vip2").
and().withUser("user3").password("123").roles("vip3");
}

然后再次访问:

当访问被拒绝重定向到登录页面

然后输入我们在Security设置的权限信息之后。。。

我这里看不出来,只有一个500,Security的要求意思是说,密码没有加密也不能访问

所以我们需要做的是就是对密码再加密即可:

    @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).
// 认证角色 用户名称、密码、对应的多个角色 // 超级管理员就直接赋值所有角色即可
withUser("admin").password(new BCryptPasswordEncoder().encode("admin")).roles("vip1","vip2","vip3").
// 如果是多个角色则使用and方法加上
and().withUser("user1").password(new BCryptPasswordEncoder().encode("123")).roles("vip1").
and().withUser("user2").password(new BCryptPasswordEncoder().encode("123")).roles("vip2").
and().withUser("user3").password(new BCryptPasswordEncoder().encode("123")).roles("vip3");
}

再次访问:

使用user1访问level1目录的资源是可以的

但是访问level2就没办法了

【注销功能】

    @Override // 注意重写的是这个HttpSecurity参数的configure方法
protected void configure(HttpSecurity http) throws Exception {
// 首页允许所有人访问,那些LEVEL页面只有对应具备的权限的用户才可以访问 http.
authorizeRequests(). // 对以下请求进行授权
antMatchers("/"). // /表示我们的首页
permitAll(). // 表示完全允许访问 // 对相应的地址进行相应的角色设置
antMatchers("/level1/**").hasRole("vip1").
antMatchers("/level2/**").hasRole("vip2").
antMatchers("/level3/**").hasRole("vip3"); // 没有权限,重定向到登录页面
http.formLogin(); // 注销,退出
http.logout();
}

在首页中插入一个注销标签:

<a class="item" th:href="@{/logout}">
<i class="sign-out icon"></i> 注销
</a>

测试退出:

点击之后自动回到登录页面,并且标注了是注销回到登录页的

如果不是跳转到登录页,而是首页,则可以:

http.logout().logoutSuccessUrl("/");

即追加一个注销成功的重定向地址

【SpringSecurity】01 授权、认证、注销的更多相关文章

  1. SpringBoot--- 使用SpringSecurity进行授权认证

    SpringBoot--- 使用SpringSecurity进行授权认证 前言 在未接触 SpringSecurity .Shiro 等安全认证框架之前,如果有页面权限需求需要满足,通常可以用拦截器, ...

  2. 使用SpringSecurity搭建授权认证服务(1) -- 基本demo认证原理

    使用SpringSecurity搭建授权认证服务(1) -- 基本demo 登录认证是做后台开发的最基本的能力,初学就知道一个interceptor或者filter拦截所有请求,然后判断参数是否合理, ...

  3. IOS第三天-新浪微博 - 版本新特性,OAuth授权认证

    *********版本新特性 #import "HWNewfeatureViewController.h" #import "HWTabBarViewController ...

  4. 七天学会ASP.NET MVC (四)——用户授权认证问题

    小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在第四天的学习中,我们主要了学习如何在MVC中如何实现认证授权等问题,本节主要讲了验证错误时的错误值,客户端验 ...

  5. MVC授权认证

    处于安全性考虑,MVC可以完成授权认证,授权认证的方式如下: 1.配置Config文件,设置登录页面: <authentication mode="Forms"> &l ...

  6. MySQL权限授权认证详解

    MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删除 ...

  7. SpringSecurity个性化用户认证流程

    ⒈自定义登录页面 package cn.coreqi.security.config; import org.springframework.context.annotation.Bean; impo ...

  8. 七天学会ASP.NET MVC (四)——用户授权认证问题 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_four.html 小编应各位的要求,快马加鞭,马不停蹄的终于:七天学会 Asp.Net MVC 第四篇出炉,在 ...

  9. SpringSecurity之授权

    SpringSecurity之授权 目录 SpringSecurity之授权 1. 写在前面的话 2. web授权 1. 建库 2. 添加查询权限的接口 3. 前端页面的编写 4. SpringSec ...

  10. Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制

    之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ...

随机推荐

  1. 腾讯手游助手 WIN11 蓝屏 DPC_WATCHDOG_VIOLATION

    DPC_WATCHDOG_VIOLATION 退出QQ,或者下载最新版本QQ.

  2. idea 中的 jrebel

    1.打开idea设置 ,下载 jrebel 2搜索下载jrebel 3.重启之后,在右下角有个弹窗,这时候选择enable,然后右边的侧边栏工具会弹出一个界面,总共应该有4步,第一步是展开的,点击蓝色 ...

  3. spring eureka服务注册配置,排查服务注册上来了,但是请求没有过来。检查是否服务注册配置错误

    spring eureka服务注册配置,排查服务注册上来了,但是请求没有过来.检查是否服务注册配置错误 解决方法: 去掉该配置eureka.instance.hostname = client微服务的 ...

  4. Linux chmod -bash: ./xx.sh: Permission denied的解决方案

    Linux -bash: ./xx.sh: Permission denied的解决方案启动tomcat命令:./startup.sh之后提示-bash: ./startup.sh: Permissi ...

  5. 【Playwright+Python】系列教程(一)环境搭建及脚本录制

    前言 看到这个文章,有的同学会说: 六哥,你为啥不早早就写完python系列的文章. 因为有徒弟需要吧,如果你也想学自学,那这篇文章,可以说是我们结缘一起学习的开始吧! 如果对你有用,建议收藏和转发! ...

  6. Oh-My-Zsh 提示符只显示当前路径,不需要修改主题文件

    我真是服了.就这么一个简单的小问题我在网上找了一个多小时,一大堆 CSDN 文章都是抄 同一篇博客 的教程,所有的博客都要我去把 ~/.oh-my-zsh/themes/*.zsh-theme 文件里 ...

  7. Jenkins创建任务进行构建项目配置

    总体构建项目的操作步骤 分为Generna(总的描述).源码管理.构建触发器.构建环境.构建.构建后的操作 1.Dashboard-> new item > 新建一个任务,选择freest ...

  8. C# SM2算法 加密,解密,签名,验签

    最近时间在整SM2算法,在网上看到不少代码,基本都是使用BouncyCastle库,现在这个版本算比较好的拿来分享给大家. 首先引入包 Portable.BouncyCastle 完整代码见Gitee ...

  9. 『vulnhub系列』HACKABLE-II

    『vulnhub系列』HACKABLE-II 下载地址: https://www.vulnhub.com/entry/hackable-ii,711/ 信息搜集: 使用nmap探测存活主机,发现主机开 ...

  10. [翻译] PySide6.QtCore.Qt.ConnectionType

    翻译 (自用,不保证对) PySide6.QtCore.Qt.ConnectionType 这个 enum 描述了 signals 和 slots 连接(connection) 的类型. 在一些特殊情 ...