spring security 从零开始搭建
1.引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
2.配置
package com.cj.system.config; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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; @Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin() //表单登陆 1
.and() //2
.authorizeRequests() //下面的都是授权的配置 3
.antMatchers("/admin/system/index/login").anonymous()//不需授权就可以访问的
.anyRequest().authenticated(); //访问任何资源都需要身份认证 5
}
}
配置完成之后登录的效果
默认用户名为user

3 修改登录名,密码为数据库用户名,密码
3.1 配置里增加
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new MyMD5Password();
}
3.2 增加加密函数
public class MyMD5Password implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
return MD5.encrypt(rawPassword.toString());
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
// System.out.println(rawPassword);
// System.out.println(MD5.encrypt(rawPassword.toString()));
// System.out.println(encodedPassword);
if(MD5.encrypt(rawPassword.toString()).equals(encodedPassword)){
return true;
}
return false;
}
}
3.3 登录修改封装对象
/*start插入security*/
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginVo.getUsername(),loginVo.getPassword());
//authenticationManager 对象
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
if(authenticate == null){
throw new RuntimeException("登录失败");
}
MyUserDetail userDetail = (MyUserDetail) authenticate.getPrincipal();
4. 过滤器配置
4.1 配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin() //表单登陆 1
.and() //2
.authorizeRequests() //下面的都是授权的配置 3
.antMatchers("/admin/system/index/login").anonymous()
.anyRequest().authenticated(); //访问任何资源都需要身份认证 5
//添加过滤器
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
//添加异常处理器
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
}
4.2 过滤器代码
package com.cj.system.filter; import com.cj.common.util.JwtHelper;
import com.cj.model.system.SysToken;
import com.cj.model.system.SysUser;
import com.cj.system.custom.MyUserDetail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; @Component
public class JwtFilter extends OncePerRequestFilter { @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = request.getHeader("token");
if(!StringUtils.hasText(token)){
filterChain.doFilter(request,response);
return;
} String userId = JwtHelper.getUserId(token);
String username = JwtHelper.getUsername(token); if(userId == null){
throw new RuntimeException("token非法");
}
//获取信息
//TODOredis ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\userDetail.txt")); MyUserDetail myUserDetail = null;
try {
myUserDetail = (MyUserDetail)objectInputStream.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(myUserDetail == null){
throw new RuntimeException("用户未登录");
} //UsernamePasswordAuthenticationToken
//TODO权限
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(myUserDetail, null, null); SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request,response);
}
}
4.3 效果

