SpringBoot 整合Spring Security框架
引入maven依赖
<!-- 放入spring security依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security配置类
SecurityConfig.java
package com.example.demo.security; import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; /**
* 配置类
* @EnableWebSecurity 开启Security功能
*/
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) //允许通过注解的方法拦截
public class SecurityConfig extends WebSecurityConfigurerAdapter { /**
* 用于密码加密
* @return
*/
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
} /**
* 进行授权
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception{
/**
*定制请求的授权规则
* permitAll() 表示都允许访问
* hasRole("admin") 表示用户必须有admin的角色才能访问
*/ http.authorizeRequests().antMatchers("/").permitAll()
.antMatchers("/add").hasRole("admin"); /**
* 开启自动配置的登录功能,如果没有权限就会来到登录页面
* 1、 /login 请求进入登录页,可自定义
* 表单的用户名name 默认为username
* 密码name 默认为 password
*
* usernameParameter 参数可以设置表单中用户名的name
* passwordParameter 参数可以设置表单中密码的name
*
* 2、重定向到/login?error 表示登录失败
* 定义登录页 /toLogin 请求
* loginProcessingUrl("") 设置登录提交的请求链接
*/
http.formLogin().
loginPage("/toLogin")
.usernameParameter("username")
.passwordParameter("pwd")
.loginProcessingUrl("/login"); /**
* 关闭csrf功能,禁用跨站请求,进行安全访问
*/
http.csrf().disable(); /**
* 开启记住我功能,登录信息保存cookie,
* 默认保存两周
* rememberMeParameter 参数设置表单中 记住我 的name名
*/
http.rememberMe().rememberMeParameter("rememberMe"); /**
* 开启自动配置的注销功能
* 1、访问 logout 表示用户注销,清空session
* 可以通过
* Authentication authentication=SecurityContextHolder.getContext().getAuthentication();
* authentication.getPrincipal(); 获取登录用户信息
*
*
*
* 2、注销成功默认会请求 /login?logout (登录页面)
* 可以通过logoutSuccessUrl() 方法自定义退出成功后的地址
*/
http.logout().logoutSuccessUrl("/"); } /**
* 认证 springboot 2.1.x可以直接使用
* 密码编码 :passwordEncoder
* 在spring security 5.0+ 新增了加密方法
*
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(new UserServiceConfig());
}
}
Spring Security 查询用户信息类
UserServiceConfig.java
package com.example.demo.security; import com.example.demo.entity.CmsUser;
import com.example.demo.entity.Role;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder; import java.util.ArrayList;
import java.util.List; @Configuration
public class UserServiceConfig implements UserDetailsService { @Autowired
private PasswordEncoder passwordEncoder; @Autowired
private UserService userService; /**
* 根据用户名查找用户
* @param username 用户在浏览器输入的用户名
* @return UserDetails 是spring security自己的用户对象
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
CmsUser cmsUser =userService.findByUsername(username); if (cmsUser==null){
//表示查询不到用户,认证失败
return null;
} /**
* 这里为了演示进行了密码加密,实际开发中应该是用户在进行注册时就对密码进行加密,
* 这里直接取数据库的密码进行比对即可,不需要再进行加密
*/
String password=passwordEncoder.encode(cmsUser.getPassword()); /**
* 添加该用户的角色信息
* roleName 是角色名称
*/
List<SimpleGrantedAuthority> authorities=new ArrayList<>();
List<Role> roles=cmsUser.getRoles();
for (Role role:roles){
authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
} return new User(cmsUser.getUsername(),password,authorities);
} }
自定义错误页面
ErrorPageConfig.java
package com.example.demo.security; import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus; /**
* 定制错误页面
*/
@Configuration
public class ErrorPageConfig implements ErrorPageRegistrar { @Override
public void registerErrorPages(ErrorPageRegistry registry) { /**
* 定制禁止访问错误页面
* /403 是错误页面的跳转请求
*/
ErrorPage errorPage=new ErrorPage(HttpStatus.FORBIDDEN,"/403"); registry.addErrorPages(errorPage); }
}
SpringBoot 整合Spring Security框架的更多相关文章
- SpringBoot整合Spring Security
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 Spring Securi ...
- springBoot整合spring security实现权限管理(单体应用版)--筑基初期
写在前面 在前面的学习当中,我们对spring security有了一个小小的认识,接下来我们整合目前的主流框架springBoot,实现权限的管理. 在这之前,假定你已经了解了基于资源的权限管理模型 ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- SpringBoot整合Spring Security使用Demo
https://start.spring.io/ 生成SpringBoot项目 pom文件应该是我这样的: <?xml version="1.0" encoding=&quo ...
- SpringBoot 整合 spring security oauth2 jwt完整示例 附源码
废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...
- SpringBoot整合Light Security框架
官方git地址:https://gitee.com/itmuch/light-security/tree/master 引入maven <dependency> <groupId&g ...
- springboot配置spring security 静态资源不能访问
在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本 spring security 5.x (spring secur ...
- springboot+maven整合spring security
springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...
- SpringBoot安全篇Ⅵ --- 整合Spring Security
知识储备: 关于SpringSecurity的详细学习可以查看SpringSecurity的官方文档. Spring Security概览 应用程序的两个主要区域是"认证"和&qu ...
随机推荐
- Codeforces Gym 101175F - Machine Works(CDQ 分治维护斜率优化)
题面传送门 首先很明显我们会按照 \(d_i\) 的顺序从小到大买这些机器,故不管三七二十一先将所有机器按 \(d_i\) 从小到大排序. 考虑 \(dp\),\(dp_i\) 表示在时刻 \(d_i ...
- 解决mac电脑耳机/外放突然无声音
问题现象 mac电脑基本不会关机,近期发送隔一段时间出现网易云音乐可以播放但是耳机.外放均无声音的问题.此时,电脑本身的声音提示.远程会议声音均正常. 解决方法 网上搜了一圈解决方案,最后发现是输出设 ...
- python 新闻管理系统——启示
mysql取整函数: mysql函数ceil.floor.round mysql 取整 1.ceil() / ceiling() 向上取整 ex: ceil(1.2) = 2 2.floor() 向下 ...
- mysql_sql查性能语句
mysql> SHOW PROCESSLIST; +----+--------+----------------------+-------+-------------+--------+--- ...
- Linux—crontab 定期执行程序的命令
crontab [ -u user ] { -l | -r | -e } 说明: crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表. -u user ...
- Python函数之传参
目录 1. 函数传参 1.1 参数的作用 1.2 形参和实参 1.3 位置参数 1.4 关键字参数 1.5 默认实参 1.6 参数总结 2. 可变参数 1. 函数传参 1.1 参数的作用 1.2 形参 ...
- Linux—软件包管理器yum安装详解
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动下载RPM包 ...
- Scrapy-Redis的安装和使用
Scrapy-Redis是Scrapy的分布式扩展模块,有了它,我们就可以方便地实现Scrapy分布式爬虫的搭建.GitHub:https://github.com/rmax/scrapy-redis ...
- SimpleNVR如何把安防监控画面推流到微信公众号直播
背景需求 进入移动互联网时代以来,微信已成为许多企业除官网以外必备的宣传渠道,当3.2亿直播用户与九亿微信用户的势能增加,在微信上开启直播已成为越来越多企业的不二选择. 需求分析 微信公众号作为平台来 ...
- 我可以减肥失败,但我的 Docker 镜像一定要瘦身成功!
作者|徐伟 来源|尔达 Erda 公众号 简介 容器镜像类似于虚拟机镜像,封装了程序的运行环境,保证了运行环境的一致性,使得我们可以一次创建任意场景部署运行.镜像构建的方式有两种,一种是通过 do ...