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 从零开始搭建的更多相关文章

  1. mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

    文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...

  2. mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

    继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-we ...

  3. spring security oauth2 搭建认证中心demo

    oauth2 介绍 ​ oauth2 协议应该是开发者们耳熟能详的协议了,这里就不做过多的介绍了,具体介绍如何在spring security中搭建oauth2的认证服务.Spring-Securit ...

  4. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...

  5. Spring MVC+ Spring + Mybatis从零开始搭建一个精美且实用的管理后台

    点击进入<SSM搭建精美实用的管理系统>达人课页面 SSM 框架即 SpringMVC+Spring+Mybatis,相信各位朋友在投递简历时已直观感受到它的重要性,JavaWeb 相关工 ...

  6. Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建

    前言: 最近在考虑搭建个人网站,想了想决定采用前后端分离模式 前端使用Vue,负责接收数据 后端使用Spring Boot,负责提供前端需要的API 就这样开启了我边学习边实践之旅 Vue环境搭建步骤 ...

  7. 基于Spring Security OAuth2搭建的Spring Cloud 认证中心

    Github传送门:https://github.com/13babybear/bounter-springcloud 实现功能有: 整合JWT 刷新Token 自定义客户端储存 自定义用户储存 资源 ...

  8. spring security 3.2 配置详解(结合数据库)

    没事就来了解下spring security.网上找了很多资料.有过时的,也有不是很全面的.各种问题也算是让我碰了个遍.这样吧.我先把整个流程写下来,之后在各个易混点分析吧. 1.建立几个必要的页面. ...

  9. spring-security-4 (5)spring security Java配置实现自定义表单认证与授权

    前面三篇讲解了spring security的搭建以及简单的表单认证与授权原理.本篇将实现我们自定义的表单登录与认证.  本篇不会再讲项目的搭建过程,因为跟第二节的搭建如出一辙.本篇也不会将项目中所有 ...

  10. Spring security oauth2最简单入门环境搭建

    关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...

随机推荐

  1. idea 中 maven 项目构建 webapp 无 src 目录以及提示无程序包的解决办法

    提示无程序包的解决方法 问题有可能出现在 IDE 版本上,问题版本是 2020.1,升级为 2020.3 后,tomcat 运行就不再提示无程序包的错误 之前尝试的解决办法 maven clean/i ...

  2. conda迁移虚拟环境

    Conda离线迁移虚拟环境主要是两步: 1 在原环境中打包 2 将打好的包copy到目标环境的指定位置 打包的命令很简单 conda pack -n 虚拟环境名 当试图导出base时,报错了 Cond ...

  3. 2022-06-01内部群每日三题-清辉PMP

    1.采购部门要求项目经理提供一个项目的招标文件.这些文件中应该包含哪些内容? A.变更请求 B.选择的卖方 C.质量测量指标 D.建议邀请书 2.作为一个大型组织中关键项目的组成部分,阀门制造业务被外 ...

  4. 复习第6点-6.SpringMVC作用域传值

    作用域范围 对象名称 作用范围 application 整个作用范围 session 在当前会话中有效 request 在当前请求中有效 page 在当前页面有效 request/session/ap ...

  5. python日志logging配置

    python日志logging配置 为了方便ELK收集日志,将日志打印成json格式 开发过程中,使用json格式不方便排查问题 本文章使用python的logging模块,一步步增加配置,来说明每个 ...

  6. ubuntu配置phpmyadmin

    之前已经把LNMP环境搭建好了 安装: sudo apt-get install phpmyadmin 安装必要依赖 sudo apt-get install php-mbstring sudo ap ...

  7. Lua文件夹及文件操作

    转载于:CSDN-刘长栋 -[[ @引用:require("FileLib") @调用:fileLib.createFolder(path) @功能: 1.创建文件夹 2.连续创建 ...

  8. 常用的js方法

    1. 声明和初始化数组 我们可以使用默认值(如"".null或 )初始化特定大小的数组0.您可能已经将这些用于一维数组,但如何初始化二维数组/矩阵呢? const array = ...

  9. HIVE 调优思路和实践

    1,数据存储调优 1.1 设置压缩: 设置中间数据/输出结果压缩传输,使用snappy格式. hive-site.xml: set hive.exec.compress.output = true # ...

  10. 前端之Vue day08 Vue3项目搭建、setup、toRefs

    一.Vue3 介绍 # 新项目使用vue3,有部分老项目使用vue2 # vue3 的变化 1.性能的提升 -打包大小减少41% -初次渲染快55%, 更新渲染快133% -内存减少54% 2.源码的 ...