Spring boot+Spring Security 4配置整合实例

Spring Security Oauth2 服务启动报错 Spring Security Oauth2 服务启动报错 问题:Spring Cloud 整合Spring Security Oauth2 启动报错; org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/c 阅读详情

本例所覆盖的内容:

1. 使用Spring Security管理用户身份认证、登录退出

2. 用户密码加密及验证

3. 采用数据库的方式实现Spring Security的remember-me功能

4. 获取登录用户信息。

5.使用Spring Security管理url和权限

 

本例所使用的框架:

1. Spring boot

2. Spring MVC

3. Spring Security

4. Spring Data JPA

5. thymeleaf

6.gradle

一、 整合Spring Security

在build.gradle中加入如下片段:

    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-security")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.springframework.security:spring-security-test")

使用Spring Security4的四种方法概述

    那么在Spring Security4的使用中,有4种方法:

  1.     一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中;
  2.     二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置。
  3.     三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器         并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。
  4.     四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。 前者是将配置文件     或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的(UserDetails)User     对象,该对象可以提供用户的详细信息供AuthentationManager进行认证与授权使用。

我们今天来实现一下第三种。

 当然,spring security4毕竟是西方国家的东西,以英文为主,使用习惯和文化的差异共存,况且为了适应大多数Web应用的权限管理,作者将Spring Security4打造的精简而灵活。精简指Spring Security4对用户和权限的表设计的非常简单,并且没有采用数据库来管理资源(URL)。这样的话,对于我们国人用户来说,是个很大的遗憾,这个遗憾甚至能够影响到我们对安全框架的选型。你想啊,在国内大多数项目中,均设置了比较复杂的权限控制,一般就会涉及到用户、角色、资源3张表,若要加上3张表之间的对应关系表2张,得有5张表。

    但是,Spring Security4提供了灵活的扩展方法。具体应该扩展哪些类呢? 或者到底Spring Security3工作的流程如何,你不妨参看下面一篇文章,就会获得
一些启示,网址为:http://www.blogjava.net/SpartaYew/archive/2011/06/15/350630.html, 哈哈,谢谢分享。

还有一个地址很有价值,http://download.youkuaiyun.com/detail/muddled/8981809,我就参考着上面的介绍扩展了4个类。

首先来说一下第三种方法的实现流程,我画了一张简易版流程图,帮助大家理解spring security4 的工作机制:


