日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

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

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

(二)前期項目搭建

為了更好的展示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.b3g6.com/login' rel='external nofollow' >登陸</a> <div style='overflow: hidden'><div style='float: left;margin-left: 20px'> <h3>level1</h3> <a href='http://www.b3g6.com/level1/1' rel='external nofollow' >level-1-1</a> <hr> <a href='http://www.b3g6.com/level1/2' rel='external nofollow' >level-1-2</a></div><div style='float: left;margin-left: 20px'> <h3>level2</h3> <a href='http://www.b3g6.com/level2/1' rel='external nofollow' >level-2-1</a> <hr> <a href='http://www.b3g6.com/level2/2' rel='external nofollow' >level-2-2</a></div><div style='float: left;margin-left: 20px'> <h3>level3</h3> <a href='http://www.b3g6.com/level3/1' rel='external nofollow' >level-3-1</a> <hr> <a href='http://www.b3g6.com/level3/2' rel='external nofollow' >level-3-2</a></div> </div></div></body></html>

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

SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

分別在body中寫上自己對應(yīng)的編號。

<!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實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

最終實現(xiàn)等級不同的level頁面根據(jù)不同權(quán)限進行跳轉(zhuǎn)。

SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證

后臺基于Mybatis和Mysql數(shù)據(jù)庫實現(xiàn),因此我們除了引入SpringSecurity的依賴之外,還需要引入Mybatis相關(guān)依賴:

<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>

在配置文件中添加數(shù)據(jù)源相關(guān)信息,以及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(三)認證與授權(quán)的實現(xiàn)

3.1 表結(jié)構(gòu)設(shè)計

認證和授權(quán)在表設(shè)計上應(yīng)該分在兩個表內(nèi),一個表存儲用戶信息包括密碼等,另一個表存儲授權(quán)信息,還需要一個表建立用戶和授權(quán)之間的關(guān)聯(lián),給出最終的表結(jié)構(gòu):

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文件,你可以不看代碼,主要實現(xiàn)一個通過用戶名查找用戶以及相關(guān)權(quán)限的操作:

@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實現(xiàn):

<?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在數(shù)據(jù)庫里找到這個用戶,用戶的密碼以非對稱加密的方式存儲。取到用戶后將前臺傳入的密碼加密后和數(shù)據(jù)庫中已經(jīng)加密好的字段進行對比,從而通過認證。

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

