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 ...
随机推荐
- 洛谷 P4062 - [Code+#1]Yazid 的新生舞会 的线性做法
洛谷题面传送门 一个线性做法. \(n\log n\) 解法可以戳这里查看 首先回顾一下 \(n\log n\) 解法的过程:我们对于每一个数 \(x\),考察其出现位置,设为 \(t_1,t_2,t ...
- 洛谷 P3307 - [SDOI2013]项链(Burnside 引理+数论)
题面传送门 看到题目我们显然可以将题目拆分成两部分:首先求出有多少个符合要求的珠子 \(c\),这样我们就可以将每种珠子看成一种颜色,题目也就等价于有多少种用 \(c\) 种颜色染长度为 \(n\) ...
- SQLite3 约束和简单命令
安装sqlite3,配置环境变量. 1.打开数据库 sqlite3.exe db_name.db 2.常用命令 .tables 查看所有表 .headers on 设置显示表头 .schema tab ...
- Kubernetes:Pod 升级、回滚
本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例). 本文为作者的 Kubernetes 系 ...
- 【讲座】詹显全——Proteoforms在肿瘤中应用
Proteoforms/Protein species这个概念还是比较有意义的. 人类结构基因组测序接近尾声,人们就从结构基因组学研究转向功能基因组学研究,即对转录组和蛋白质组进行研究.1995年正式 ...
- 关于vim复制剪贴粘贴命令的总结-转
最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...
- A Child's History of England.51
CHAPTER 14 ENGLAND UNDER KING JOHN, CALLED LACKLAND At two-and-thirty years of age, John became King ...
- day22面向对象编程思想
day22面向对象编程思想 1.面向过程 面向过程: 核心是"过程"二字 过程的终极奥义就是将程序流程化 过程是"流水线",用来分步骤解决问题的 面向对象: 核 ...
- 4.2 rust 命令行参数
从命令行读取参数 use std::env; fn main() { let args: Vec<String> = env::args().collect(); println!(&q ...
- zabbix之修改中文
#在zabbix服务器安装中文名包 root@ubuntu:~# sudo apt-get install language-pack-zh* #:修改环境变量 root@ubuntu:~# sudo ...