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 ...
随机推荐
- VMware-包体选择
3.二进制包如何选择3.1选择适合当前系统的版本号: ●找不到适合的,才去尝试别的系统版本号 ●el6兼容el5; el5无法安装el63.2选择适合cpu的架构: ●x86_ _64包 ...
- Python语言基础实验(第四周)
Python语言基础实验(第四周) 一.实验目的 1.了解并掌握python中序列及序列的常用操作. 2.根据实际需要运用合适的序列类型来完成实验. 二.实验环境 软件版本:Python 3.10 6 ...
- SQLServer中使用between查询日期
SQL Server中字段是Datetime型 以" YYYY-MM-DD 00:00:00" 存放的 between and是包括边界值的,not between不包括边界值,不 ...
- 安卓调试打包错误Error executing aapt: Return code -1073741819 Error while running zipalign
之前开发完的安卓app项目,再次打开,突然抽风报错. 1.调试运行报错:Error executing aapt: Return code -1073741819 2.打包失败报错: Error wh ...
- List<Object>集合获取指定属性最大值的对象
List<Vo> list = dao.selectList();if(CollectionUtils.isNotEmpty(list)) { Optional<Vo> max ...
- css - content-visibility
css - content-visibility content-visibility:实现可见网页只加载可见区域内容 介绍 content-visibility是一个css属性,它控制一个元素是否呈 ...
- 一条sql同时返回多个count结果
select * from (select alarm_content name, count(id) `count` from ai_alarm WHERE alarm_content IS NOT ...
- TypeScript - 属性的修饰符
class Person { /** * TS 可以再属性前增加属性的修饰符 * public 修饰的属性可以再任意位置访问(修改)默认值 * private 私有属性,私有属性只能在类内部进行访问和 ...
- 宝塔404 Not Found的解决方法-重启大法也适合服务器
本来以为服务器不是随时重启的,浪费了好几的时间配置ssl一直无法成功,后来处理404问题重启后,发现ssl也好使了. 以下引自连接 https://www.chichisvip.com/post/37 ...
- QT--QMainWindow窗口的状态栏设置
QMainWindow窗口状态栏 实时显示时间: 1.获取实时时间使用定时器QTimer, QTimer *timer = new QTimer(); connect(timer, &QTim ...