电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot+SpringSecurity實現基于真實數據的授權認證

瀏覽:98日期:2023-03-13 13:12:50
(一)概述

Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架,Spring Security主要做兩個事情,認證、授權。我之前寫過一篇關于SpringSecurity的博客,但是當時只是介紹了基于mock數據的案例,本期就來介紹一下基于真實數據的認證授權實現。

(二)前期項目搭建

為了更好的展示SpringSecurity,我們先搭建一個簡單的web項目出來。引入thymeleaf依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId></dependency><dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId></dependency>

新建一個登陸頁,一個首頁,然后幾個不同等級的展示頁面:login.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>登陸頁</title></head><body><div> <form><h2>登陸頁</h2><input type='text' placeholder='username'><input type='password' placeholder='password'><button type='button'>登陸</button> </form></div></body></html>

index.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>首頁</title></head><body><div> <h2>首頁</h2> <a href='http://www.hdgsjgj.cn/login' rel='external nofollow' >登陸</a> <div style='overflow: hidden'><div style='float: left;margin-left: 20px'> <h3>level1</h3> <a href='http://www.hdgsjgj.cn/level1/1' rel='external nofollow' >level-1-1</a> <hr> <a href='http://www.hdgsjgj.cn/level1/2' rel='external nofollow' >level-1-2</a></div><div style='float: left;margin-left: 20px'> <h3>level2</h3> <a href='http://www.hdgsjgj.cn/level2/1' rel='external nofollow' >level-2-1</a> <hr> <a href='http://www.hdgsjgj.cn/level2/2' rel='external nofollow' >level-2-2</a></div><div style='float: left;margin-left: 20px'> <h3>level3</h3> <a href='http://www.hdgsjgj.cn/level3/1' rel='external nofollow' >level-3-1</a> <hr> <a href='http://www.hdgsjgj.cn/level3/2' rel='external nofollow' >level-3-2</a></div> </div></div></body></html>

另外還有幾個不同等級的頁面

SpringBoot+SpringSecurity實現基于真實數據的授權認證

分別在body中寫上自己對應的編號。

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>Title</title></head><body>level-1-1</body></html>

最后編寫一個controller來接收請求:

@Controllerpublic class RouteController { @RequestMapping({'/','/index'}) public String index(){return 'index'; } @RequestMapping('/login') public String toLogin(){return 'login'; } @RequestMapping('/level1/{id}') public String level1(@PathVariable('id')String id){return 'level1/'+id; } @RequestMapping('/level2/{id}') public String level2(@PathVariable('id')String id){return 'level2/'+id; } @RequestMapping('/level3/{id}') public String level3(@PathVariable('id')String id){return 'level3/'+id; }}

最終的效果如下:

SpringBoot+SpringSecurity實現基于真實數據的授權認證

最終實現等級不同的level頁面根據不同權限進行跳轉。

SpringBoot+SpringSecurity實現基于真實數據的授權認證

后臺基于Mybatis和Mysql數據庫實現,因此我們除了引入SpringSecurity的依賴之外,還需要引入Mybatis相關依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version></dependency>

在配置文件中添加數據源相關信息,以及Mybatis的配置:

spring.datasource.url=jdbc:mysql://localhost:3306/security?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml(三)認證與授權的實現

3.1 表結構設計

認證和授權在表設計上應該分在兩個表內,一個表存儲用戶信息包括密碼等,另一個表存儲授權信息,還需要一個表建立用戶和授權之間的關聯,給出最終的表結構:

