SpringSecurity授權(quán)實(shí)現(xiàn)基本思路
一、授權(quán)基本思路
在SpringSecurity中,會(huì)使用默認(rèn)的FilterSecurityInterceptor來(lái)進(jìn)行權(quán)限校驗(yàn)。在 FilterSecurityInterceptor中會(huì)從SecurityContextHolder獲取其中的Authentication,然后獲取其中的 權(quán)限信息。當(dāng)前用戶是否擁有訪問(wèn)當(dāng)前資源所需的權(quán)限。
所以我們?cè)陧?xiàng)目中只需要把當(dāng)前登錄用戶的權(quán)限信息也存入Authentication。然后設(shè)置我們的資源所需 要的權(quán)限即可
二、實(shí)現(xiàn)過(guò)程
(1)開(kāi)啟相關(guān)配置
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig{
.....
}然后就可以使用對(duì)應(yīng)的注解。@PreAuthorize在各接口
@RestController
public class HelloController {
@RequestMapping("/hello")
@PreAuthorize("hasAuthority('test')")
public String hello(){
return "hello";
}
}(2)自定義LoginUser,封裝權(quán)限信息
我們之前定義了UserDetails的實(shí)現(xiàn)類LoginUser,想要讓其能封裝權(quán)限信息就要對(duì)其進(jìn)行修改。
@Data
@NoArgsConstructor
public class LoginUser implements UserDetails{
private User user;
//查詢到的權(quán)限列表
private List<String> list;
public LoginUser(User user, List<String> list) {
this.list = list;
this.user = user;
}
//自定義一個(gè)權(quán)限列表的集合 中轉(zhuǎn)操作
@JSONField(serialize = false)
List<SimpleGrantedAuthority> authorities;
//返回權(quán)限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
if (authorities != null) {
return authorities;
}
authorities = new ArrayList<>();
for (String item : list) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(item);
authorities.add(authority);
}
return authorities;
}
//獲取密碼
@Override
public String getPassword() {
return user.getPassword();
}
//獲取用戶名
@Override
public String getUsername() {
return user.getUserName();
}
//判斷賬號(hào)是否未過(guò)期
@Override
public boolean isAccountNonExpired() {
return true;
}
//判斷賬號(hào)是否沒(méi)有鎖定
@Override
public boolean isAccountNonLocked() {
return true;
}
//判斷賬號(hào)是否沒(méi)有超時(shí)
@Override
public boolean isCredentialsNonExpired() {
return true;
}
//判斷賬號(hào)是否可用
@Override
public boolean isEnabled() {
return true;
}
}(3)從數(shù)據(jù)庫(kù)查詢權(quán)限信息
RBAC模型
我們可以在UserDetailsServiceImpl中去調(diào)用該mapper的方法查詢權(quán)限信息封裝到LoginUser對(duì)象 中即可。
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Autowired
private MenuMapper menuMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1.查詢用戶信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", username);
User user = userMapper.selectOne(queryWrapper);
//如果沒(méi)有查詢到用戶,就拋出異常
if (Objects.isNull(user)) {
throw new RuntimeException("用戶名或密碼錯(cuò)誤");
}
//2.查詢用戶對(duì)應(yīng)的權(quán)限信息
// List<String> list = new ArrayList<>();
// list.add("select");
// list.add("delete");
List<String> list = menuMapper.selectPermsByUserId(user.getId());
//3.返回UserDetails對(duì)象
return new LoginUser(user, list);
}
}到此這篇關(guān)于SpringSecurity授權(quán)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringSecurity授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis plus結(jié)合springboot使用
本文主要介紹了MyBatisPlus使用SpringBoot數(shù)據(jù)庫(kù)操作,從添加依賴到測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
SpringBoot+MyBatisPlus中樂(lè)觀鎖的實(shí)現(xiàn)示例
樂(lè)觀鎖是一種用于解決并發(fā)沖突的機(jī)制,在數(shù)據(jù)庫(kù)中用于保護(hù)數(shù)據(jù)的一致性,本文主要介紹了SpringBoot+MyBatisPlus中樂(lè)觀鎖的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP軟件遠(yuǎn)程窗口實(shí)現(xiàn)(6)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP軟件遠(yuǎn)程窗口的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
基于Java的電梯系統(tǒng)實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了基于Java的電梯系統(tǒng)實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java中new與clone操作對(duì)象的比較方法舉例
這篇文章主要給大家介紹了關(guān)于Java中new與clone操作對(duì)象的比較方法,在java中對(duì)象的誕生是我們開(kāi)發(fā)人員new出來(lái)的,對(duì)象的使用也是我們開(kāi)發(fā)人員進(jìn)行操作的,需要的朋友可以參考下2024-07-07
java內(nèi)存泄漏與內(nèi)存溢出關(guān)系解析
這篇文章主要介紹了java內(nèi)存泄漏與內(nèi)存溢出關(guān)系解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