@Servicepublic class UserService implements UserDetailsService { @Resource private UserMapper userMapper; //根據(jù)用戶名找到對應(yīng)的用戶信息 @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對象,會自動把數(shù)據(jù)庫中取出的密碼和前端傳過來的密碼進行對照。同時在userService中還傳入了roles集合,在授權(quán)處給不同的頁面附上不同的權(quán)限即可。

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

3.4 其他注意點

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

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

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

到此這篇關(guān)于SpringBoot+SpringSecurity實現(xiàn)基于真實數(shù)據(jù)的授權(quán)認證的文章就介紹到這了,更多相關(guān)SpringBoot+SpringSecurity授權(quán)認證內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产三级| 中文字幕在线看片| 伊人精品在线| 亚洲一区中文| 亚洲精品乱码久久久久久蜜桃麻豆| 午夜欧美理论片| 亚洲欧美日韩国产一区| 在线国产精品一区| 欧美偷窥清纯综合图区| 免费一级欧美片在线观看网站| 精品国产精品国产偷麻豆| 中文字幕在线免费观看视频| 久久夜夜操妹子| 影音先锋国产精品| 欧美一区=区三区| 福利一区二区三区视频在线观看| 人人香蕉久久| 噜噜噜久久亚洲精品国产品小说| 日韩av资源网| 亚洲天堂免费电影| 一区二区91| 卡一卡二国产精品| 欧美日韩国产亚洲一区| 国产探花在线精品一区二区| www在线观看黄色| 国产精品日韩欧美一区| 日韩av网站在线观看| 国产福利电影在线播放| 黄色日韩在线| 国产精品v亚洲精品v日韩精品| 在线一区av| 中文字幕日韩亚洲| 国产va免费精品观看精品视频| 日韩视频中文| 久久伊人国产| 99国产精品视频免费观看一公开| 国产美女久久| 一区视频在线| 成人在线黄色| 综合视频一区| 亚洲综合在线电影| 深夜福利亚洲| 韩国久久久久久| 日韩二区三区四区| 午夜久久影院| 成人精品国产亚洲| 日韩二区在线观看| 国产主播一区| 久久一区视频| 在线精品视频一区| 国产精品字幕| 欧美成人精品午夜一区二区| 影院欧美亚洲| 日韩欧美一区二区三区在线观看 | 国产成人免费精品| 美国三级日本三级久久99| 国产一区二区三区四区五区传媒| 免费观看在线综合色| 久久九九99| 国内不卡的一区二区三区中文字幕| 亚洲精选91| 国产综合精品| 韩国精品主播一区二区在线观看| 国产精品一级| 日韩精品亚洲专区在线观看| 欧美不卡高清| 色婷婷久久久| 电影91久久久| 国产一卡不卡| 日韩精品a在线观看91| 视频一区二区中文字幕| 亚洲精品a级片| 99精品视频在线| 成人精品高清在线视频| 国产精品日韩精品中文字幕| 亚洲人成网77777色在线播放| 激情欧美一区| 91精品国产乱码久久久久久久 | 日韩精品午夜视频| 蜜臀a∨国产成人精品| 亚洲精品一区二区妖精| 蜜臀久久精品| 秋霞影视一区二区三区| 日韩精品中文字幕第1页| 国产一区二区三区不卡av| 久久精品一本| 精品精品久久| 综合日韩av| 日韩精品一卡| 日韩中文欧美| 欧美日韩黑人| 夜久久久久久| 中文字幕日韩高清在线| 日韩三区四区| 国产日韩1区| 精品国产午夜肉伦伦影院| 国产精品丝袜在线播放| 国产精品九九| 精品久久网站| 香蕉视频亚洲一级| 九九久久婷婷| 免费国产自线拍一欧美视频| 国产精品免费看| 综合一区在线| 人人爱人人干婷婷丁香亚洲| 国产精品探花在线观看| 精品中文在线| 久久国产日本精品| 国产一级久久| 日韩高清在线观看一区二区| 国产乱码精品一区二区亚洲| 欧美激情福利| 中文字幕人成乱码在线观看| 欧美亚洲国产激情| 日韩在线一二三区| 欧美一区自拍| 日韩国产欧美| 免费在线观看不卡| 国产欧美日韩影院| 亚洲黄色免费av| 亚洲神马久久| 国产视频一区二| 日韩不卡在线| 亚洲精品伊人| 精品国产麻豆| 欧美中文字幕| 久久99性xxx老妇胖精品| 91综合视频| 蜜臀久久久久久久| 久久精品一区二区三区中文字幕| 中文在线免费视频| 中文字幕日本一区二区| 欧美极品一区二区三区| 久久久久国产精品一区二区| 国产一级久久| 久久精品亚洲| 国产亚洲精品v| 麻豆成人综合网| 伊人成人网在线看| 欧美精品二区| 在线视频免费在线观看一区二区| 日本视频中文字幕一区二区三区| 精品福利久久久| 国产视频一区在线观看一区免费| 91精品日本| 蜜桃成人av| 国产精品一国产精品k频道56| 91精品一区二区三区综合| 日韩高清不卡在线| 群体交乱之放荡娇妻一区二区| 婷婷久久免费视频| 日韩中文影院| 欧美日韩午夜| 欧洲激情综合| 国产一区二区三区网| 亚洲另类视频| 久久九九99| 免费一区二区三区在线视频| 免费看黄色91| 久久天堂精品| 欧美aa在线视频| 免费成人av在线播放| 色老板在线视频一区二区| **爰片久久毛片| 麻豆精品网站| 亚洲黑丝一区二区| 成人在线视频中文字幕| 日韩高清在线不卡| 夜夜精品视频| 亚洲电影有码| 国产精品成人**免费视频| 欧美在线资源| 日韩免费在线| 麻豆精品在线观看| 日本vs亚洲vs韩国一区三区二区| 欧美成人久久| 欧美aa在线观看| 久久精品国产一区二区| 日本少妇一区二区| 免费成人av在线播放| 一区二区三区四区在线看| 国产在线观看91一区二区三区| 日韩精品三级| 美女久久一区| 伊人久久婷婷| 亚洲精品成人| 亚洲www啪成人一区二区| 久久一区欧美| 欧美国产先锋| 国产精品www.| 麻豆精品蜜桃视频网站| 国产精品亚洲欧美一级在线| 日韩福利视频导航| 日韩精品一区二区三区中文在线 | 中文精品在线| 欧美福利一区| 亚洲第一区色| 久久国产中文字幕| 天堂资源在线亚洲| 不卡中文一二三区|