CREATE TABLE `roles` ( `id` int(4) NOT NULL, `rolename` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `sysuser` ( `id` int(4) NOT NULL, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `user_role` ( `id` int(4) NOT NULL, `user_id` int(4) DEFAULT NULL, `role_id` int(4) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接下來是針對這三張表的實體類,Mapper接口以及xml文件,你可以不看代碼,主要實現一個通過用戶名查找用戶以及相關權限的操作:

@Datapublic class Roles { private Integer id; private String roleName;}@Datapublic class SysUser { private Integer id; private String userName; private String password; private List<Roles> roles;}

Mapper接口:

public interface UserMapper { public SysUser getUserByUserName(@Param('userName') String userName);}

xml實現:

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE mapper PUBLIC '-//mybatis.org//DTD Mapper 3.0//EN' 'http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='com.javayz.springsecurity.mapper.UserMapper'> <resultMap type='com.javayz.springsecurity.entity.SysUser'><id property='id' column='ID'/><result property='userName' column='username'/><result property='password' column='password'/><collection property='roles' ofType='com.javayz.springsecurity.entity.Roles'> <result column='name' property='roleName'/></collection> </resultMap> <select parameterType='String' resultMap='userMap'>select sysuser.*,roles.rolenamefrom sysuserLEFT JOIN user_role on sysuser.id= user_role.user_idLEFT JOIN roles on user_role.role_id=roles.idwhere username= #{userName} </select></mapper>

3.2 認證過程

SpringSecurity的認證過程是這樣的,首先通過用戶名或者其他唯一的ID在數據庫里找到這個用戶,用戶的密碼以非對稱加密的方式存儲。取到用戶后將前臺傳入的密碼加密后和數據庫中已經加密好的字段進行對比,從而通過認證。

上面這個過程中的第一步通過用戶名找到用戶的操作需要通過Service服務來實現,并且這個Service服務需要繼承SpringSecurity中的UserDetailsService接口。這個接口返回一個SpringSecurity的User對象。

@Servicepublic class UserService implements UserDetailsService { @Resource private UserMapper userMapper; //根據用戶名找到對應的用戶信息 @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {SysUser sysUser = userMapper.getUserByUserName(s);if (sysUser!=null){ List<GrantedAuthority> roles=new ArrayList<>(); sysUser.getRoles().stream().forEach(x->{roles.add(new SimpleGrantedAuthority(x.getRoleName())); }); return new User(sysUser.getUserName(),sysUser.getPassword(),roles);}throw new UsernameNotFoundException('用戶未找到'); }}

3.3 Security攔截配置

上面的步驟都完成后就開始配置Security了,寫一個配置方法SecurityConfig,代碼層面很簡單,認證傳入userService對象,會自動把數據庫中取出的密碼和前端傳過來的密碼進行對照。同時在userService中還傳入了roles集合,在授權處給不同的頁面附上不同的權限即可。

@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; //授權 @Override protected void configure(HttpSecurity http) throws Exception {//首頁所有人都能訪問,level頁面只有有權限的人才能訪問http.authorizeRequests().antMatchers('/').permitAll().antMatchers('/level1/**').hasRole('vip1').antMatchers('/level2/**').hasRole('vip2').antMatchers('/level3/**').hasRole('vip3');//沒有權限默認跳到登陸頁,默認會重定向到/loginhttp.formLogin(); } //認證 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder()); }}

3.4 其他注意點

我在認證的時候使用的密碼加密方式是BCryptPasswordEncoder,因此存入數據庫中的密碼也需要被加密,常用的方式就是在注冊時通過同樣的方式對密碼進行加密存入數據庫中:

String password='xxx';BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();String encode=bCryptPasswordEncoder.encode(password);(四)總結

SpringSecurity很強大,除了這種方式之外,還支持集成JWT、Oauth2等等。后續我會繼續更新,我是魚仔,我們下期再見。

到此這篇關于SpringBoot+SpringSecurity實現基于真實數據的授權認證的文章就介紹到這了,更多相關SpringBoot+SpringSecurity授權認證內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 东莞喷砂机-喷砂机-喷砂机配件-喷砂器材-喷砂加工-东莞市协帆喷砂机械设备有限公司 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 换链神器官网-友情链接交换、购买交易于一体的站长平台 | 碎石机设备-欧版反击破-欧版颚式破碎机(站)厂家_山东奥凯诺机械 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 搪玻璃冷凝器_厂家-越宏化工设备| 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 首页 - 张店继勇软件开发工作室| 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 书信之家_书信标准模板范文大全 最新范文网_实用的精品范文美文网 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 计算机毕业设计源码网| 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 |