下面我们就来根据这个图中标注出的,重要的几个4个类来配置吧!

  1. 当然要现在application.properties配置文件中配置好数据库。
  2. 开始配置相关的实体类 SysUser.java  SRole.java  SysResource.java SysResourceRole.java
  3. package security.entity;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    	@Entity
    	@Table(name = "s_user")//code11
    	public class SysUser implements java.io.Serializable {
    		
    		@Id
    		@GeneratedValue(strategy = GenerationType.IDENTITY)
    		@Column(name = "id", unique = true, nullable = false)
    		private Integer id;
    		@Column(name = "name", length = 120)
    		private String name; //用户名
    		@Column(name = "email", length = 50)
    		private String email;//用户邮箱
    		@Column(name = "password", length = 120)
    		private String password;//用户密码
    		@Temporal(TemporalType.DATE)
    		@Column(name = "dob", length = 10)
    		private Date dob;//时间
    		
    		@OneToMany(fetch = FetchType.EAGER, mappedBy = "SUser")
    		private Set<SysRole> SysRoles = new HashSet<SysRole>(0);// 所对应的角色集合
    
    		public SysUser() {
    		}
    
    		public SysUser(String name, String email, String password, Date dob, Set<SysRole> SysRoles) {
    			this.name = name;
    			this.email = email;
    			this.password = password;
    			this.dob = dob;
    			this.SysRoles = SysRoles;
    		}
    
    		
    		public Integer getId() {
    			return this.id;
    		}
    
    		public void setId(Integer id) {
    			this.id = id;
    		}
    
    		
    		public String getName() {
    			return this.name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    
    		public String getEmail() {
    			return this.email;
    		}
    
    		public void setEmail(String email) {
    			this.email = email;
    		}
    
    		public String getPassword() {
    			return this.password;
    		}
    
    		public void setPassword(String password) {
    			this.password = password;
    		}
    
    		
    		public Date getDob() {
    			return this.dob;
    		}
    
    		public void setDob(Date dob) {
    			this.dob = dob;
    		}
    
    		@OneToMany(fetch = FetchType.EAGER, mappedBy = "SUser")
    		public Set<SysRole> getSysRoles() {
    			return this.SysRoles;
    		}
    
    		public void setSRoles(Set<SysRole> SysRoles) {
    			this.SysRoles = SysRoles;
    		}
    
    }
    

    package security.entity;
    
    import java.util.Date;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    //角色表
    @Entity
    @Table(name="s_role")
    public class SysRole {
    	@Id
    	@GeneratedValue(strategy=GenerationType.IDENTITY)
    	@Column (name="id",length=10)
    	private int id;
    	
    	@ManyToOne(fetch = FetchType.LAZY)
    	@JoinColumn(name = "uid", nullable = false)
    	private SysUser SUser;//角色对应的用户实体
    	
    	@Column(name="name",length=100)
    	private String name;//角色名称
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public SysUser getSUser() {
    		return SUser;
    	}
    	public void setSUser(SysUser sUser) {
    		SUser = sUser;
    	}
    	
    	
    }
    

    package cn.paybay.ticketManager.entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    @Entity
    @Table(name="s_resource")
    public class SysResource {
    		@Id
    		@GeneratedValue(strategy=GenerationType.IDENTITY)
    		@Column (name="id",length=10)
    		private int id;
    		
    		@Column(name="resourceString",length=1000)
    		private String resourceString;//url
    		
    		@Column(name="resourceId",length=50)
    		private String resourceId;//资源ID
    		
    		@Column(name="remark",length=200)
    		private String remark;//备注
    		
    		@Column(name="resourceName",length=400)
    		private String resourceName;//资源名称
    		
    		@Column(name="methodName",length=400)
    		private String methodName;//资源所对应的方法名
    		
    		@Column(name="methodPath",length=1000)
    		private String methodPath;//资源所对应的包路径
    		
    		public int getId() {
    			return id;
    		}
    
    		public void 
springboot整合oauth2异常集合 一、 1. 背景:win10、java11,springboot2.1.6整合oauth2,启动项目时出现异常 2. 异常描述:Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationExcept... 阅读详情

相关推荐

Spring Security 4 退出后再登录,页面停留在登录页,Url却多了一个Logout参数

Spring boot spring security logoutsuccesshandler

Andark - 空间 5331

Knife4j 4.4.0 整合 Spring Boot 3.0:5分钟完成 Swagger UI 界面与功能全面升级

本文详细介绍了如何将Knife4j 4.4.0与Spring Boot 3.0快速整合,实现Swagger UI界面与功能的全面升级。通过5分钟快速配置指南,开发者可以轻松掌握API文档生成、安全认证、分组管理等核心功能,提升微服务架构下的开发效率与协作质量。

weixin_34009794的博客 338

Spring Boot 3.4整合Knife4j文档异常排查:版本与配置实战指南

在微服务与前后端分离开发中,接口文档是团队协作的关键环节,Knife4j作为增强型OpenAPI UI工具被广泛使用。然而,当Spring Boot升级到3.4时代,Knife4j文档页面可能遇到白屏、404或接口列表为空等异常,其根源往往不在前端界面,而在于底层springdoc与框架版本的兼容性。本文从技术原理出发,剖析Controller元数据如何被springdoc解析为OpenAPI JSON,再经Knife4j渲染的完整链路,并指出Spring Boot 3.4对应Spring Framewor

weixin_33393017的博客 290

【异常】解决报错[org/springframework/security/web/AuthenticationEntryPoint.class] cannot be opened because

【异常】解决报错[org/springframework/security/web/AuthenticationEntryPoint.class] cannot be opened because

奶爸的编程之路,也就一周冷个三天 2195

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

Token算力工厂建设方案:从GPU集群到计量计费的全链路设计

在AI应用从“租核”走向“买Token”的范式转换中,算力交付的核心指标已不再是vCPU或GPU实例,而是单位时间内的Token产出量与单Token成本。这一变化推动基础设施从资源租赁向计件生产演进,要求GPU集群、推理引擎、调度系统、计量计费等模块像工厂产线一样协同运转。本文从硬件异构混部、存储网络设计、推理引擎调优、Token网关与配额管理、稳定性治理等维度,系统拆解如何构建一座可量化、可计费、可扩展的Token算力工厂,并给出分三期落地的推进节奏,帮助架构师与技术管理者在AI基础设施建设中实现成本可控

weixin_29095587的博客 260

重构工业交互体验:响应式数据可视化大屏解决方案

从智慧园区到数据中心,从水务监控到风力发电场景,HT 通过 2D/3D 组态技术与响应式布局机制,让数据以更灵活、更精准的方式呈现场景动态 —— 这正是 HT 技术在工业可视化领域的核心价值。例如,在智慧楼宇监控系统中,HT 引擎可实时渲染建筑结构、设备状态与数据流,同时确保画面在不同尺寸屏幕上的一致性。以某工业数据中心大屏为例,HT 通过暗红色主调搭配工业元素,结合粉色与黄色点缀,打破传统深蓝色大屏的视觉定式,同时通过矢量图形确保色彩在不同亮度下的辨识度 —— 这正是 HT 技术在视觉设计上的独特优势。

Hightopo的博客 888

AI订单流异常检测:精准识别与闭环处置

本文系统阐述了订单流AI驱动的可视化与异常解释系统的构建策略。核心包括:1)多维度融合的异常检测技术,结合数据指纹、行为图谱和时序分析实现精准识别;2)分级分类与自动化处置机制,通过规则矩阵和风险熵值量化进行智能决策;3)基于SHAP/LIME的可解释性技术,提升决策透明度;4)千万级数据训练要求,确保模型达到87%以上的F1值。系统采用Flink+PAI实时计算架构,支持从异常检测到根因分析的完整闭环,为电商、金融等领域的订单风险管理提供智能化解决方案。

