這篇文章主要介紹“怎么用SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證”,在日常操作中,相信很多人在怎么用SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
在遷西等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,遷西網(wǎng)站建設(shè)費(fèi)用合理。
Spring Security是一個功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,Spring Security主要做兩個事情,認(rèn)證、授權(quán)。我之前寫過一篇關(guān)于SpringSecurity的博客,但是當(dāng)時只是介紹了基于mock數(shù)據(jù)的案例,本期就來介紹一下基于真實(shí)數(shù)據(jù)的認(rèn)證授權(quán)實(shí)現(xiàn)。
為了更好的展示SpringSecurity,我們先搭建一個簡單的web項(xiàng)目出來。引入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> <h3>登陸頁</h3> <input type="text" id="username" placeholder="username"> <input type="password" id="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> <h3>首頁</h3> <a href="/login">登陸</a> <div > <div > <h4>level1</h4> <a href="/level1/1">level-1-1</a> <hr> <a href="/level1/2">level-1-2</a> </div> <div > <h4>level2</h4> <a href="/level2/1">level-2-1</a> <hr> <a href="/level2/2">level-2-2</a> </div> <div > <h4>level3</h4> <a href="/level3/1">level-3-1</a> <hr> <a href="/level3/2">level-3-2</a> </div> </div> </div> </body> </html>
另外還有幾個不同等級的頁面
分別在body中寫上自己對應(yīng)的編號。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> level-1-1 </body> </html>
最后編寫一個controller來接收請求:
@Controller
public 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;
}
}最終的效果如下:
最終實(shí)現(xiàn)等級不同的level頁面根據(jù)不同權(quán)限進(jìn)行跳轉(zhuǎn)。

后臺基于Mybatis和MySQL數(shù)據(jù)庫實(shí)現(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-8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml
認(rèn)證和授權(quán)在表設(shè)計(jì)上應(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;
接下來是針對這三張表的實(shí)體類,Mapper接口以及xml文件,你可以不看代碼,主要實(shí)現(xiàn)一個通過用戶名查找用戶以及相關(guān)權(quán)限的操作:
@Data
public class Roles {
private Integer id;
private String roleName;
}
@Data
public 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實(shí)現(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 id="userMap" 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 id="getUserByUserName" parameterType="String" resultMap="userMap">
select sysuser.*,roles.rolename
from sysuser
LEFT JOIN user_role on sysuser.id= user_role.user_id
LEFT JOIN roles on user_role.role_id=roles.id
where username= #{userName}
</select>
</mapper>SpringSecurity的認(rèn)證過程是這樣的,首先通過用戶名或者其他唯一的ID在數(shù)據(jù)庫里找到這個用戶,用戶的密碼以非對稱加密的方式存儲。取到用戶后將前臺傳入的密碼加密后和數(shù)據(jù)庫中已經(jīng)加密好的字段進(jìn)行對比,從而通過認(rèn)證。
上面這個過程中的第一步通過用戶名找到用戶的操作需要通過Service服務(wù)來實(shí)現(xiàn),并且這個Service服務(wù)需要繼承SpringSecurity中的UserDetailsService接口。這個接口返回一個SpringSecurity的User對象。
@Service
public 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("用戶未找到");
}
}上面的步驟都完成后就開始配置Security了,寫一個配置方法SecurityConfig,代碼層面很簡單,認(rèn)證傳入userService對象,會自動把數(shù)據(jù)庫中取出的密碼和前端傳過來的密碼進(jìn)行對照。同時在userService中還傳入了roles集合,在授權(quán)處給不同的頁面附上不同的權(quán)限即可。
@EnableWebSecurity
public 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)限默認(rèn)跳到登陸頁,默認(rèn)會重定向到/login
http.formLogin();
}
//認(rèn)證
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());
}
}我在認(rèn)證的時候使用的密碼加密方式是BCryptPasswordEncoder,因此存入數(shù)據(jù)庫中的密碼也需要被加密,常用的方式就是在注冊時通過同樣的方式對密碼進(jìn)行加密存入數(shù)據(jù)庫中:
String password="xxx"; BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encode=bCryptPasswordEncoder.encode(password);
到此,關(guān)于“怎么用SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
當(dāng)前名稱:怎么用SpringBoot+SpringSecurity實(shí)現(xiàn)基于真實(shí)數(shù)據(jù)的授權(quán)認(rèn)證
文章出自:http://chinadenli.net/article44/ggjgee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、服務(wù)器托管、域名注冊、網(wǎng)站改版、企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)