4.4 ps:获取的是头信息的token 使用 request.getHeader('token')
5 配置权限
5.1 在config中配置
@EnableGlobalMethodSecurity(prePostEnabled = true)
5.2 在需要验证的方法上加注解
@PreAuthorize("hasAuthority('bnt.sysRole.list')")
5.3 修改userdetail
private List<String> permissions;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> newList = new ArrayList<>();
for(String permission:permissions){
newList.add(new SimpleGrantedAuthority(permission));
}
return newList;
}
5.4 修改loaduser 加上权限
List<String> permissions = sysMenuService.getUserBottonList(sysUser.getId());
5.5 修改filter
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(myUserDetail, null, myUserDetail.getAuthorities());
6 异常配置
6.1 配置
//添加异常处理器
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
6.2 权限异常
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
Result result = new Result(403,"授权失败",null);
System.out.println(accessDeniedException);
WebUtil.renderString(response, JSON.toJSONString(result));
}
}
6.3 授权异常
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
/**
* 认证失败
* @param request
* @param response
* @param authException
* @throws IOException
* @throws ServletException
*/
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
Result result = new Result(401,"用户认证失败请重新登录",null);
WebUtil.renderString(response,JSON.toJSONString(result));
}
}
spring security 从零开始搭建的更多相关文章
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)
继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...
- spring security oauth2 搭建认证中心demo
oauth2 介绍 oauth2 协议应该是开发者们耳熟能详的协议了,这里就不做过多的介绍了,具体介绍如何在spring security中搭建oauth2的认证服务.Spring-Securit ...
- spring security oauth2搭建resource-server demo及token改造成JWT令牌
我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...
- Spring MVC+ Spring + Mybatis从零开始搭建一个精美且实用的管理后台
点击进入<SSM搭建精美实用的管理系统>达人课页面 SSM 框架即 SpringMVC+Spring+Mybatis,相信各位朋友在投递简历时已直观感受到它的重要性,JavaWeb 相关工 ...
- Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建
前言: 最近在考虑搭建个人网站,想了想决定采用前后端分离模式 前端使用Vue,负责接收数据 后端使用Spring Boot,负责提供前端需要的API 就这样开启了我边学习边实践之旅 Vue环境搭建步骤 ...
- 基于Spring Security OAuth2搭建的Spring Cloud 认证中心
Github传送门:https://github.com/13babybear/bounter-springcloud 实现功能有: 整合JWT 刷新Token 自定义客户端储存 自定义用户储存 资源 ...
- spring security 3.2 配置详解(结合数据库)
没事就来了解下spring security.网上找了很多资料.有过时的,也有不是很全面的.各种问题也算是让我碰了个遍.这样吧.我先把整个流程写下来,之后在各个易混点分析吧. 1.建立几个必要的页面. ...
- spring-security-4 (5)spring security Java配置实现自定义表单认证与授权
前面三篇讲解了spring security的搭建以及简单的表单认证与授权原理.本篇将实现我们自定义的表单登录与认证. 本篇不会再讲项目的搭建过程,因为跟第二节的搭建如出一辙.本篇也不会将项目中所有 ...
- Spring security oauth2最简单入门环境搭建
关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...
随机推荐
- CSS:盒子_每个元素都有两个盒子(《CSS世界》笔记-块级元素)
CSS:盒子_每个元素都有两个盒子(<CSS世界笔记>-块级元素) 1)CSS世界只有"块级盒子(block-level box)"和"内联盒子(inline ...
- python通过接口执行shell命令
需求:通过网站url方式直接执行服务器的shell命令 实现: 1.安装依赖 pip3 install falsk 2.python脚本 [root@localhost tmp]# more fals ...
- 老毛桃WinPE以ISO镜像模式安装CentOS7
准备: 一台新台式机(2TB磁盘),将用于安装centos 7,注意安装前请使用工具将磁盘分区先删除. 一个u盘,用户制作老毛桃winpe启动盘. 从www.laomaotao.org下载最新9.3增 ...
- Bugku-不可破译的密码[wp]
一 题目分析 flag.txt cipher.txt (1)密码表形式和维吉尼亚密码一样 (2)看到504Q0304 很容易想到 504B0304 Zip文件头. 二 解题步骤 2.1 解密密文 根据 ...
- CF1268B题解
CF1268B 题解 题目翻译 给你一个杨表,用一个有 \(n\) 个元素的数组 \(a\) 表示杨表每一列的高度.你需要用 \(1 \times 2\) 或 \(2 \times 1\) 的骨牌填充 ...
- 硬件IIC主从机中断代码注释解析
目录 硬件IIC的主从中断在582的最新EVT中已支持. 对于IIC从机中断,例程中已封装好中断处理过程,用户调用app_i2c时,初始化中需要配置回调函数. 初始化的配置如下. struct i2c ...
- PS设计非常漂亮酷炫的金色字体效果
方法/步骤 1.在PS里面新建一个黑色背景 2.在图层上 写上比较粗一点的字. 3.鼠标右击图层,选择混合模式,进行调整. 选择颜色叠加,注意颜色是深黄色. 4.转移到混合模式里面的渐变叠加,渐变的颜 ...
- 文件下载,后端接口,django,flask
Django后端接口 def download_excel(request): """ get excel file from url param and upload ...
- C++——第三方插件
EasyX库安装教程 官网:https://easyx.cn/ 下载地址:EasyX Graphics Library for C++ 作品:CodeBus - 分享有趣的 C/C++ 代码 图中标注 ...
- 利用canvas合并两个海报
图片1 是个海报,图片2是个二维码,把这个二维码镶嵌到图片1 的指定位置上 function drawAndShareImage(opt, cb) { if (!opt) { console.erro ...