2401_83000568的博客 1356

C#企业级工作流管理:从优化到重构的实战指南——代码深度解析与性能调优策略

本文通过Workflow Core与Elsa引擎实现企业审批流程优化,将处理时间从72小时缩短至2小时,效率提升200%。文章包含12个代码示例,涵盖流程梳理、引擎选型(对比Workflow Core与Elsa特性)、模块化重构(策略模式应用)及异常处理机制。关键实现包括:可视化流程建模、Serilog性能监控、Elsa集成配置、策略模式消除重复代码,以及补偿事务设计。最终方案支持高并发,通过数据库连接池优化性能,为企业级工作流系统提供完整技术方案。

墨夶的博客 896

05 Transformer 到底解决了什么问题

Transformer 是现代大语言模型的底层骨架。本文不推公式,而是从 CNN、RNN/LSTM 的瓶颈讲起,解释 Transformer 如何通过自注意力同时解决长距离依赖和并行训练问题,并说明它为什么能支撑 GPT、BERT 和现代大模型的规模化。

老于的笔记的专栏 242

AI 辅助编程全景:演进、提效场景与未来趋势

本文系统梳理了AI辅助编程的发展历程与应用场景。演进路径分为三代:从代码补全工具(2023)、对话式助手(2024)到自主编程代理(2025)。在软件全生命周期中,AI可显著提升各环节效率:需求分析阶段节省30-60%文档编写时间;设计阶段缩短40-60%技术调研周期;编码阶段通过智能补全提升55%任务速度;测试阶段减少30-60%测试编写时间。数据显示,2025年84%开发者使用AI工具,41%代码由AI生成,平均每周节省3.6小时。AI正推动开发者角色从编写者转变为审核者,但复杂业务逻辑和架构设计仍需人

甘蓝的专栏 471

代码复现5——VLMaps

报错“AttributeError: module 'clip' has no attribute 'load'”,运行下述命令解决。运行后接着报错:“ModuleNotFoundError: No module named 'pytorch_lightning'”运行后命令后会弹出一个RGB窗口,可以用键盘上的“W”“A”“D”键控制移动视角的变化,“空格”键开始记录,“q”键停止。并更改相关代码文件,vlmaps/vlmaps/lseg/modules/models/lseg_vit.py。

qq_44100524的博客 603

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: List去重复元素
下一篇: 使用spring的使用spring的RequestMappingHandlerMapping类自动扫描入库类自动扫描URL写入数据库
橘子味阳光
博客等级 码龄12年 28粉丝 4原创
评论 47
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值